TfIdf矢量化器返回缺少单词的正值

时间:2018-04-27 21:11:44

标签: pandas scikit-learn tf-idf

我在sklearn中使用TfIdf矢量化器来矢量化语料库。语料库很大,但数据或多或少看起来像这样:

index speaker text
1     Bob     'this is sample text'
2     Dick    'also some sample words but different ones'
3     Jane    'stuff goes here that did not go above'
4     Mary    'my name is mary and my text is not being analyzed'

我想找到前三个发言者的发言人的TfIdf值如何分解。所以我有:

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer(stop_words=stemmed_stops)
word_vec = vec.fit_transform(df.loc[['Bob', 'Dick', 'Jane'], 'text'])

在对文集进行矢量化之后,我创建了一个数据框,其中包含T列的值,其列是词汇表:

speaker_vocab = pd.DataFrame(word_vec.toarray(), index=['Bob', 'Dick', 'Jane'], columns = vec.vocabulary_)

这给出了一个如下所示的数据框:

    this  sample   that  my  text ...
Bob  0.5    0.3  0.0   0.0   0.5

问题在于,从不使用某些术语的发言者获得这些术语的正TfIdf值。例如,如果我看一下Jane的话,我会得到:

In: df.loc['Jane'].sort_values(ascending=False)
Out:
sample 0.32
goes .14
text .11

这似乎发生在所有发言者身上,并且单词是积极的,从未出现在他们的行中。正值不同,但它们仍然是正面的。

一般情况下,矢量化器是否会为不在同一个扬声器行中的单词返回正值?

1 个答案:

答案 0 :(得分:1)

您正在使用

中的列param错误
speaker_vocab = pd.DataFrame(word_vec.toarray(), 
                             index=['Bob', 'Dick', 'Jane'], 
                             columns = vec.vocabulary_)

根据documentation

  

词汇_:dict

A mapping of terms to feature indices.

Dicts可以按任意顺序返回项目。因此,此dict可能(将)不会给出与word_vec中返回的数据相同顺序的名称。

要按照确切的顺序获取名称,请使用vec.get_feature_names()

speaker_vocab = pd.DataFrame(word_vec.toarray(), 
                             index=['Bob', 'Dick', 'Jane'], 
                             columns = vec.get_feature_names())

之后您将获得正确的输出。

speaker_vocab.loc['Jane'].sort_values(ascending=False)

#Output:
stuff        0.5
goes         0.5
go           0.5
above        0.5
words        0.0
this         0.0
text         0.0
sample       0.0
ones         0.0