如何计算词项-文档矩阵?

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)

输出如下:
Output
我不明白这个矩阵是如何计算的,请讨论代码中所示的例子。我已经阅读了来自Wikipedia的另一个例子,但是无法理解。
1个回答

6
CountVectorizer().fit_transform()的输出是一个稀疏矩阵。这意味着它只会存储矩阵中非零的元素。当你执行print(X)时,只有非零条目被显示,就像你在图片中观察到的那样。
至于计算方式,你可以在官方文档中查看。 CountVectorizer在默认配置下,对给定的文档或原始文本进行标记化(只取其中长度大于等于2的单词)并计算单词出现次数。
基本上,步骤如下:
1. Step1 - 从fit()中存在的所有文档中收集所有不同的术语。 对于你的数据,它们是 [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to'] 这可以通过vectorizer.get_feature_names()获得。
2. Step2 - 在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)图片中,第一列表示术语频率矩阵的索引,第二列表示该术语的频率。 <0,0>意味着第一行,第一列,即第一个单词“disk”的频率在第一个文档中为1。 <0,2>意味着第一行,第三列,即第三个单词“hard”的频率在第一个文档中为1。 <0,5>意味着第一行,第六列,即第六个单词“problems”的频率在第一个文档中为0。但由于它为0,因此未在您的图像中显示。

你能告诉我这行代码是如何工作的吗:'sp.linalg.norm(X_train.getrow(0).toarray())',其中sp是'import scipy as sp',而norm()的参数结果是[[1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1]]。 - log0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接