北太天元學(xué)習(xí)43-文本分析之詞頻-逆文檔頻率
我們搜集了很多文檔,把這些文檔作為一個(gè)集合來(lái)研究。 我們確定了一批單詞(這些單詞可以是把這些文檔的所有的不同的單詞都找出來(lái),然后剔除到一些意義不大的單詞之后得到的), 然后就得到了 文檔-單詞 矩陣, 每一行表示一個(gè)文檔(每一行的文檔兩兩不同),每一列表示一個(gè)單詞(每一列的單詞兩兩不同), 文檔i中單詞j中出現(xiàn)的次數(shù) 是矩陣的(i,j) 元, 例如
???? ? ? ? ? ? 單詞1????? 單詞2?? 單詞3
文檔1??????? 0???????????? 2?????????? 3
文檔2????? 1????????????? 0??????????? 1
這個(gè)文檔-單詞矩陣表示? 單詞1 在文檔1 中出現(xiàn)了0 次, 在文檔2 中出現(xiàn)了1次, 那么我們可以看到,在我們搜索的搜有文檔中,文檔1中單詞1出現(xiàn)了0次,單詞2出現(xiàn)了2次,單詞3出現(xiàn)了3次,? 其中在文檔1中單詞1出現(xiàn)的次數(shù)占比是 0/5,? 單詞2出現(xiàn)的次數(shù)占比是 2/5,? 單詞3總出現(xiàn)的次數(shù)占比是 3/5,?? 我們我們就定義 文檔1中單詞1 , 2, 3 的詞頻是 0/5, 2/5, 3/5 。 類似的,我們可以得到文檔2 單詞 1 2 3? 的詞頻, 這樣我們就得到了詞頻矩陣
詞頻(term frequency)矩陣(有時(shí)候就簡(jiǎn)稱為詞頻了)
???? ? ? ? ? ? 單詞1???? ?? 單詞2? ? ?? 單詞3
文檔1??????? 0/5 ??????????? 2/5 ????????? 3/5
文檔2????? 1 /2 ??????????? 0/2 ?????????? 1/2
matrix_tf = [ 0/5 ??????????? 2/5 ????????? 3/5;
???????????????????? 1 /2 ??????????? 0/2 ?????????? 1/2 ];
北太天元命令行窗口輸入matrix_tf

單詞3 在文檔1 中的詞頻是3/5,比單詞2在文檔1中的詞頻2/5高,我們應(yīng)該覺(jué)得單詞3更能體現(xiàn)文檔3的特色,因此單詞應(yīng)該對(duì)文章1的重要性更大,但是我們又觀察到單詞3在文檔2中的詞頻是 1/2, 而單詞2在文檔2的詞頻是0/2,? 那么我們又會(huì)猜測(cè) 單詞3可能是個(gè)常用單詞,在很多文檔中都會(huì)出現(xiàn),因此它對(duì)一個(gè)文章的重要性不是那么大,而單詞2僅僅在文檔1中出現(xiàn),它對(duì)文檔1的重要性可能應(yīng)該更大。于是我們就引入了逆文檔頻率(inverse document freqency):
單詞3 的 逆文檔頻率可以定義成:
?????????? idf_3? =? log(??? 文檔總數(shù) / 包含單詞3的文檔數(shù) )
針對(duì)我們上面這個(gè)例子,文檔總數(shù)是2,包含單詞3的文檔總數(shù)也是2, 因此,
????? idf_3? =? log( 2/ 2 ) = 0
類似的,我們可以得到單詞1 的逆文檔頻率是
??? idf_1 = log( 2/ 1 )
類似的,我們可以得到單詞2的逆文檔頻率是
???? idf_2 = log(2/1)
逆文檔頻率矩陣是一個(gè) 1x3 的矩陣
? matrix_idf? =? [?? log(2/1), log(2/1), log(2/2) ]
這里的 diag(matrix_idf) 是從1x3的向量構(gòu)造一個(gè)3x3的對(duì)角陣, 看北太天元的執(zhí)行結(jié)果

最后,我們得到的 tf-idf 矩陣是
matrix_tf_idf =? matrix_tf? * diag( matrix_idf )

