如何从文本数据中获取词袋?

20 投票
5 回答
45056 浏览
提问于 2025-04-17 19:39

我正在处理一个预测问题,使用的是一个很大的文本数据集。我正在实现一种叫做词袋模型的方法。

那么,获取词袋的最佳方法是什么呢?现在,我已经计算了各种单词的tf-idf值,但单词数量太多,无法用于后续的任务。如果我使用tf-idf标准,那么获取词袋时,tf-idf的阈值应该设定为多少呢?或者我应该使用其他算法吗?我正在使用Python。

5 个回答

5

袋装词模型是一种很不错的文本表示方法,可以用在不同的机器学习任务中。不过在开始之前,你需要先把数据清理干净,去掉一些不必要的东西,比如标点符号、HTML标签和一些常见的无意义词(比如“的”、“是”等)。为了完成这些清理工作,你可以使用一些现成的库,比如Beautiful Soup(用来去除HTML标记)或者NLTK(用来去除无意义词),这些都是Python中的工具。

清理完数据后,你需要创建一个向量特征(也就是把数据转化为数字形式,方便机器学习处理),这时候袋装词模型就派上用场了。scikit-learn有一个模块(feature_extraction模块),可以帮助你创建袋装词特征。

如果你想了解更多详细信息,可以查看这个教程,还有这个也非常有帮助。我觉得这两个资源都很实用。

18

词袋模型可以理解为一个矩阵,其中每一行代表一份文档,而每一列代表一个单独的词。还有一点要注意的是,文本的顺序并没有被保留。构建“词袋模型”主要有三个步骤:

  1. 分词
  2. 计数
  3. 归一化

需要注意的局限性有:

  1. 无法捕捉短语或多个词组合的意思
  2. 对拼写错误很敏感,可以通过拼写校正工具或字符表示来解决这个问题

例如:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
data_corpus = ["John likes to watch movies. Mary likes movies too.", 
"John also likes to watch football games."]
X = vectorizer.fit_transform(data_corpus) 
print(X.toarray())
print(vectorizer.get_feature_names())
30

使用 collections.Counter 类

>>> import collections, re
>>> texts = ['John likes to watch movies. Mary likes too.',
             'John also likes to watch football games.']
>>> bagsofwords = [collections.Counter(re.findall(r'\w+', txt))
                   for txt in texts]
>>> bagsofwords[0]
Counter({'likes': 2, 'watch': 1, 'Mary': 1, 'movies': 1, 'John': 1, 'to': 1, 'too': 1})
>>> bagsofwords[1]
Counter({'watch': 1, 'games': 1, 'to': 1, 'likes': 1, 'also': 1, 'John': 1, 'football': 1})
>>> sumbags = sum(bagsofwords, collections.Counter())
>>> sumbags
Counter({'likes': 3, 'watch': 2, 'John': 2, 'to': 2, 'games': 1, 'football': 1, 'Mary': 1, 'movies': 1, 'also': 1, 'too': 1})
>>> 

撰写回答