日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

相似数据检测算法(shingle,SimHash,Bloomfilter) 比较

發(fā)布時(shí)間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相似数据检测算法(shingle,SimHash,Bloomfilter) 比较 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

相似數(shù)據(jù)檢測(cè)算法


相似數(shù)據(jù)檢測(cè)算法對(duì)給定的一對(duì)數(shù)據(jù)序列計(jì)算兩者之間的相似度([0,1],1表示完全相同)或距離([0, ), 0表示完全相同),從而度量數(shù)據(jù)之間的相似程度。相似數(shù)據(jù)檢測(cè)在信息科學(xué)領(lǐng)域具有非常重要的應(yīng)用價(jià)值,比如搜索引擎檢索結(jié)果的聚類與排序、數(shù)據(jù)聚類與分類、Spam檢測(cè)、論文剽竊檢測(cè)、重復(fù)數(shù)據(jù)刪除、Delta數(shù)據(jù)編碼等應(yīng)用。正是由于它的重要性,近年來(lái)成為了研究的重點(diǎn),不斷有新檢測(cè)方法涌現(xiàn)并得到評(píng)估。其中,Broder提出的shingling算法和Charikar的simhash算法被認(rèn)為是目前為止最好的算法。

對(duì)于相似數(shù)據(jù)檢測(cè),最為簡(jiǎn)單地可以采用類似Unixdiff的方法。Unixdiff對(duì)文檔進(jìn)行逐行對(duì)比來(lái)檢測(cè)相似文件,它采用經(jīng)典的LCS(LongestCommon Subsequence,最長(zhǎng)公共子串)算法,運(yùn)用動(dòng)態(tài)規(guī)劃方法來(lái)計(jì)算相似性。LCS的含義是同時(shí)包含在字符串里的一個(gè)最長(zhǎng)字符序列,LCS的長(zhǎng)度作為這兩個(gè)字符串相似性的度量。Diff算法以整行作為"字符"來(lái)計(jì)算最長(zhǎng)公共子串,性能上比字符級(jí)的LCS算法快很多。這種方法效率很低,而且只適用文本文件的相似比較,不能直接適用于二進(jìn)制文件。為此,研究者們提出為每個(gè)文檔提取一組特征,這樣將文件相似性問(wèn)題轉(zhuǎn)換為集合相似性問(wèn)題,如基于shingle的計(jì)算方法。這種方式的核心思想是為每個(gè)文件提取組特征值,以特征值集合來(lái)計(jì)算相似性,從而降低空間和計(jì)算復(fù)雜性來(lái)提高性能。

經(jīng)過(guò)對(duì)shingle算法和simhash算法以及筆者基于bloom filter實(shí)現(xiàn)算法的分析,相似數(shù)據(jù)檢測(cè)算法大致流程如下:
(1) 將數(shù)據(jù)段分解成一組shingle(即子序列或數(shù)據(jù)塊),可以采用定長(zhǎng)、變長(zhǎng)、單詞或段落(文本文件)等分塊算法;
(2) 為了降低空間和時(shí)間計(jì)算復(fù)雜性,可以對(duì)shingle集合進(jìn)行抽樣,比如Min-Wise,Modm,Mins方法;
(3) 基于選定的shingle集合為數(shù)據(jù)文件抽取特征,通常是為每個(gè)shingle計(jì)算hash值組成的序列作為特征值;
(4) 為了降低空間和時(shí)間計(jì)算復(fù)雜性,可以對(duì)文件特征進(jìn)行降維處理,比如simhash和bloom filter;
(5) 基于文件特征計(jì)算兩個(gè)數(shù)據(jù)對(duì)象之間的相似性,計(jì)算方法有Cosine、Overlap、Dice、Jaccard或Hamming距離。


Shingle算法
Shingle算法的核心思想是將文件相似性問(wèn)題轉(zhuǎn)換為集合的相似性問(wèn)題,集合的相似性度量方法主要有resemblance和containment兩種,其定義如下。

?????????????????????????? |shingle(f1, w) ∩shingle(f2, w)|
 Rw(f1,f2) = ----------------------------------------------
??????????????? ? ? ? ? ? |shingle(f1, w) ∪shingle(f2, w)|

?????????????? ? ? ? ?? ? |shingle(f1, w) ∩ shingle(f2,w)|
 Cw(f1,f2) = ----------------------------------------------
?????????????????????????????????????????|shingle(f1, w)|


