如何计算期限文件矩阵?

时间:2017-04-01 07:23:28

标签: python scikit-learn scipy term-document-matrix

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

我正在使用 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)

输出如下左下Output我没有得到如何计算这个矩阵。请讨论代码中显示的例子。我已经阅读了Wikipedia中的另一个例子,但无法理解。

1 个答案:

答案 0 :(得分:6)

CountVectorizer().fit_transform()的输出是稀疏矩阵。这意味着它只存储矩阵的非零元素。执行print(X)时,只会在图像中显示非零条目。

至于如何进行计算,您可以查看official documentation here

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()的简写,然后是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)图像中,第一列表示term-freq矩阵的索引,第二列表示该术语的频率。

<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,所以它不会显示在您的图像中。