根据文本语料库中的出现列出词汇表中的单词,使用 Scikit-Learn CountVectorizer
Posted
技术标签:
【中文标题】根据文本语料库中的出现列出词汇表中的单词,使用 Scikit-Learn CountVectorizer【英文标题】:List the words in a vocabulary according to occurrence in a text corpus, with Scikit-Learn CountVectorizer 【发布时间】:2013-04-11 06:38:04 【问题描述】:我已经为scikit-learn
中的一些文档添加了CountVectorizer
。我想在文本语料库中查看所有术语及其对应的频率,以便选择停用词。例如
'and' 123 times, 'to' 100 times, 'for' 90 times, ... and so on
这个有内置函数吗?
【问题讨论】:
【参考方案1】:没有内置的。我基于Ando Saabas's answer找到了一种更快的方法:
from sklearn.feature_extraction.text import CountVectorizer
texts = ["Hello world", "Python makes a better world"]
vec = CountVectorizer().fit(texts)
bag_of_words = vec.transform(texts)
sum_words = bag_of_words.sum(axis=0)
words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]
sorted(words_freq, key = lambda x: x[1], reverse=True)
输出
[('world', 2), ('python', 1), ('hello', 1), ('better', 1), ('makes', 1)]
【讨论】:
【参考方案2】:如果cv
是你的CountVectorizer
而X
是向量化语料库,那么
zip(cv.get_feature_names(),
np.asarray(X.sum(axis=0)).ravel())
返回CountVectorizer
提取的语料库中每个不同术语的(term, frequency)
对列表。
(需要小asarray
+ ravel
跳舞来解决scipy.sparse
中的一些怪癖。)
【讨论】:
谢谢!但是它们没有排序,但我设法做到了:对于排序中的元组(occ_list,key=lambda idx: idx[1]):打印元组 [0] +''+ str(元组 [1])。问题是字符 åäö 没有打印出来。我已将编码设置为 utf8。 您还确定 get_feature_names() 将根据术语频率矩阵中的索引对术语进行排序吗?我发现 cv.get_feature_names() 和 cv.vocabulary_.keys() 没有相同的顺序。 @user1506145:dict.keys
不保证任何订单;这正是get_feature_names
存在的原因。
很抱歉把这个话题扯远了,但是你如何从一个简单的字符串中创建一个矢量化语料库 X
,例如“这是我们将创建一个的例子。”以上是关于根据文本语料库中的出现列出词汇表中的单词,使用 Scikit-Learn CountVectorizer的主要内容,如果未能解决你的问题,请参考以下文章