我知道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)
输出如下左下我没有得到如何计算这个矩阵。请讨论代码中显示的例子。我已经阅读了Wikipedia中的另一个例子,但无法理解。
答案 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,所以它不会显示在您的图像中。