自然語言處理 | 文本相似度計算

文本是一種高維的語義空間,需要對其進行抽象分解,從而能夠從數學角度去量化其相似性。
距離度量的方式有多種多樣,但是一種相似度計算方式并不適用與所有的情況,需要根據不同的情況和數據類型進行選擇。

文本相似度計算的幾種方法

余弦相似度

余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小,余弦值越接近1,就表明夾角越接近0度,兩個向量越相似。
相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。
適合word2vec模型向量化的數據。


Python代碼實現:

def cosine_similarity(vector1, vector2):
    dot_product = 0.0
    normA = 0.0
    normB = 0.0
    for a, b in zip(vector1, vector2):
        dot_product += a * b
        normA += a ** 2
        normB += b ** 2
    if normA == 0.0 or normB == 0.0:
        return 0
    else:
        return round(dot_product / ((normA**0.5)*(normB**0.5)) * 100, 2)

或者

import numpy as np
def get_cossimi(x,y):
    myx=np.array(x)
    myy=np.array(y)
    cos1=np.sum(myx*myy)
    cos21=np.sqrt(sum(myy*myy))
    cos22=np.sqrt(sum(myx*myx))
    return (cos1/float(cos22*cos21))

曼哈頓距離(L1范數)

統計相同坐標軸上的距離的和。

歐式距離(L2范數)

歐氏距離是最常用的距離計算公式,衡量的是多維空間中各個點之間的絕對距離,當數據很稠密并且連續時,這是一種很好的計算方式。
因為計算是基于各維度特征的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,如在KNN中需要對特征進行歸一化。

def distance(vector1,vector2):
    d=0;
    for a,b in zip(vector1,vector2):
        d+=(a-b)**2;
    return d**0.5;

閔可夫斯基距離(Lp范數)

歐式距離和曼哈頓距離在形式上比較相近,其實它們都是閔可夫斯基距離的特殊化。閔可夫斯基距離適合TF-IDF向量化后的數據或者提煉出來的主題模型數據。

皮爾森相關系數(pearson)

皮爾森相關系數是衡量線性關聯性的程度。
兩個連續變量(X,Y)(X,Y)的pearson相關性系數PX,YPX,Y等于它們之間的協方差cov(X,Y)cov(X,Y)除以它們各自標準差的乘積σXσX,σYσY。系數的取值總是在-1.0到1.0之間,接近0的變量被成為無相關性,接近1或者-1被稱為具有強相關性。

from math import sqrt

def multipl(a,b):
    sumofab=0.0
    for i in range(len(a)):
        temp=a[i]*b[i]
        sumofab+=temp
    return sumofab

def corrcoef(x,y):
    n=len(x)
    #求和
    sum1=sum(x)
    sum2=sum(y)
    #求乘積之和
    sumofxy=multipl(x,y)
    #求平方和
    sumofx2 = sum([pow(i,2) for i in x])
    sumofy2 = sum([pow(j,2) for j in y])
    num=sumofxy-(float(sum1)*float(sum2)/n)
    #計算皮爾遜相關系數
    den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
    return num/den

Jaccard相似性系數

Jaccard(杰卡德)相似性系數主要用于計算兩個一元unary向量(buy or not, click or not)相似性的度量,或者用于集合sets相似性形式定義。若樣本間的特征屬性由符號和布爾值標識,無法衡量差異具體值的大小,只能獲得“是否相同”這樣一種結果,而Jaccard系數關心的是樣本間共同具有的特征。適合詞集模型向量化的數據。
Jaccard相似度沒有考慮評分的大小。

kl散度/相對熵/kl距離

相對熵(relative entropy)又稱為KL散度(Kullback–Leibler divergence,簡稱KLD)、信息散度(information divergence)、信息增益(information gain)。
KL散度是兩個概率分布P和Q差別的非對稱性的度量(designed to measure the difference between probability distributions),KL散度是用來度量使用基于Q的編碼來編碼來自P的樣本平均所需的額外的位元數。 典型情況下,P表示數據的真實分布,Q表示數據的理論分布,模型分布,或P的近似分布。

KL散度

DSSM算法

CNN-DSSM算法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容