【发布时间】:2016-08-16 11:42:23
【问题描述】:
我正在尝试使用 scikit-learn 中的 TfIDFVectorizer 类来获取与某些文档不同的单词。它创建了一个 tfidf 矩阵,其中包含所有文档中的所有单词及其分数,但它似乎也计算了常见单词。这是我正在运行的一些代码:
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc['Adam'])
s[s > 0].sort_values(ascending=False)[:10]
我希望这会返回文档“Adam”的独特单词列表,但它的作用是返回常用单词列表:
and 0.497077
to 0.387147
the 0.316648
of 0.298724
in 0.186404
with 0.144583
his 0.140998
我可能不完全理解它,但据我了解,tf-idf 应该在语料库中查找与一个文档不同的单词,查找在一个文档中频繁出现但在其他文档中不出现的单词。这里,and 经常出现在其他文档中,所以我不知道为什么它在这里返回了很高的值。
我用来生成它的完整代码是in this Jupyter notebook。
当我半手动计算 tf/idfs 时,使用 NLTK 并计算每个单词的分数,我得到了适当的结果。对于“亚当”文档:
fresh 0.000813
prime 0.000813
bone 0.000677
relate 0.000677
blame 0.000677
enough 0.000677
这看起来是对的,因为这些词出现在“亚当”文档中,但在语料库的其他文档中没有那么多。用于生成它的完整代码在this Jupyter notebook 中。
我的 scikit 代码有问题吗?有没有另一种方法来初始化这个类,它返回正确的结果?当然,我可以通过stop_words = 'english' 忽略停用词,但这并不能真正解决问题,因为任何类型的常用词在这里都不应该有高分。
【问题讨论】:
标签: python nlp scikit-learn