短文本合並重復(去重)的簡單有效做法
2012/6/12
不大合適的SimHash
前些日子看了Charikar SimHash的介紹《Simhash算法原理和網頁查重應用》,核心思想是用一個f位的hash值來表示文件的特征值,然后使用hash值之間的Hamming距離來衡量相似性。輸入的是一個文檔的特征集合,輸出的是f位的二進制數S。
於是用來測試短文本(長度在8個中文字符~45個中文字符之間)相似性,做法很簡單:
1.將短文本做分詞,得到分詞數組,數組每一個元素都轉為hash字符串。
2.利用simhash算法來計算分詞數組的simhash值。
3.利用simhash的similarity算法計算simhash1和simhash2的相似度。
這種做法的缺點是:
1.誤判率高。
如下圖所示,
SimHash可能不適合做這種短標題的重復度判斷,雖然SimHash在空間消耗和計算復雜性方面相對Shingle和BloomFilter占優。
介紹一下2009年2月份我們做Twitter銳推榜時是如何做的
Twitter中對於熱門事件的中文表達多種多樣,轉發時又往往會追加很多格式的各種內容,造成了相似內容的短文本的信息指紋不同,在這種情況下,段國成認為需要先為短文本抽取標簽,再通過標簽來計算相似度進行銳推合並。
1.短文本抽取標簽的方法:
1.1. 剔除所有英文、數字、標點字符;
1.2. 剔除所有Twitter用戶名;
1.3.分詞,並標注詞性,僅保留實體詞性,如名詞、動詞;(技巧一!)
1.4.過濾掉常用實體詞(常用實體詞是通過對歷史銳推訓練而得,即建立自己的停止詞表);(技巧二!)
1.5.計算保留實體詞的詞頻,並以此為權重,選擇權重大的詞語作為標簽;
1.6.標簽數組長度大於一個閾值(如3),才認為是有信息量的銳推,否則忽略。(技巧三!)
2.合並相似短文本(即我們所說的Retweet)方法:
2.1.以每個標簽作為Shingle特征(即核心思想還是“一個數據段分成若干Shingle,每個Shingle計算出一個hash值,然后組成一個以hash值為元素的數組,以此作為特征值或叫信息指紋來表示這個數據段”);
2.2.以網頁去重領域中改進的Shingle方法來進行計算近期內(目的:縮小計算范圍)銳推的相似度(Shingle算法的核心思想是將文本相似性問題轉換為集合的相似性問題,改進的Shingle方法的時間復雜度近似於線性);
2.3.對相似程度大於一定閾值的、不同信息指紋的熱門銳推,再次掃描出來,將它們的熱度進行合並。
以上結果就構成了 @rtmeme 的運算機制。它特別適合處理十幾個、幾十個漢字的短文本合並重復,適用於微博領域。
也看到有人這么做:先Shingle再SimHash,不知道是否適合海量短文本合並重復,回頭試試看。
@鄭昀 於北京
推薦閱讀:
1、
『我認為騰訊目前的O2O產品其實是沒任何借鑒意義的,因為真的做得比較差。但我們也有一點做好的決心。……所以盡管我們在局部解決了閉環的問題,但實際上整個O2O的閉環仍然是遙遙無期的事情。』——《戴志康:讓我焦躁並痛苦着的O2O》http://t.cn/zOFL5Cc
2、
#O2O是個偽概念#:知乎O2O系列問答:http://t.cn/SzuEjr ;清科投資集團對O2O的解讀:http://t.cn/zOgcikN ;黃紹麟:O2O和無線電子商務是偽概念 http://t.cn/zOfodfZ
3、
推薦閱讀:『而Google的#simhash#算法產生的簽名,可以用來比較原始內容的相似度時,便很想了解這種神奇的算法的原理。出人意料,這個算法並不深奧,其思想是非常清澈美妙的。』——《Simhash算法原理和網頁查重應用》http://t.cn/zOrhqUb
4、
舊文推薦閱讀:『我的團長我的團中,學生李梁對龍文章說,我相信你們能戰勝日本人,但問題仍然存在。李鴻章們不遺余力地修鐵路、辦實業,但問題依然存在。 器物上的改變是不會解決問題的。』http://t.cn/zOlg0Kg
贈圖一枚: