如何计算术语文档矩阵?

how to calculate term-document matrix?

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

我正在使用 sklearn 的 CountVectorizer 从字符串(文本文件)中提取特征以简化我的任务。下面的代码 returns 根据 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)

输出结果如下

I am not getting how this matrix has been calculated.please discuss the example shown in the code. I have read one more example from the Wikipedia但是看不懂

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() 的 shorthand,然后是 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,因此不会显示在您的图像中。