??在目前的自然語言處理、數(shù)據(jù)挖掘以及機(jī)器學(xué)習(xí)中,相似性度量算法是一種比較常用的算法,是文本計(jì)算的基礎(chǔ)。相似性度量有助于幫助開發(fā)者發(fā)現(xiàn)數(shù)據(jù)關(guān)聯(lián)性,其核心點(diǎn)在于兩個(gè)方面:1.數(shù)據(jù)的特征表示。2. 集合之間的表示方法。
1. Jaccard相似系數(shù)
??Jaccard index, 又稱為Jaccard相似系數(shù)(Jaccard similarity coefficient),也稱之為雅可比相似度系數(shù),用于比較有限樣本集之間的相似性與差異性。Jaccard系數(shù)值越大,樣本相似度越高。
狹義的Jaccard相似系數(shù)
??狹義的Jaccard相似系數(shù)是通過兩組樣本直接的交集與總集之間的比值來度量,公式如下:
??當(dāng)集合A,B都為空時(shí),J(A,B)定義為1。根據(jù)上述公式,當(dāng)集合A和集合B兩者之間的交集越大時(shí),表明兩者之間的相似程度越高。特別的,當(dāng)集合A和集合B相同時(shí),J(A,B)為1。因此:
J(A,B)∈[0,1]
廣義的Jaccard相似系數(shù)
??廣義的Jaccard相似系數(shù)也稱作Tanimoto系數(shù),一般用EJ表示,公式如下:
??上述公式中的AB分別表示兩個(gè)向量,與俠義的Jaccrad中的元素為二值數(shù)據(jù)不同,廣義Jaccard可以使元素不僅是0或1,實(shí)質(zhì)是狹義Jaccard系數(shù)的擴(kuò)展。
2. 基于MinHash的相似性算法
??Minhash是一種基于Jaccard相關(guān)系數(shù)的快速對(duì)兩個(gè)幾個(gè)進(jìn)行相似性分析的方法。該算法起初主要用于在搜索引擎中的重復(fù)網(wǎng)頁檢測(cè),現(xiàn)在也大量應(yīng)用于解決大規(guī)模聚類問題。
??在采用Jaccard系數(shù)進(jìn)行相似度計(jì)算時(shí),需要計(jì)算兩個(gè)集合的交集和并集,在海量維度場景下,計(jì)算的時(shí)間和空間復(fù)雜度都非常巨大。而Minhash在Jaccard的基礎(chǔ)上可以起到很好的降維效果。
??采用Minhash可以起到很好的減少計(jì)算復(fù)雜度的作用,其基本原理為:對(duì)于兩個(gè)集合A,B,在集合A和集合B的并集中選取元素的概率等于Jaccard系數(shù)。例如對(duì)于集合A={a, b, c},集合B={b,c,d},集合A和B的合集為{a,b,c,d},集合A和B的交集為{b,c},集合A和集合B的Jaccard系數(shù)為:0.5,而從交集{b,c}中挑選任何一個(gè)元素的概率也為:0.5,即與Jaccard系數(shù)相等。
??關(guān)于MinHash,先定義幾個(gè)符號(hào)術(shù)語:
??h(x): 把x映射成一個(gè)整數(shù)的哈希函數(shù)。
??hmin(S):集合S中的元素經(jīng)過h(x)哈希后,具有最小哈希值的元素。
??那么對(duì)集合A、B,hmin(A) = hmin(B)成立的條件是A ∪ B 中具有最小哈希值的元素也在 A ∩ B中。這里有一個(gè)假設(shè),h(x)是一個(gè)良好的哈希函數(shù),它具有很好的均勻性,能夠把不同元素映射成不同的整數(shù)。所以有,Pr[hmin(A) = hmin(B)] = J(A,B),即集合A和B的相似度為集合A、B經(jīng)過hash后最小哈希值相等的概率。
??基于以上結(jié)論,我們便可以根據(jù)MinHash來計(jì)算兩個(gè)集合的相似度了。一般有兩種方法:
??1:使用多個(gè)hash函數(shù)
??為了計(jì)算集合A、B具有最小哈希值的概率,我們可以選擇一定數(shù)量的hash函數(shù),比如K個(gè)。然后用這K個(gè)hash函數(shù)分別對(duì)集合A、B求哈希值,對(duì)每個(gè)集合都得到K個(gè)最小值。比如Min(A)k={a1,a2,...,ak},Min(B)k={b1,b2,...,bk}。那么,集合A、B的相似度為|Min(A)k ∩ Min(B)k| / |Min(A)k ∪ Min(B)k|,即Min(A)k和Min(B)k中相同元素個(gè)數(shù)與總的元素個(gè)數(shù)的比例。
??2:使用單個(gè)hash函數(shù)
??第一種方法有一個(gè)很明顯的缺陷,那就是計(jì)算復(fù)雜度高。使用單個(gè)hash函數(shù)是怎么解決這個(gè)問題的呢?請(qǐng)看:前面我們定義過 hmin(S)為集合S中具有最小哈希值的一個(gè)元素,那么我們也可以定義hmink(S)為集合S中具有最小哈希值的K個(gè)元素。這樣一來我們就只需要對(duì)每個(gè)集合求一次哈希,然后取最小的K個(gè)元素。計(jì)算兩個(gè)集合A、B的相似度,就是集合A中最小的K個(gè)元素與集合B中最小的K個(gè)元素的交集個(gè)數(shù)與并集個(gè)數(shù)的比例。
3. 余弦相似度
??雖然MinHash減小了計(jì)算復(fù)雜度,但是實(shí)質(zhì)上,Jaccard的理論基礎(chǔ)支持還不夠,因?yàn)閮H僅依靠內(nèi)部屬性是否出現(xiàn)去判定兩者是否相似并不夠精準(zhǔn)。因此,產(chǎn)生了余弦相似度,它將屬性是否出現(xiàn)變更為屬性在樣本中的權(quán)重。余弦相似度是基于向量空間模型的算法,其關(guān)鍵字向量依賴于TF-IDF算法或者其他關(guān)鍵字提取算法。余弦相似度是通過計(jì)算兩個(gè)向量的夾角余弦值來評(píng)估他們的相似度。余弦相似度將向量根據(jù)坐標(biāo)值,繪制到向量空間中,如最常見的二維空間。
余弦相似度的計(jì)算公式如下:
??余弦值的范圍在[-1,1]之間,值越趨近于1,代表兩個(gè)向量的方向越接近;越趨近于-1,他們的方向越相反;接近于0,表示兩個(gè)向量近乎于正交。
??最常見的應(yīng)用就是計(jì)算文本相似度。將兩個(gè)文本根據(jù)他們?cè)~,建立兩個(gè)向量,計(jì)算這兩個(gè)向量的余弦值,就可以知道兩個(gè)文本在統(tǒng)計(jì)學(xué)方法中他們的相似度情況。實(shí)踐證明,這是一個(gè)非常有效的方法。
4.基于SimHsh的相似性算法
??SimHash是一種局部敏感的哈希算法那,可以理解為指紋碼,此類指紋碼不同于其他哈希算法對(duì)應(yīng)的指紋碼,指紋碼雖然幾乎唯一,但是SimHash可以使得相似的文本具有相似的哈希值。通過計(jì)算漢明距離,表達(dá)兩個(gè)文本之間的相似度。這是SIMHash最重要的特征。
??前面我們介紹了基于Jaccard相似系數(shù)、改進(jìn)的MinHash,以及余弦相似度來度量樣本間的相似性。正常情況下,余弦相似度是一種比較可取的方式,但是在現(xiàn)實(shí)中,采用余弦相似度面臨的問題也越來越突出:
(1)余弦相似度兩兩計(jì)算的方式,效果雖然明顯,但是計(jì)算復(fù)雜度較高。
(2)通過關(guān)鍵詞的特征向量表達(dá)文本的特征,不易于存儲(chǔ)。
(3)在文本單詞較少時(shí),可能會(huì)因?yàn)橐粌蓚€(gè)關(guān)鍵詞波動(dòng)較大。
而SimHash可以很好的解決上述問題。
SimHash計(jì)算過程
- 分詞與權(quán)重計(jì)算。將詞語進(jìn)行分詞處理,并計(jì)算每個(gè)分詞在文本中的權(quán)重。當(dāng)所需處理的文本長度過長時(shí),只需要按照權(quán)重由高到低篩選出前K個(gè)詞語即可,不需要將每個(gè)詞都納入計(jì)算。
- 哈希二進(jìn)制計(jì)算。對(duì)詞語進(jìn)行二進(jìn)制轉(zhuǎn)換,轉(zhuǎn)換的結(jié)果可以是一個(gè)32位或64位的二進(jìn)制值。
- 詞語加權(quán)。在步驟1中已經(jīng)得到每個(gè)詞語在文中的權(quán)重,這些權(quán)重需要表現(xiàn)在其二進(jìn)制內(nèi)容中,將權(quán)重與詞語的二進(jìn)制值進(jìn)行按位乘法,不同點(diǎn)在于,遇到二進(jìn)制值為0時(shí)乘以權(quán)重的負(fù)數(shù),遇到二進(jìn)制值為1時(shí)乘以權(quán)重的即可。
- 合并累計(jì)。對(duì)文本中的詞語進(jìn)行加權(quán)計(jì)算之后,最終每個(gè)詞語都會(huì)產(chǎn)生加權(quán)值,這些值內(nèi)容代表著該詞語在每個(gè)二進(jìn)制位上的特征。若需計(jì)算文本的全局特征,只需將文本詞語的加權(quán)值進(jìn)行合并累計(jì),該過程即可理解為將加權(quán)值按照每一位進(jìn)行求和。
- 降維輸出。步驟四的累加結(jié)果中,實(shí)質(zhì)上已經(jīng)產(chǎn)生了文本的特征碼,但是在絕對(duì)多數(shù)情況下,該特征碼不僅較長,而且內(nèi)容也會(huì)各式各樣,會(huì)給特征比較帶來困難,因此,需要將特征碼進(jìn)行降維輸出。降維的目的是降低特征碼的復(fù)雜度,約定位值小于0的為-1,大于等于0的為1,該值即為SimHash。
??SimHash目前主要用于重復(fù)信息的過濾,通過比較兩個(gè)文本的漢明距離來判定兩個(gè)文本的相似度。與余弦相似度相比,SimHash可以大大復(fù)雜文本的計(jì)算復(fù)雜度。