matrix_tf 乘以一個(gè)對(duì)角矩陣,相當(dāng)于每一列乘以對(duì)角矩陣相應(yīng)的對(duì)角元,? 本來(lái) matrix_tf 的第3列的元素都很大,但是乘以第個(gè)單詞的逆文檔頻率0之后,在 tf-idf 矩陣中第三個(gè)單詞的重要性一下子下降到0 了。
下面是完整的計(jì)算tf-idf矩陣的北太天元代碼,包括函數(shù) tfidf 和兩個(gè)子函數(shù) tf, idf
新建一個(gè)文件 tfidf.m?? 把下面的代碼copy 到tfidf.m 中,一個(gè)調(diào)用的例子可以是
X = [ ?0 ? 0 ? 1 ? 2 ? 1; 1 ? 0 ? 1 ? 0 ? 1; ?2 ? 1 ? 0 ? 0 ? 0; 0 ? 1 ? 1 ? 0 ? 0; 0 ? 1 ? 0 ? 2 ? 3; ?0 ? 1 ? 0 ? 0 ? 1 ]
Y = tfidf(X)
得到如下圖的運(yùn)行結(jié)果

%北太天元計(jì)算 tf-idf
% tf-idf(term frequency–inverse document frequency)
% tf-idf是一種統(tǒng)計(jì)方法,用以評(píng)估一個(gè)單詞對(duì)于一個(gè)文擋集或一個(gè)語(yǔ)料庫(kù)中的其中
%一份文檔的重要程度。單詞的重要性隨著它在一個(gè)文檔中出現(xiàn)的次數(shù)成正比增加,
% 但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降(如果這個(gè)單詞在所有的
% 文檔中都出現(xiàn),那么它就不重要,例如the 這個(gè)冠詞。)。
% tf是詞頻(Term Frequency),
%idf是逆文檔頻率(Inverse Document Frequency)。
%
% 函數(shù) 計(jì)算TF-IDF
%
% ? Y = tfidf( X );
%
% 輸入:
% ? X ?- 文檔-單詞矩陣(每一行表示一個(gè)文檔,每一列表示一個(gè)單詞)
% ? ? ? X(i,j) 表示文檔i中單詞j出現(xiàn)的次數(shù)
%
% 輸出:
% ? Y ? ? ? ?- tf-idf 文檔-單詞矩陣(每一行表示一個(gè)文檔,每一列表示
% ? ? ? ? ?一個(gè)單詞, Y(i,j) 表示文檔i 中單詞j 的 tf-idf
% 例如: 我么通過(guò)處理6個(gè)文檔,只考慮5個(gè)單詞,然后得到文檔-單詞矩陣如下:
% X = [ ?0 ? 0 ? 1 ? 2 ? 1; 1 ? 0 ? 1 ? 0 ? 1; ?2 ? 1 ? 0 ? 0 ? 0; 0 ? 1 ? 1 ? 0 ? 0; 0 ? 1 ? 0 ? 2 ? 3; ?0 ? 1 ? 0 ? 0 ? 1 ]
%? Y = tfidf(X)
function Y = tfidf( X )
% 獲得詞頻
X = tf(X);
% 獲得逆文檔頻率
I = idf(X);
% 詞頻(tf) 乘以 這個(gè)單詞的逆文檔頻率(idf)
Y = X* diag( I );
end
function X = tf(X)
% ?子函數(shù)-計(jì)算詞頻
% 對(duì)于每一個(gè)文檔
for i=1:size(X, 1)
%對(duì)于第i個(gè)文檔,所有單詞出現(xiàn)的次數(shù)組成的向量
x = X(i, :);
% 在文檔i中單詞次數(shù)都加起來(lái)
sumX = sum( x );
% 計(jì)算單詞i出現(xiàn)的頻率
if sumX ~= 0
X(i, :) = x / sumX;
else
% 避免0作除數(shù)
X(i, :) = 0;
end
end
end
function I = idf(X)
% 子函數(shù) 計(jì)算 逆文檔頻率
% m - 文檔個(gè)數(shù)
% n - 單詞個(gè)數(shù)
[m, n]=size(X);
% 預(yù)先為逆文檔頻率分配分配存儲(chǔ)
I = zeros(1,n);
% 對(duì)于每一個(gè)單詞
for j=1:n
%統(tǒng)計(jì)出現(xiàn)單詞j的文檔的個(gè)數(shù)
nz = nnz( X(:, j) ); % nnz 得到的是矩陣的非零元的個(gè)數(shù)
% 如果nz不是0,那么計(jì)算一個(gè)權(quán)重作為逆文檔評(píng)率
if nz
I(j) = log( m / nz );
end
end
end