1. 程式人生 > >文字相似度演算法

文字相似度演算法

在向量空間模型中,文字泛指各種機器可讀的記錄。用D(Document)表示,特徵項(Term,用t表示)是指出現在文件D中且能夠代表該文件內容的基本語言單位,主要是由詞或者短語構成,文字可以用特徵項集表示為D(T1,T2,…,Tn),其中Tk是特徵項,1<=k<=N。例如一篇文件中有a、b、c、d四個特徵項,那麼這篇文件就可以表示為D(a,b,c,d)。對含有n個特徵項的文字而言,通常會給每個特徵項賦予一定的權重表示其重要程度。即D=D(T1,W1;T2,W2;…,Tn,Wn),簡記為D=D(W1,W2,…,Wn),我們把它叫做文字D的向量表示。其中Wk是Tk的權重,1<=k<=N。在上面那個例子中,假設a、b、c、d的權重分別為30,20,20,10,那麼該文字的向量表示為D(30,20,20,10)。在向量空間模型中,兩個文字D1和D2之間的內容相關度Sim(D1,D2)常用向量之間夾角的餘弦值表示,公式為:
餘弦公式略


其中,W1k、W2k分別表示文字D1和D2第K個特徵項的權值,1<=k<=N。
在自動歸類中,我們可以利用類似的方法來計算待歸類文件和某類目的相關度。例如文字D1的特徵項為a,b,c,d,權值分別為30,20,20,10,類目C1的特徵項為a,c,d,e,權值分別為40,30,20,10,則D1的向量表示為D1(30,20,20,10,0),C1的向量表示為C1(40,0,30,20,10),則根據上式計算出來的文字D1與類目C1相關度是0.86

那個相關度0.86是怎麼算出來的? 

是這樣的,拋開你的前面的贅述

在數學當中,n維向量是 V{v1, v2, v3, ..., vn}
他的模: |v| = sqrt ( v1*v1 + v2*v2 + ... + vn*vn )
兩個向量的點選 m*n = n1*m1 + n2*m2 + ...... + nn*mn
相似度 = (m*n) /(|m|*|n|)
物理意義就是兩個向量的空間夾角的餘弦數值
對於你的例子
d1*c1 = 30*40 + 20*0 + 20*30 + 10*20 + 0*10 = 2000
|d1| = sqrt(30*30 +20*20 + 20*20 + 10*10 + 0*0) = sqrt(1800)
|c1| = sqrt(40*40 + 0*0 + 30*30 + 20*20 + 10*10) = sqrt(3000)
相似度 = d1*c1/(|d1|*|c1|)= 2000/sqrt(1800*3000)= 0.86066

C#實現程式碼