短文本合併重複(去重)的簡單有效做法

2021-06-19 23:02:17 字數 1631 閱讀 9700

前些日子看了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、舊文推薦閱讀:『我的團長我的團中,學生李樑對龍文章說,我相信你們能戰勝日本人,但問題仍然存在。李鴻章們不遺餘力地修鐵路、辦實業,但問題依然存在。 器物上的改變是不會解決問題的。』

贈圖一枚:

短文本合併重複(去重)的簡單有效做法

2012 6 12 前些日子看了charikar simhash的介紹 simhash演算法原理和網頁查重應用 核心思想是用乙個f位的hash值來表示檔案的特徵值,然後使用hash值之間的hamming距離來衡量相似性。輸入的是乙個文件的特徵集合,輸出的是f位的二進位制數s。於是用來測試短文本 長度...

基於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...