为什么从值计数输出的频率计数与计数向量化器不同?

时间:2019-03-27 17:17:49

标签: python pandas scikit-learn countvectorizer

我有一个数据框,其中有一列称为“短语”。我试图在本专栏中找到20个最常用的词。我使用以下代码执行此操作:

print(pd.Series(' '.join(film['Phrase']).lower().split()).value_counts()[:20])

这给了我以下输出:

s             16981
film           6689
movie          5905
nt             3970
one            3609
like           3071
story          2520
rrb            2438
lrb            2098
good           2043
characters     1882
much           1862
time           1747
comedy         1721
even           1597
little         1575
funny          1522
way            1511
life           1484
make           1396

我后来需要为每个单词创建向量计数。我使用以下代码来做到这一点:

vectorizer = CountVectorizer()
vectorizer.fit(film['Phrase'])
print(vectorizer.vocabulary_)

我不会显示整个输出,但是矢量计数与上面的输出不同。例如,“电影”一词是9308,“好”一词是6131,而“制造”一词是8655。为什么会这样?值计数方法是仅对使用该单词的每一列进行计数,而不是对单词的每次出现进行计数吗?我是否误解了CountVectorizer函数的作用?

2 个答案:

答案 0 :(得分:2)

vectorizer.vocabulary_不会返回,但根据文档显示:

  

术语到特征索引的映射

这意味着数据中的每个单词都映射到一个索引,该索引存储在vectorizer.vocabulary_中。

这里是一个例子,说明正在发生的事情:

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

df = pd.DataFrame({"a":["we love music","we love piano"]})

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['a'])
print(vectorizer.vocabulary_)

>>> {'we': 3, 'love': 0, 'music': 1, 'piano': 2}

此向量化可识别数据中的4个单词,并为每个单词分配从0到3的索引。现在,您可能会问:“但是,为什么我还要关心这些指数?”因为一旦向量化完成,您就需要跟踪向量化对象中单词的顺序。例如,

X.toarray()
>>> array([[1, 1, 0, 1],
           [1, 0, 1, 1]], dtype=int64)

因此,使用词汇词典,您可以知道第一列对应于“爱”,第二列对应于“音乐”,第三列对应于“钢琴”,第四列对应于“我们”。

请注意,这也与vectorizer.get_feature_names()中的单词顺序相对应

vectorizer.get_feature_names()
>>> ['love', 'music', 'piano', 'we']

答案 1 :(得分:2)

正如@MaximeKan所提到的,CountVectorizer()不会计算每个项的频率,但是我们可以从transform()的稀疏矩阵输出和get_feature_names()的{​​{1}}属性中计算出来。

vectorizer

工作示例:

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(film['Phrase'])
{x:y for x,y in zip(vectorizer.get_feature_names(), X.sum(0).getA1())}