如何从文本数据中获取词袋?
5 个回答
5
袋装词模型是一种很不错的文本表示方法,可以用在不同的机器学习任务中。不过在开始之前,你需要先把数据清理干净,去掉一些不必要的东西,比如标点符号、HTML标签和一些常见的无意义词(比如“的”、“是”等)。为了完成这些清理工作,你可以使用一些现成的库,比如Beautiful Soup(用来去除HTML标记)或者NLTK(用来去除无意义词),这些都是Python中的工具。
清理完数据后,你需要创建一个向量特征(也就是把数据转化为数字形式,方便机器学习处理),这时候袋装词模型就派上用场了。scikit-learn有一个模块(feature_extraction模块),可以帮助你创建袋装词特征。
18
词袋模型可以理解为一个矩阵,其中每一行代表一份文档,而每一列代表一个单独的词。还有一点要注意的是,文本的顺序并没有被保留。构建“词袋模型”主要有三个步骤:
- 分词
- 计数
- 归一化
需要注意的局限性有:
- 无法捕捉短语或多个词组合的意思
- 对拼写错误很敏感,可以通过拼写校正工具或字符表示来解决这个问题
例如:
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
>>> 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})
>>>