2017-04-01 151 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

相關問題