信息检索与搜索引擎:Simhash算法优化
1 Simhash 算法原理
Simhash 算法的原理是將一個(gè)在超大集合內(nèi)查找數(shù)據(jù)的問(wèn)題利用哈希函數(shù)轉(zhuǎn)換映射的方法轉(zhuǎn)化為一個(gè)在較小集合內(nèi)查找數(shù)據(jù)的問(wèn)題,這樣能大大減少計(jì)算量。
Simhash 算法流程
Simhash[3-5]生成指紋可以分為分詞、hash 值計(jì)算、加權(quán)、合并、降維等 5 個(gè)步驟。其算法流程圖如下所示:
2 Simhash 算法原理改進(jìn)方法
2.1 文檔相似度的改進(jìn)
傳統(tǒng)的兩篇文檔相似度定義為,兩篇文檔內(nèi)容對(duì)應(yīng) Simhash 簽名值之間的海明距離。不過(guò)單一考慮文檔內(nèi)容比較片面,存在誤差。為了減少誤差,文中將兩篇文檔的相似度定義為文檔內(nèi)容的相似度和文檔其他信息的相似度權(quán)重加。文檔內(nèi)容的相似度使用改進(jìn) Simhash算法計(jì)算,文檔其他信息的相似度使用最小哈希算法計(jì)算。下面給出文檔其他信息相似度的計(jì)算方法。
文檔其他信息包括文檔關(guān)鍵字、文檔標(biāo)簽、文檔引 用文獻(xiàn)等,用集合的形式表示。現(xiàn)假設(shè)文檔中所有其他信息集合為{ a,b,c,d,e } ,文檔 s1含有其他信息集合為{ a,
b } ,文檔s2含有的其他信息集合為{ b,c,d},文檔s3的集合為{ a,d,e} ,文檔s4 的集合為{ d,e} ,將這一系列集合組成特征矩陣,如圖1所示。
圖1表示的特征矩陣的行表示文檔其他信息組成的集合,列表示文檔集合。計(jì)算文檔其他信息的相似度,就是計(jì)算特征矩陣對(duì)應(yīng)列之間的 jaccard相似度。因?yàn)樘卣骶仃囀窒∈?#xff0c;使用最小哈希的方法來(lái)計(jì)算。先對(duì)矩陣進(jìn)行隨機(jī)打亂,文檔其他信息(即為矩陣中的對(duì)應(yīng)列) 的最小哈希值,為矩陣對(duì)應(yīng)列第一個(gè)值為1的行號(hào)。最小哈希函數(shù)設(shè)為h,最小哈希函數(shù)用于模擬對(duì)矩陣所進(jìn)行的隨機(jī)打亂,特征矩陣兩列之間的 jaccard 相似度為對(duì)應(yīng)列打亂后最小哈希值相同的概率。
當(dāng)特征矩陣規(guī)模很大時(shí),對(duì)其進(jìn)行隨機(jī)打亂是非常耗時(shí)的,而且還要進(jìn)行多次。為此使用多個(gè)哈希函數(shù)來(lái)模擬隨機(jī)打亂,具體做法為:假設(shè)要進(jìn)行n次隨機(jī)打亂,選用n個(gè)隨機(jī)函數(shù)h1,h2,…,hn來(lái)模擬這一效果,步驟如下:
SIG( i,c) 表示簽名矩陣第 i 個(gè)哈希函數(shù)在第 c 列上的值。SIG( i,c) 初始化為 Inf( 無(wú)窮大) ,再對(duì) r 行進(jìn)行以下步驟:
( 1) 計(jì)算 h1( r) ,h2( r) ,…,hn( r) ;
2) 對(duì)特征矩陣的每一列c。如果c所在的第r行為 0,不做任何操作; 如果c所在的第r行為1,則對(duì)于每個(gè) i =1,2,…,n,SIG( i,c)和hi( r)中的較小值設(shè)為SIG( i,c) 。
計(jì)算圖1特征矩陣,a,b,c,d,e 對(duì)應(yīng) 0,1,2,3,4,5 行,選用哈希函數(shù) h1( x) = ( x + 1) mod5,h2( x) = ( 2 × x +1) mod5,函數(shù)中的 x 表示行號(hào),遍歷完所有行,最
終的簽名矩陣如圖 2 所示。
計(jì)算圖 2 最終簽名矩陣對(duì)應(yīng)列之間的 jaccard 相似度,s1和 s2 兩列完全不同,所以 sim( s1,s2 ) = 0。查看圖 1 特征矩陣,得到 s1 和 s2 的真實(shí) jaccard 相似度為 1/5
,比較接近。
文檔其他信息組成的特征矩陣轉(zhuǎn)化為簽名矩陣,通過(guò)簽名矩陣來(lái)估計(jì)特征矩陣對(duì)應(yīng)列之間的 jaccard相似度,也就是估計(jì)文檔其他信息的相似度。最終通過(guò)文檔內(nèi)容的相似度和文檔其他信息的相似度計(jì)算文檔的相似度,將A,B兩篇文檔間的相似度定義為:
其中,Haming( A,B) 表示A,B兩篇文檔內(nèi)容的海明距離,通過(guò)改進(jìn)的 Simhash 計(jì)算得到,加一是為了保證當(dāng)A,B兩篇文檔內(nèi)容的海明距離為0時(shí),分?jǐn)?shù)不會(huì)為無(wú)窮大; minHash( A,B) 表示 A,B 兩篇文檔其他信息的相似度,通過(guò)最小哈希算法計(jì)算得到; μ 的取值一般為 0.8~ 0.9,兩篇文檔的相似度還是以內(nèi)容的相似度為主。
2.2 文檔特征權(quán)值的改進(jìn)
傳統(tǒng) Simhash 算法以文檔分詞識(shí)別出的關(guān)鍵詞為 特征值,權(quán)重為該關(guān)鍵詞出現(xiàn)的次數(shù)。由于權(quán)重僅由單詞出現(xiàn)的次數(shù)來(lái)決定,部分重要信息會(huì)丟失,導(dǎo)致最終計(jì)算出的 Simhash簽名值的準(zhǔn)確性降低。為解決這一問(wèn)題,綜合使用 TF-IDF[12]技術(shù)和單詞的主題相關(guān)性計(jì)算關(guān)鍵詞權(quán)重。TF-IDF 技術(shù)用于計(jì)算一個(gè)關(guān)鍵詞在一個(gè)文檔集中的一篇文檔的重要性,TF 表示關(guān)鍵詞在這篇文檔出現(xiàn)的頻率,關(guān)鍵詞 ti 的 TF 定義為:
其中,ni,j表示關(guān)鍵詞ti在文檔j中出現(xiàn)的次數(shù);表示文檔j中所有關(guān)鍵詞出現(xiàn)次數(shù)的總和。關(guān)鍵詞在文檔中出現(xiàn)的次數(shù)越多,TF越高。逆向文檔頻率IDF,表示關(guān)鍵詞所在文檔在文檔集所有文檔中的比重,定義為:
其中,D表示ti文檔集中的文檔總數(shù); | { j: ti ∈ dj} | 表示含有關(guān)鍵詞的文檔的數(shù)量( ni,j 不為 0 的文檔) 。
關(guān)鍵詞 i 在文檔 j 的TD-IDF 定義為: tf - idfi,j = tfi,j × idfi 。TD-IDF的局限是在文檔集出現(xiàn)次數(shù)越多,重要性就一定越小,這對(duì)于部分文檔來(lái)說(shuō)存在誤差,有些重要單詞在文檔集中的出現(xiàn)次數(shù)也很大,需要給這些單詞更大的權(quán)重。
文中使用單詞的主題相關(guān)性作為附加權(quán)重,將專業(yè)術(shù)語(yǔ)詞匯的長(zhǎng)度作為判斷單詞主題相關(guān)性的依據(jù)。選用 CSSCI 關(guān)鍵詞庫(kù)中的關(guān)鍵詞作為數(shù)據(jù)集,統(tǒng)計(jì)數(shù)據(jù)集中10 000 個(gè)中文術(shù)語(yǔ)的長(zhǎng)度,并進(jìn)行正態(tài)擬合,
如圖 3 所示。
擬合得到的正態(tài)分布函數(shù)均值 μ = 4.51,標(biāo)準(zhǔn)差 σ = 2. 207,μ 的 置 信 度 為 95% 的 置 信 區(qū) 間[4. 214, 4. 806],σ 的 置 信 度 為 95% 的 置 信 區(qū) 間[1. 787, 2. 627]。擬合得到的 R square 為擬合函數(shù)的確定系數(shù),越接近1,表示擬合函數(shù)對(duì)實(shí)際數(shù)據(jù)的解釋能力越好。此次擬合得到的R square 為 0. 949 9,較接近1,說(shuō)明擬合方程具有較好的解釋能力。將正態(tài)分布函數(shù)歸一化得到:
將歸一化得到的中文術(shù)語(yǔ)長(zhǎng)度函數(shù) len( x) 作為單詞的主題相關(guān)性函數(shù)。其中 x 表示單詞的長(zhǎng)度,可以看出長(zhǎng)度越接近 4.5,函數(shù)值越高,單詞的主題相關(guān)性也越高。使用單詞主題相關(guān)性函數(shù)作為附加的權(quán)重,可以提高 TF-IDF 技術(shù)判斷單詞權(quán)重的準(zhǔn)確性。最終得出關(guān)鍵詞 x 的權(quán)重計(jì)算公式為:
其中,tfx,j × idfx 為關(guān)鍵詞 x 在文檔 j 的TF-IDF值; len( x) 為單詞 x 的主題相關(guān)性函數(shù)。
2.3 Simhash 簽名值檢索階段的改進(jìn)
Simhash 簽名值檢索階段使用哈希到桶的方法選出候選對(duì),具體做法為將簽名值分塊,對(duì)同塊的簽名值使用相同的哈希函數(shù),映射到桶,哈希到同一個(gè)桶中元素為候選對(duì)。此時(shí)可能會(huì)出現(xiàn)分布不均勻的情況,大量元素被哈希到了同一個(gè)桶,這個(gè)桶中的所有元素都是候選對(duì),需要進(jìn)行大量海明距離計(jì)算。
文中通過(guò)設(shè)定閾值的方法解決這個(gè)問(wèn)題。當(dāng)一個(gè)桶中元素超過(guò)此閾值,對(duì)桶中元素所屬簽名值除去桶中元素后再次分塊,對(duì)同塊的簽名值使用相同的哈希函數(shù),二次哈希映射仍被映射到同一個(gè)桶中元素為候選對(duì),可以減少候選對(duì)數(shù)量,使分布更加均勻。
具體步驟為:
( 1) 檢查每一個(gè)桶中的元素,判斷元素?cái)?shù)量是否超過(guò)閾值,閾值定義為 ( 1 + μ) × AVEn ,其中 AVEn 為桶中元素的平均值,μ 為權(quán)重。
( 2) 當(dāng)一個(gè)桶中的元素超過(guò)這個(gè)閾值時(shí),對(duì)桶中元素所屬的簽名值除去桶中元素塊后,再次分塊,將同一塊的簽名值使用相同的哈希函數(shù),進(jìn)行二次哈希,二次哈希映射到相同桶中的元素作為候選對(duì)。
例如一共有 233 ( 將近 10 億篇文檔) ,每篇文檔每部分簽名為 16 位,則桶數(shù)組數(shù)目為 65 536( 216 ) 個(gè),每個(gè)桶的平均元 素個(gè)數(shù)為 131 072 ( 233-16 ) 個(gè),則AVEn = 131 072,現(xiàn)取 μ 為 2,則當(dāng)某個(gè)桶中的元素超過(guò) ( 1 + 2) × 131 072 = 393 216 時(shí)進(jìn)行二次哈希,二次哈希的桶數(shù)組數(shù)目為 4 096( 212 ) 個(gè),此時(shí)依舊被哈希到同一個(gè)桶的元素作為候選對(duì)進(jìn)行海明距離計(jì)算。
3 實(shí)驗(yàn)結(jié)果及分析
參考文獻(xiàn):
馬成前,毛許光.網(wǎng)頁(yè)查重算法 Shingling 和 Simhash 研究[J].計(jì)算機(jī)與數(shù)字工程,2009,37( 1) : 15-17.
顧志祥,謝龍恩,杜 雨.文本相似度計(jì)算的Simhash算法的實(shí)現(xiàn)與改進(jìn)[J]信息通信,2020
王 誠(chéng),王宇成.基于Simhash 的大規(guī)模文檔去重改進(jìn)算法研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2019
余 意,張玉柱,胡自健.基于 Simhash 算法的大規(guī)模文檔去重技術(shù)研究[J].信息通信,2015( 2) : 28-29.
總結(jié)
以上是生活随笔為你收集整理的信息检索与搜索引擎:Simhash算法优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机图形学-五角星的画法(转)
- 下一篇: openbravo erp介绍(二)