數(shù)量較大時(shí),如果對(duì)所有shingle進(jìn)行相似性處理則系統(tǒng)開銷較大,包括內(nèi)存和CPU資源。這時(shí)就可以考慮對(duì)shingle集合進(jìn)行抽樣,以降低空間和時(shí)間計(jì)算復(fù)雜性,但同時(shí)由于樣本覆蓋率有限,相似性精確度會(huì)有所降低。shingle取樣主要有三種方法,即Min-Wise,Modm,和Mins。Min-Wise技術(shù)是通過(guò)將shingle的長(zhǎng)度w和整數(shù)值進(jìn)行映射產(chǎn)生隨機(jī)哈希的公共集,在此相同的模式下進(jìn)行隨機(jī)最小獨(dú)立置換的采樣,從而得到采樣集合;Modm技術(shù)是通過(guò)在與Min-Wise同樣的公共映射集中選擇所有模m為0 的哈希值對(duì)應(yīng)的shingle組成取樣集合;Mins技術(shù)同樣也是先將shingle和整數(shù)集進(jìn)行映射,然后從中選擇最小s個(gè)元素組成取樣集合。此外,還可以使用shingle的hash值代表shingle進(jìn)行相似性計(jì)算,能夠節(jié)省一定計(jì)算開銷。


Simhash算法
Shingle算法的空間和時(shí)間計(jì)算復(fù)雜性都比較高,對(duì)于大數(shù)據(jù)集的SimlarityJoin問(wèn)題將難以適用。Charikar的simhash算法的核心思想是用一個(gè)b位的hash值來(lái)表示文件的特征值,然后使用simhash之間的Hamming距離來(lái)衡量相似性。Hamming距離的定義為,兩個(gè)二進(jìn)制序列中對(duì)應(yīng)位不同的個(gè)數(shù)。simhash的計(jì)算方法如下:
(1) 將一個(gè)b維的向量V初始化為0,b位的二進(jìn)制數(shù)s初始化為0;
(2) 對(duì)每一個(gè)shingle,用hash函數(shù)(如MD5, SHA1)計(jì)算一個(gè)b位的簽名h。對(duì)i=1到b,如果h的第i位為1,則V的第i個(gè)元素加上該特征權(quán)重;否則,V的第i個(gè)元素減去該特征權(quán)重;
(3) 如果V的第i個(gè)元素大于0,則s的第i位為1,否則為0;
(4) 輸出s作為simhash。
與傳統(tǒng)hash函數(shù)相比,simhash具有一個(gè)這樣的顯著特征,即越相似的文件具有越相似的simhash值,也就是說(shuō)Hamming距離越小。顯而易見(jiàn),Simhash僅使用b位的hash值來(lái)表示文件 的特征,節(jié)省了大量的存儲(chǔ)開銷;Hamming距離計(jì)算簡(jiǎn)單高效,Simhash使用Hamming距離來(lái)衡量相似性,計(jì)算復(fù)雜性得到大大降低。簡(jiǎn)而言之,simhash算法通過(guò)對(duì)文件特征的降維,有效解決了Shingle算法的高空間和時(shí)間計(jì)算復(fù)雜性問(wèn)題。然而,simhash算法的精確度也會(huì)有所損耗,并且與simhash的位數(shù)b有關(guān),b越大精確度越高。

Bloom filter算法
與Simhash算法本質(zhì)相似,Bloom filter算法的核心思想也是著眼于文件特征的降維,它使用Bloomfilter數(shù)據(jù)結(jié)構(gòu)來(lái)表示特征值。Bloomfilter是一個(gè)空間效率很高的數(shù)據(jù)結(jié)構(gòu),它由一個(gè)位數(shù)組和一組hash映射函數(shù)組成。Bloom filter可以用于檢索一個(gè)元素是否在一個(gè)集合中,它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過(guò)一般的算法,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。使用Bloomfilter進(jìn)行相似數(shù)據(jù)檢測(cè),可以彌補(bǔ)shingle中應(yīng)用特征集交集計(jì)算文件相似性所導(dǎo)致的高計(jì)算和存儲(chǔ)空間開銷,在性能與相似性匹配精度之間取得平衡。Bloomfilter構(gòu)造方法如下:
(1) 構(gòu)造一個(gè)m位的bloom filter數(shù)據(jù)結(jié)構(gòu)bf,并將所有位初始為0;
(2) 選定兩個(gè)hash函數(shù)作為映射函數(shù),分別為hash1,hash2;
(3) 對(duì)每一個(gè)shingle,分別應(yīng)用hash1和hash2,并對(duì)bf相應(yīng)比特位置1;
(4) 輸出bf作為文件特征值。
這樣,兩個(gè)文件相似性計(jì)算就轉(zhuǎn)換成兩個(gè)bloomfilter的相似性計(jì)算,越相似的文件在它們的bloomfilter中有更多共同的1。由于Bloom filter具有有限的誤識(shí)別率的特性,相似性算法精確度取決于Bloomfilter的大小,越大則精確度越高,同時(shí)存儲(chǔ)空間消耗也越大。Bloomfilter同樣可以使用Hamming距離衡量相似性,也可以使用Cosine、Overlap、Dice、Jaccard等方法來(lái)度量。Hamming距離前面已有定義,這里介紹一下后四種方法的計(jì)算公式。

