使用simhash計算文字相似度

2021-10-02 10:20:59 字數 2977 閱讀 3400

1. 使用simhash計算文字相似度

2. 使用余弦相似度計算文字相似度

3. 使用編輯距離計算文字相似度

4. jaccard係數計算文字相似度

文字相似度計算常用於網頁去重以及nlp裡文字分析等場景。文字相似度,可以分為兩種,一種是字面相似度,另一種是語義相似度。本文記錄的是文字的字面相似度的計算及實現,語義相似度計算則需要海量資料去計算語義值,較為複雜。

最常用的且最簡單的兩種文字相似檢測方法:區域性敏感hash、余弦相似度

使用一種hash演算法,對你於相似的文字得到近似的hash值。lsh的實現方式有多種,常用的就是simhash。

計算出simhash值後,再計算hash值的漢明距離,即可得到文字的相似性。

漢明距離:

定義:兩個長度相同的字串對應位字元不同的個數

兩個關鍵點:

這裡的長度相同並不是指輸入的字串長度相同,而是指經過計算後得到的hash字元的長度(一般固定為64位)。

1.1 使用漢明距離計算文字相似性步驟

主要的6個步驟為:分詞、hash、加權、合併、降維、計算漢明距離,前5個步驟本質上是simhash演算法的流程,思路很簡單易懂。

漢明距離為乙個整數,似乎不能很直觀的反應兩個文字的相似度(0 ~ 1),所以這裡通過實驗的方法找了條類似正態分佈的函式來將漢明距離轉化為乙個0~1之間的數來表示相似度,更直觀一些,方程如下:

1.2 使用漢明距離計算文字相似性舉例

待比較文字:

s1:今天天氣不錯!

s2:今天天氣真好!

計算以上兩個二禁止字串中對應位不同的位數:

00000111001101

1111110001010000010101111100111101110110111011

0011

10010111101100

0110110101010100110101111110110100100110011010

1011

共有16處不同,所以漢明距離為16,轉化為相似度位0.004799039154476354。可以看出不是很準確。

1.3 漢明距離計算相似性存在的問題

通過上邊的舉例也可以看出,兩個相似的句子:

s1:今天天氣不錯!

s2:今天天氣真好!

得出的漢明距離居然有16,相似度僅僅位0.004。

造成這種問題的原因是:利用區域性hash+漢明距離計算相似度時,只適用於長文字,對短文本的判別效果不是很好。

現在輸入兩個較長的文字進行測試:

以下兩個樣本摘自一段豆瓣對《愛情公寓5》的影評,其中樣本一和二是相似的,樣本三和

一、二是不相似的。

樣本一(s1):

樣本二(s2):

樣本三(s3):

計算結果如下:

d(s1,s2)=0

d(s1,s3)=14

d(s2,s3)=14

結果還是比較準確的。

另外嘗試了其他文字量較大的樣本,識別準確率都不錯。因此基於simhash和漢明距離的文字相似性計算適用於文字較多的文字,對短文本的識別是很不準確的。

另外,由於任何hash函式都不可避免的存在衝突,所以,也會出現完全不相干的兩段文字計算的hash值相同,導致漢明距離很小而誤判為相似。

1.4 simhash關鍵**

@getter

static

class

wordterm

extends

term

@override

public string tostring()

}private

static string simhash

(string s)

else

}//加權hash

for(map.entry

wordtermentry : wordmap.

entryset()

)else

return frequency;})

.collect

(collectors.

tolist()

);int len =

64- collect.

size()

;for

(int i =

0; i < len; i++

) wordterm.weightedhash = collect;

}//生成64位simhash

stringbuilder sb =

newstringbuilder()

;for

(int i =

0; i <

64; i++

)//降維

if(sum >0)

else

}return sb.

tostring()

;}

all efforts, only for myself, no longer for other

simhash 漢明距離計算文字相似度

由於最近需要做大規模的文字相似度的計算,所以用到了simhash 漢明距離來快速計算文字的相似度。simhash的原理如下圖 其中的weight採用的是jieba的tf idf的結果。附上python3的源 import math import jieba import jieba.analyse ...

計算文字相似度

計算文字相似度 推薦2收藏 簡單講解 文字相似度計算在資訊檢索 資料探勘 機器翻譯 文件複製檢測等領域有著廣泛的應用。比如 控制,我們假設你開發了乙個微博 並且已經把世界上罵人的句子都已經收錄進了資料庫,那麼當乙個使用者發微博時會先跟罵人句子的資料庫進行比較,如果符合裡面的句子就不讓使用者發出。通常...

文字相似度計算

一 簡介 文字相似度是進行文字聚類的基礎,和傳統的結構化數值資料的聚類方法相似,文字聚類是通過計算文字之間的 距離 來表示文字之間的相似度,並產生聚類。文字相似度的常用計算反法有餘弦定理。但是文字資料和普通的資料不同,它是一種半結構化的資料,在進行聚類之前必須要對文字資料來源進行處理,如分詞 向量化...