基礎知識:看個人這篇文章向量相關分析基礎公式算法
最近在作nlp方面的工做,計算文字、句子或文章間的類似度,首先要作的是將文字轉爲向量,用到的方法有:直接法(如vsm)和網絡訓練法(如word2vec),而後就是計算向量間的類似度,能夠經過空間距離、向量夾角和相關性等方法來度量。如今,想用word2vec詞向量來計算兩個句子類似度,想法是:句子分詞,分詞後的詞向量相加做爲句子的語義向量,而後將兩個句子的語義向量進行類似度計算。(詞向量直接相加做爲語義會有些問題的,後面再介紹)網絡
計算兩個向量的類似度,首先想到的是計算兩個向量A,B的夾角餘弦。學習
由於,夾角爲兩個向量在空間上的角度,以直線爲例:夾角爲0~180,cos爲1~-1;兩個向量同方向cos=1,向量垂直cos=0,向量反方向cos=-1。spa
因此,能夠經過計算兩個向量的cos來做爲其類似度,越類似cos越接近1,越不類似cos越接近-1get
夾角公式:cos = <A,B> / (|A|*|B|),其中<>表明內積公式深度學習
A=[1,2,3,4]爲四維空間的點,也能夠說是四維空間上原點到該點構成的向量。io
另外一個反映兩個向量類似的統計量是相關係數R方,相關係數可以反映兩個向量波動過程是否一致。R方爲-1~1,越接近1表示兩個向量波動一致,越接近-1表示兩個向量波動老是相反,從這個角度來看也能反映兩個向量類似狀況。基礎
相關係數:R方 = cov(A,B)/(√v_A*√v_B),其中cov計算A,B協方差,v_A、v_B爲方差,√開根號model
如A=[1,2,3,4],B=[2,3,4,5]方法
相關係數=1,夾角cos=0.994
A,B單位化以下:相關係數和夾角都不變,模=1
他們相關係數=1,夾角cos=0.994,模=1
A,B標準化以下:相關係數不變,夾角會變,且cos=R方,模爲常數=√(向量長度)
他們相關係數=1,夾角cos=1,模=2
A,B先單位化再標準化:和直接標準化同樣
相關係數=1,夾角cos=1,模=2
A,B先標準化再單位化:實際上在標準化的基礎上/√(向量長度),由於模==√(向量長度)
相關係數=1,夾角cos=1,模=1
一點結論:兩個向量單位化,R方不變,夾角不變,cos=內積dot(A,B);兩個向量標準化,R方不變,夾角會變,此時cos==R方==dot()/向量長度,模相等爲常數=向量長度的開方。
好了,如今分析在句子語義上用哪個計算類似度比較好
在word2vec中對每一個詞向量的都進行了單位化(正則化),即每一個向量的平方和都爲1,但這樣會出現一個現象:訓練過程當中,常常出現的詞,它的詞向量常常獲得修正,形成向量波動較大,進化比較徹底,最後的方差會比較大,識別度更高。能夠驗證,訓練後的‘我’字方差比‘熵’字方差大不少,說明‘我’字語義更明確。在文本處理上,通常詞頻越少的詞出現了,說明其重要性更強,更多是關鍵詞(TF-IDF算法也是基於此),也能夠理解出現少的詞信息熵更大,然而,Word2vec詞向量的訓練上,並不能體現詞的重要性特徵。
這樣,若是用詞向量累加做爲一個句子向量來表明語義可能會存在一些問題:如‘個人熵’分詞後爲‘我’、‘的’、‘熵’,其中‘熵’詞向量訓練時進化較少,其方差較小,形成特徵不明顯,‘個人熵’與‘個人湯’夾角cos會接近1,但明顯‘熵’和‘湯’纔是這兩句的關鍵語義詞,並且語義相差甚遠;再如,‘我熵’和‘的熵’,因爲‘我’和‘的’向量cos較小約爲0.1,形成‘我熵’和‘的熵’cos約爲0.11。
所以,爲了使得不一樣頻率詞訓練後的特徵都比較明顯(方差能夠做爲詞向量語義權重的一個特徵),能夠對詞向量進行方差歸一化,使得每一個詞向量的波動都到一個量級上,而此時兩個向量的波動的方向性是否一致能夠做爲評判向量類似的準則,即用相關係數可能會更好一些。
驗證:
例1:‘我熵’ 和 ‘的熵’,語義向量類似度計算,(這裏事先用word2vec訓練好了字向量模型model)
沒標準化:A = model[‘我’]+model[‘熵’] ;B =model[‘的’]+modle[‘熵’];
==> cos(A,B) = 0.11407632486
標準化:A = zs(model[‘我’])+zs(model[‘熵’]) ;B =zs(model[‘的’])+zs(modle[‘熵’]);這裏zs表明向量標準化
==> R方 = cos(A,B) = 0.494148224949
由此,能獲得一個結論是:標準化後,‘我’ 和 ‘熵’ 的特徵重要程度變得差很少,去除了單位化後直接相加形成權重偏向一邊的問題。這裏有效的利用了word2vec詞向量的便捷性,有很好的解決了其中用於計算句子間類似度存在的問題。
例2:‘我熵’,在model中查找與(‘我’+‘熵’)最相近的字
沒標準化:V = model[‘我’]+model[‘熵’]
標準化:V = zs(model[‘我’])+zs(model[‘熵’])
能夠看到,不通過標準化,‘我熵’與‘熵’之間幾乎不相關;而通過標準化後,‘我’和‘熵’與‘我熵’的相關性同等重要。
其餘探討:
也能夠採用,提煉關鍵詞的方式,而後增長其權重,再進行向量加權和的方法來提升句子語義類似度計算,相似於深度學習中attention機制。
好了,就寫到這,之後想到了再繼續完善,也但願你們獲得更多思考。
ps : 我的原創,盜版必究,謝謝。