2017-04-01 247 views
2

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

我正在使用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
我没有得到如何矩阵已经calculated.please讨论的代码所示的例子返回一个术语文档矩阵。我已经阅读了Wikipedia的一个例子,但无法理解。

回答

4

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

至于如何计算完成,你可以看看official documentation here

CountVectorizer在其默认配置中,将给定的文档或原始文本(只包含其中包含2个或更多字符的词)标记为标记并统计单词出现次数。

基本上,步骤如下:

  • 第一步 - 从所有存在于fit()文件收集所有不同的术语。

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

  • 第二步 - 在transform(),计数其存在于fit()输出它在术语频率在每个文档中的项数矩阵。 (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()得到上面的结果。

在您发布的印刷品(X)的图像中,第一列代表term-freq矩阵的索引,第二列代表该术语的频率。

<0,0>表示第一行,第一列i。第一文档中的术语"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,它不会显示在您的图像中。

+0

ThankYouSoMuch:D – zerobyzero

+0

你会告诉我这段代码是如何工作的:'sp.linalg.norm(X_train.getrow(0).toarray())'其中sp是'导入scipy as sp',结果norm()的参数为[[1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1]]。 – zerobyzero