根据文本语料库中的出现列出词汇表中的单词,使用 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 是你的CountVectorizerX 是向量化语料库,那么

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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单词的向量表示(从Word2Vec等获得)作为分类器的特征?

获得文本语料和词汇资源

计算给定单词在超过 10 亿个单词的文本语料库中出现的次数

Python3自然语言处理——获得文本语料库和词汇资源

NLP语料库

python 自然语言处理____词典资源