類似數據檢測算法對給定的一對數據序列計算二者之間的類似度([0,1], 1表示徹底相同)或距離([0, ), 0表示徹底相同),從而度量數據之間的類似程度。類似數據檢測在信息科學領域具備很是重要的應用價值,好比搜索引擎檢索結果的聚類與排序、數據聚類與分類、Spam檢測、論文剽竊檢測、重複數據刪除、Delta數據編碼等應用。正是因爲它的重要性,近年來成爲了研究的重點,不斷有新檢測方法涌現並獲得評估。其中,Broder提出的shingling算法和Charikar的simhash算法被認爲是目前爲止最好的算法。算法
對於類似數據檢測,最爲簡單地能夠採用相似Unix diff的方法。Unix diff對文檔進行逐行對比來檢測類似文件,它採用經典的LCS(Longest Common Subsequence,最長公共子串)算法,運用動態規劃方法來計算類似性。LCS的含義是同時包含在字符串裏的一個最長字符序列,LCS的長度做爲這兩個字符串類似性的度量。Diff算法以整行做爲"字符"來計算最長公共子串,性能上比字符級的LCS算法快不少。這種方法效率很低,並且只適用文本文件的類似比較,不能直接適用於二進制文件。爲此,研究者們提出爲每一個文檔提取一組特徵,這樣將文件類似性問題轉換爲集合類似性問題,如基於shingle的計算方法。這種方式的核心思想是爲每一個文件提取組特徵值,以特徵值集合來計算類似性,從而下降空間和計算複雜性來提升性能。數組
通過對shingle算法和simhash算法以及筆者基於bloom filter實現算法的分析,類似數據檢測算法大體流程以下:
(1) 將數據段分解成一組shingle(即子序列或數據塊),能夠採用定長、變長、單詞或段落(文本文件)等分塊算法;
(2) 爲了下降空間和時間計算複雜性,能夠對shingle集合進行抽樣,好比Min-Wise,Modm,Mins方法;
(3) 基於選定的shingle集合爲數據文件抽取特徵,一般是爲每一個shingle計算hash值組成的序列做爲特徵值;
(4) 爲了下降空間和時間計算複雜性,能夠對文件特徵進行降維處理,好比simhash和bloom filter;
(5) 基於文件特徵計算兩個數據對象之間的類似性,計算方法有Cosine、Overlap、Dice、Jaccard或Hamming距離。數據結構
Shingle算法
Shingle算法的核心思想是將文件類似性問題轉換爲集合的類似性問題,集合的類似性度量方法主要有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)|性能
數量較大時,若是對全部shingle進行類似性處理則系統開銷較大,包括內存和CPU資源。這時就能夠考慮對shingle集合進行抽樣,以下降空間和時間計算複雜性,但同時因爲樣本覆蓋率有限,類似性精確度會有所下降。shingle取樣主要有三種方法,即Min-Wise,Modm,和Mins。Min-Wise技術是經過將shingle的長度w和整數值進行映射產生隨機哈希的公共集,在此相同的模式下進行隨機最小獨立置換的採樣,從而獲得採樣集合;Modm 技術是經過在與Min-Wise一樣的公共映射集中選擇全部模m爲0 的哈希值對應的shingle組成取樣集合;Mins技術一樣也是先將shingle和整數集進行映射,而後從中選擇最小s個元素組成取樣集合。此外,還可使用shingle的hash值表明shingle進行類似性計算,可以節省必定計算開銷。大數據
Simhash算法
Shingle算法的空間和時間計算複雜性都比較高,對於大數據集的Simlarity Join問題將難以適用。Charikar的simhash算法的核心思想是用一個b位的hash值來表示文件的特徵值,而後使用simhash之間的Hamming距離來衡量類似性。Hamming距離的定義爲,兩個二進制序列中對應位不一樣的個數。simhash的計算方法以下:
(1) 將一個b維的向量V初始化爲0,b位的二進制數s初始化爲0;
(2) 對每個shingle,用hash函數(如MD5, SHA1)計算一個b位的簽名h。對i=1到b,若是h的第i位爲1,則V的第i個元素加上該特徵權重;不然,V的第i個元素減去該特徵權重;
(3) 若是V的第i個元素大於0,則s的第i位爲1,不然爲0;
(4) 輸出s做爲simhash。
與傳統hash函數相比,simhash具備一個這樣的顯著特徵,即越類似的文件具備越類似的simhash值,也就是說Hamming距離越小。顯而易見,Simhash僅使用b位的hash值來表示文件 的特徵,節省了大量的存儲開銷;Hamming距離計算簡單高效,Simhash使用Hamming距離來衡量類似性,計算複雜性獲得大大下降。簡而言之,simhash算法經過對文件特徵的降維,有效解決了Shingle算法的高空間和時間計算複雜性問題。然而,simhash算法的精確度也會有所損耗,而且與simhash的位數b有關,b越大精確度越高。ui
Bloom filter算法
與Simhash算法本質類似,Bloom filter算法的核心思想也是着眼於文件特徵的降維,它使用Bloom filter數據結構來表示特徵值。Bloom filter是一個空間效率很高的數據結構,它由一個位數組和一組hash映射函數組成。Bloom filter能夠用於檢索一個元素是否在一個集合中,它的優勢是空間效率和查詢時間都遠遠超過通常的算法,缺點是有必定的誤識別率和刪除困難。使用Bloom filter進行類似數據檢測,能夠彌補shingle中應用特徵集交集計算文件類似性所致使的高計算和存儲空間開銷,在性能與類似性匹配精度之間取得平衡。Bloom filter構造方法以下:
(1) 構造一個m位的bloom filter數據結構bf,並將全部位初始爲0;
(2) 選定兩個hash函數做爲映射函數,分別爲hash1,hash2;
(3) 對每個shingle,分別應用hash1和hash2,並對bf相應比特位置1;
(4) 輸出bf做爲文件特徵值。
這樣,兩個文件類似性計算就轉換成兩個bloom filter的類似性計算,越類似的文件在它們的bloom filter中有更多共同的1。因爲Bloom filter具備有限的誤識別率的特性,類似性算法精確度取決於Bloom filter的大小,越大則精確度越高,同時存儲空間消耗也越大。Bloom filter一樣可使用Hamming距離衡量類似性,也可使用Cosine、Overlap、Dice、Jaccard等方法來度量。Hamming距離前面已有定義,這裏介紹一下後四種方法的計算公式。
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|.net
dot(x, y)
Jaccard_sim(x, y) = ------------------------
|x| + |y| - dot(x, y)
其中,dot(x, y) = Σx[i].y[i],在這裏至關於兩個Bloom filter數據結構中同時爲1的位數;|x|表示bloom filter數據結構中爲1的位數。類似性計算函數以下:
static double bloom_sim(BLOOM *bloom1, BLOOM *bloom2)
{
int i, r1, r2;
int c1 = 0, c2 = 0, comm = 0;
double sim;
for (i = 0; i < BLOOM_ARRAY_SZ; i++) {
r1 = bloom_check(bloom1, 1, i);
r2 = bloom_check(bloom2, 1, i);
if (r1 && r2) {
comm++;
c1++;
c2++;
} else {
if (r1) {
c1++;
}
if (r2) {
c2++;
}
}
}
/* similarity measures */
//sim = comm/(sqrt(c1) * sqrt(c2)); /* Cosine */
//sim = comm/1.0/(c1 + c2 - comm); /* Jaccard */
//sim = comm*2.0/(c1 + c2); /* Dice */
sim = comm*1.0/(c1<c2?c1:c2); /* Overlap */
return sim;
}
三種算法對比Shingle算法的空間和計算複雜性高,類似性精度也高,適合數據量不大且對精度要求高的應用。Simhash和bloom filter算法在空間消耗和計算複雜性方面都優於Shingle算法,可是精度有所損耗,取決於simhash的長度和bloom filter的大小。simhash的長度一般爲64位或128位,這個基本能夠知足應用的需求,能夠根據實際需求增大位數。bloom filter要大於simhash長度,能夠根據最大shingle數的兩倍來估算,精度方面也要優於simhash。因爲hash函數的碰撞問題,simhash和bloom filter算法可能出現誤判現象,即不類似的文件可能會斷定爲類似的。總結一下,一般狀況下,文件特徵值存儲空間消耗方面,Shingle > bloom filter > simhash;類似性計算精度方面,Shingle < bloom filter < simhash。Bloom filter算法每每是比較折中的類似數據檢測方法選擇,但海量數據集的類似性計算每每採用simhash算法,在計算性能方面具備很大優點,並且更加適合MapReduce計算模型。