????????????????????????????????????dot(x, y)
Cosine_sim(x, y) = -----------------
???????????????????? ? ? ? ? ? ? ? sqrt(|x|.|y|)


????????????????????????????????????? dot(x, y)
Overlap_sim(x, y) =-----------------
????????????????????????????????????min(|x|, |y|)

????????????????????????????????2.dot(x, y)
Dice_sim(x, y) =-----------------
??????????????????? ? ? ? ? ? ? ? |x| + |y|

???????????????????????????????????????????dot(x, y)
Jaccard_sim(x, y) =------------------------
???????????????????? ? ? ? ? ? ? ? ? |x| + |y| -dot(x, y)


其中,dot(x, y)= Σx[i].y[i],在這里相當(dāng)于兩個(gè)Bloomfilter數(shù)據(jù)結(jié)構(gòu)中同時(shí)為1的位數(shù);|x|表示bloom filter數(shù)據(jù)結(jié)構(gòu)中為1的位數(shù)。相似性計(jì)算函數(shù)如下:

1. static double bloom_sim(BLOOM *bloom1, BLOOM *bloom2) 2. { 3. int i, r1, r2; 4. int c1 = 0, c2 = 0, comm = 0; 5. double sim; 6. 7. for (i = 0; i < BLOOM_ARRAY_SZ; i++) { 8. r1 = bloom_check(bloom1, 1, i); 9. r2 = bloom_check(bloom2, 1, i); 10. if (r1 && r2) { 11. comm++; 12. c1++; 13. c2++; 14. } else { 15. if (r1) { 16. c1++; 17. } 18. 19. if (r2) { 20. c2++; 21. } 22. } 23. } 24. 25. 26. /* similarity measures */ 27. //sim = comm/(sqrt(c1) * sqrt(c2)); /* Cosine */ 28. //sim = comm/1.0/(c1 + c2 - comm); /* Jaccard */ 29. //sim = comm*2.0/(c1 + c2); /* Dice */ 30. sim = comm*1.0/(c1<c2?c1:c2); /* Overlap */ 31. return sim; 32. }


三種算法對(duì)比

Shingle算法的空間和計(jì)算復(fù)雜性高,相似性精度也高,適合數(shù)據(jù)量不大且對(duì)精度要求高的應(yīng)用。Simhash和bloom filter算法在空間消耗和計(jì)算復(fù)雜性方面都優(yōu)于Shingle算法,但是精度有所損耗,取決于simhash的長(zhǎng)度和bloom filter的大小。simhash的長(zhǎng)度通常為64位或128位,這個(gè)基本可以滿足應(yīng)用的需求,可以根據(jù)實(shí)際需求增大位數(shù)。bloomfilter要大于simhash長(zhǎng)度,可以根據(jù)最大shingle數(shù)的兩倍來(lái)估算,精度方面也要優(yōu)于simhash。由于hash函數(shù)的碰撞問(wèn)題,simhash和bloom filter算法可能出現(xiàn)誤判現(xiàn)象,即不相似的文件可能會(huì)判定為相似的。總結(jié)一下,通常情況下,文件特征值存儲(chǔ)空間消耗方面,Shingle> bloom filter > simhash;相似性計(jì)算精度方面,Shingle < bloom filter <simhash。Bloomfilter算法往往是比較折中的相似數(shù)據(jù)檢測(cè)方法選擇,但海量數(shù)據(jù)集的相似性計(jì)算往往采用simhash算法,在計(jì)算性能方面具有很大優(yōu)勢(shì),而且更加適合MapReduce計(jì)算模型。

?

總結(jié)

以上是生活随笔為你收集整理的相似数据检测算法(shingle,SimHash,Bloomfilter) 比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。