2012/6/12
前些日子看了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佔優。
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、2、
#o2o是個偽概念#:知乎o2o系列問答: ;清科投資集團對o2o的解讀: ;黃紹麟:o2o和無線電子商務是偽概念
3、4、
舊文推薦閱讀:『我的團長我的團中,學生李樑對龍文章說,我相信你們能戰勝日本人,但問題仍然存在。李鴻章們不遺餘力地修鐵路、辦實業,但問題依然存在。 器物上的改變是不會解決問題的。』
贈圖一枚:
短文本合併重複(去重)的簡單有效做法
前些日子看了charikar simhash的介紹 simhash演算法原理和網頁查重應用 核心思想是用乙個f位的hash值來表示檔案的特徵值,然後使用hash值之間的hamming距離來衡量相似性。輸入的是乙個文件的特徵集合,輸出的是f位的二進位制數s。於是用來測試短文本 長度在8個中文字元 45...
基於simhash的短文本去重
usr bin env python coding utf 8 利用simhash進行文字去重 from simhash import simhash,simhashindex import jieba import codecs import datetime import os class du...
陣列的合併與去重方法
1 難度 編寫函式,用於過濾乙個陣列內重複的元素 陣列去重 返回去重之後的陣列。例如 第一種方法 var arr1 2 4,a b c 1 2,5 a b var array2 4 c 1 2,5 a b var array3 2 a b 合併陣列 var arr4 arr1.concat arra...