4

我知道术语文档矩阵是一个数学矩阵,它描述了文档集合中出现的术语的频率。在文档-词条矩阵中,行对应于集合中的文档,列对应于词条。

我正在使用sklearn 的 CountVectorizer从字符串(文本文件)中提取特征以简化我的任务。以下代码根据sklearn_documentation返回一个术语文档矩阵

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
vectorizer = CountVectorizer(min_df=1)
print(vectorizer)
content = ["how to format my hard disk", "hard disk format problems"]
X = vectorizer.fit_transform(content) #X is Term-document matrix
print(X)

输出如下我没有得到这个矩阵是如何计算的。请讨论代码中显示的示例。我从维基百科上又读了一个例子,但无法理解。
输出

4

1 回答 1

6

a 的输出CountVectorizer().fit_transform()是一个稀疏矩阵。这意味着它将只存储矩阵的非零元素。当您这样做时print(X),仅显示非零条目,如您在图像中观察到的那样。

至于如何计算,可以看这里的官方文档

CountVectorizer其默认配置中,对给定的文档或原始文本进行标记(它将仅采用其中包含 2 个或更多字符的术语)并计算单词的出现次数。

基本上,步骤如下:

  • 第 1 步 - 从 中存在的所有文档中收集所有不同的术语fit()

    对于您的数据,它们 [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to']vectorizer.get_feature_names()

  • 第 2 步 - 在 中transform(),计算每个文档中出现在fit()输出中的词条数,这些词条出现在词频矩阵中。

    在您的情况下,您将两个文档都提供给 transform() (fit_transform()fit()then的简写transform())。所以,结果是

    [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to']

第一的 1 1 1 1 1 0 1

0 1 1 0 0 1 0

你可以通过调用得到上述结果X.toarray()

在您发布的 print(X) 图像中,第一列表示术语频率矩阵的索引,第二列表示该术语的频率。

<0,0>表示第一行,第一列,即"disk" (first term in our tokens)第一个文档中术语的频率 = 1

<0,2>表示第一行,第三列,即"hard" (third term in our tokens)第一个文档中术语的频率 = 1

<0,5>表示第一行,第六列,即"problems" (sixth term in our tokens)第一个文档中术语的频率 = 0。但由于它是 0,因此它不会显示在您的图像中。

于 2017-04-01T08:25:47.813 回答