長文本去重緣起: (1)原創不易,互聯網抄襲成風,不少原創內容在網上被抄來抄去,改來改去 (2)

緣起:算法

(1)原創不易,互聯網抄襲成風,不少原創內容在網上被抄來抄去,改來改去運維

(2)百度的網頁庫很是大,爬蟲如何判斷一個新網頁是否與網頁庫中已有的網頁重複呢?函數

這是本文要討論的問題(儘可能用你們都能馬上明白的語言和示例表述)。優化

1、傳統簽名算法與文本完整性判斷設計

問題拋出:排序

(1)運維上線一個bin文件,將文件分發到4臺線上機器上,如何判斷bin文件所有是一致的?md5

(2)用戶A將消息msg發送給用戶B,用戶B如何判斷收到的msg_t就是用戶A發送的msg?hash

思路:it

一個字節一個字節的比對兩個大文件或者大網頁效率低,咱們能夠用一個簽名值(例如md5值)表明一個大文件,簽名值相同則認爲大文件相同(先不考慮衝突率)效率

回答:

(1)將bin文件取md5,將4臺線上機器上的bin文件也取md5,若是5個md5值相同,說明一致

(2)用戶A將msg以及消息的md5同時發送給用戶B,用戶B收到msg_t後也取md5,獲得的值與用戶A發送過來的md5值若是相同,則說明msg_t與msg相同

結論:md5是一種簽名算法,經常使用來判斷數據的完整性與一致性

md5設計原則:兩個文本哪怕只有1個bit不一樣,其md5簽名值差異也會很是大,故它只適用於「完整性」check,不適用於「類似性」check。

新問題拋出:

有沒有一種簽名算法,若是文本很是類似,簽名值也很是類似呢?

2、文本類似性的簽名算法

上文提出的問題,能夠用局部敏感哈希LSH(Locality Sensitive Hash)解決,局部敏感哈希是一類文本越類似,哈希值越類似的hash算法,有興趣的同窗自行百度,這裏分享一下minHash的思路。

問題的提出:什麼是minHash?

回答:minHash是局部敏感哈希的一種,它經常使用來快速斷定集合的類似性,也經常使用於檢測網頁的重複性,其思路爲,用相同的規則抽取集合中的少部分元素表明整個集合,若是少部分元素的重合度很高,很是可能整個集合的重複度也很高。

舉例:待斷定的集合爲A{1, 7, 5, 9, 3, 11, 15, 13}

已有的集合爲:

B{10, 8, 2, 4, 6, 0, 1, 16},

C{100, 700, 500, 900, 300, 1100, 1500,1300},

D{1, 3, 2, 4, 6, 5, 8, 7}

假設使用部分元素代替全體集合的規則爲:集合內元素進行排序,取值最小的4個(這個過程有信息損失,咱們能夠認爲是一個hash過程)

處理結果爲:

A{1, 3, 5, 7}

B{0, 1, 2, 4} => A與B有1個元素相同

C{100, 300, 500, 700} => A與C有0個元素相同

D{1, 2, 3, 4} => A與D有2個元素相同

判斷結論:咱們認爲集合A與集合D是最類似的

這個例子有點2,但基本能說明總體思路,實際在執行的過程當中:

(1)咱們可使用更多的元素來表明集合,以提升準確性(例如,將上例中的4個元素表明集合升級爲8個元素表明集合)

(2)咱們可使用更多的hash函數來表明集合,以提升準確性(例如,上例除了「排序後取值最小的4個元素表明集合」,還能夠增長一個哈希函數「排序後取值最大的4個元素表明集合」)

(3)minHash能夠量化評判類似度,亦能夠評判網頁是否重複(一個分類問題),設定類似度閾值,高於閾值爲重複,低於閾值爲不重複

(4)實際排重過程當中,網頁庫中的哈希值均可以提早計算,只有待斷定的集合或者網頁的哈希值須要臨時計算

3、minHash與長文本重複度檢測有什麼關係

目前看來沒什麼關係,但若是咱們能將每個長文本用一個集合來表示,就能將長文本的類似度用minHash來解決了。

問題的提出:如何將長文本轉化爲集合?

回答:我去,分詞不是就能夠麼

舉例:待斷定的長文本爲A{我是58沈劍,我來自58到家}

已有網頁庫集合爲:

B{我是一隻來自58的狼}

C{58到家,服務到家}

D{這事和我不要緊,我是湊數的}

使用分詞將上述文本集合化:

A{我,58,沈劍,來自,到家}

B{我,58,來自,狼}

C{58,服務,到家}

D{事,我,湊數,關係}

判斷結論:噹噹噹當,轉化爲集合後,能夠快速判斷A與B的類似度最高,固然實際執行過程當中,除了分詞還得考慮詞頻,用這種方法對長文本進行類似度檢測,準確率很是高(文本越長越準)

4、還有沒有更有效的方法

使用上述方法進行文本類似度檢測,須要進行中文分詞,詞頻統計,哈希值計算,類似度計算,計算量微大。

然而,抄襲成風,一字不改的風氣,讓技術有了更廣闊的優化空間,贊!

怎麼優化呢?

再也不進行分詞,而是進行「分句」,用標點符號把長文按照句子分開,使用N個句子集合(例如一篇文章中5條最長的句子做爲簽名,注意,長句子比短句子更具備區分性)做爲文章的簽名,在抄襲成風的互聯網環境下,此法判斷網頁的重複度能大大下降工程複雜度,而且準確度也異常的高。

5、結論

在抄襲成風的互聯網環境下,採用「分句」的方式,用5條最長的網頁內容做爲網頁的簽名,可以極大的下降排重系統複雜度,提升排重準確率,不失爲一種好的選擇。

相關文章
相關標籤/搜索