日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Simhash在內容去重中的應用,你學會了嗎?

來源: 責編: 時間:2024-02-29 14:34:15 248觀看
導讀一、背景信息流個性化推薦場景中依賴爬蟲抓取的海量新聞庫,這些新聞中不乏互相抄襲的新聞,這些內容相似的文章,會造成內容的同質化并加重數據庫的存儲負擔,更糟糕的是降低了信息流內容的體驗。所以需要一種準確高效的文本

一、背景

信息流個性化推薦場景中依賴爬蟲抓取的海量新聞庫,這些新聞中不乏互相抄襲的新聞,這些內容相似的文章,會造成內容的同質化并加重數據庫的存儲負擔,更糟糕的是降低了信息流內容的體驗。所以需要一種準確高效的文本去重算法。而最樸素的做法就是將所有文本進行兩兩比較,簡單易理解,最符合人類的直覺,這種做法對于少量文本來說,實現起來很方便,但是對于海量文本來說是行不通的,所以應在盡可能保證準確性的同時,降低算法的時間復雜度。事實上,傳統比較兩個文本相似性的方法,大多是將文本分詞之后,轉化為特征向量距離的度量,比如常見的歐氏距離、海明距離或者余弦角度等等。下面以余弦相似度和simhash算法為例做簡單介紹。Vgr28資訊網——每日最新資訊28at.com

1.1 余弦相似度

余弦相似度的核心思想是計算兩個向量的夾角余弦值來判斷兩個句子的相似度,以下面兩個句子為例:Vgr28資訊網——每日最新資訊28at.com

第一步分詞:Vgr28資訊網——每日最新資訊28at.com

句子A:我/喜歡/看/電視,不/喜歡/看/電影Vgr28資訊網——每日最新資訊28at.com

句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影Vgr28資訊網——每日最新資訊28at.com

第二步列出所有詞:Vgr28資訊網——每日最新資訊28at.com

我,喜歡,看,電視,電影,不,也Vgr28資訊網——每日最新資訊28at.com

第三步計算詞頻:Vgr28資訊網——每日最新資訊28at.com

句子A:我1,喜歡2,看2,電視1,電影1,不1,也0Vgr28資訊網——每日最新資訊28at.com

句子B:我1,喜歡2,看2,電視1,電影1,不2,也1Vgr28資訊網——每日最新資訊28at.com

第四步,寫出詞向量:Vgr28資訊網——每日最新資訊28at.com

句子A:[1,2,2,1,1,1,0]Vgr28資訊網——每日最新資訊28at.com

句子B:[1,2,2,1,1,2,1]Vgr28資訊網——每日最新資訊28at.com

到這里就可以將兩個句子的相似度轉換為兩個向量的相似度,我們可以把這兩個句子想象為空間中的兩條線段,都是從原點[0,0,0...]出發,指向不同的方向,兩條線段形成一個夾角,如果夾角為0,意味著方向相同線段重合,如果夾角為90度意味著形成直角,完全不相似,因此我們可以通過夾角來判斷相似度,夾角越小就代表越相似。Vgr28資訊網——每日最新資訊28at.com

余弦相似度得到的結果較為精確,但當面對大量文本時,計算文本向量的時間復雜度很高,這可能會影響性能。Vgr28資訊網——每日最新資訊28at.com

1.2 simHash算法

simHash是谷歌提出來的一套用于文本去重的算法,將文本映射為一個01串,并且保證相似文本哈希之后得到的01串也是相似的,只在少數幾個位置上的0和1不一樣。為了表征原始文本的相似度,可以計算兩個01串之間在多少個位置上不同,這便是漢明距離,用來表征simHash算法下兩個文本之間的相似度,通常來說,越相似的文本,對應simHash映射得到的01串之間的漢明距離越小。舉例:t1=“直擊兒科急診現狀忙碌不止 兒科接診進行時 ”t2=“兒科急診現狀直擊不停忙碌 兒科接診進行時 ”;可以看到,上面這兩個字符串雖然只有幾個字不同,但是通過簡單的Hash算法得到的hash值可能就完全不一樣了,因而無法利用得到的hash值來表征原始文本的相似性。然而通過simHash算法的映射后,得到的simHash值便是如下:Vgr28資訊網——每日最新資訊28at.com

圖片圖片Vgr28資訊網——每日最新資訊28at.com

這兩個文本生成的兩個64位的01串只有標紅的3個位置不同。通常來說,用于相似文本檢測中的漢明距離判斷標準就是3,也就是說,當兩個文本對應的simHash之間的漢明距離小于或等于3,則認為這兩個文本為相似,如果是要去重的話,就只能留下其中一個。Vgr28資訊網——每日最新資訊28at.com

下圖為在各種漢明距離的情況下simhash算法的準確和召回率變化趨勢,可以看到在漢明距離為3時能夠達到較好的平衡:Vgr28資訊網——每日最新資訊28at.com

圖片圖片Vgr28資訊網——每日最新資訊28at.com

相比計算余弦相似度,simhash算法可以快速計算文本的哈希值,而且能夠在哈希值之間計算漢明距離,從而衡量文本的相似度。simhash算法的優點是它能夠快速處理大量文本,并且可以識別并過濾掉文本中的噪聲和重復內容。Vgr28資訊網——每日最新資訊28at.com

二、simhash實現步驟

1、分詞,把需要判重的文本分詞,形成去掉噪音詞的單詞序列并為每個詞加上權重。我們假設權重分為5個級別(1~5)。比如:“ 美國“51區”雇員稱內部有9架飛碟,曾看見灰色外星人 ” ==> 分詞后為 “ 美國(4) 51區(5) 雇員(3) 稱(1) 內部(2) 有(1) 9架(3) 飛碟(5) 曾(1) 看見(3) 灰色(4) 外星人(5)”,括號里的權重代表重要程度,數字越大越重要,這里我們采用ansj分詞器,tf-idf的方式計算權重。生成一個詞和對應權重的map。Vgr28資訊網——每日最新資訊28at.com

public static List/<String/> splitWords(String str) {   List/<String/> splitWords = new ArrayList/<String/>(1000);   Result terms = ToAnalysis.parse(str, forest);   for (int i = 0; i /< terms.size(); i++) {   Term term = terms.get(i);   String word = term.getName();   if (!"".equals(word.trim()) && !stopWords.contains(word)) {   splitWords.add(word);   }   }   return splitWords;   }     public Map/<String, Double/> extract(String str) {   List/<String/> words = WordsSegment.splitWords(str);  // 計算詞頻tf   int initialCapacity = Math.*max*((int) Math.*ceil*(words.size() / 0.75) + 1, 16);   Map/<String, Double/> wordmap = new HashMap/<String, Double/>(initialCapacity);   for (String word : words) {   if (!wordmap.containsKey(word)) {   wordmap.put(word, 1.0);   } else {   wordmap.put(word, wordmap.get(word) + 1);   }   }   Iterator/<Entry/<String, Double/>/> it = wordmap.entrySet().iterator();   while (it.hasNext()) {   Entry/<String, Double/> item = (Entry/<String, Double/>) it.next();   String word = item.getKey();   if (stopWords.contains(word) /|/| word.length() /< 2) {   it.remove();   continue;   }  // 計算權重idf   if (idfMap.containsKey(word)) {   double idf = wordmap.get(word) /* idfMap.get(word);   wordmap.put(word, idf);   } else {   double idf = wordmap.get(word) /* idfAverage;   wordmap.put(word, idf);   }   }   return wordmap;   }

2、hash,通過hash算法把每個詞變成hash值,比如“美國”通過hash算法計算為 100101,“51區”通過hash算法計算為 101011。這樣我們的字符串就變成了一串串數字,還記得文章開頭說過的嗎,要把文章變為數字計算才能提高相似度計算性能,現在是降維過程進行時。Vgr28資訊網——每日最新資訊28at.com

public static BigInteger fnv1aHash64(String str) {   BigInteger hash = FNV_64_INIT;   int len = str.length();   for (int i = 0; i /< len; i++) {     hash = hash.xor(BigInteger.valueOf(str.charAt(i)));   hash = hash.multiply(FNV_64_PRIME);   }   hash = hash.and(MASK_64);   return hash;  }

3、加權,通過2步驟的hash生成結果,需要按照單詞的權重形成加權數字串,比如“美國”的hash值為“100101”,通過加權計算為“4 -4 -4 4 -4 4”;“51區”的hash值為“101011”,通過加權計算為 “ 5 -5 5 -5 5 5”。Vgr28資訊網——每日最新資訊28at.com

4、合并,把上面各個單詞算出來的序列值累加,變成只有一個序列串。比如 “美國”的 “4 -4 -4 4 -4 4”,“51區”的 “ 5 -5 5 -5 5 5”, 把每一位進行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。這里作為示例只算了兩個單詞的,真實計算需要把所有單詞的序列串累加。Vgr28資訊網——每日最新資訊28at.com

5、降維,把4步算出來的 “9 -9 1 -1 1 9” 變成 0 1 串,形成我們最終的simhash簽名。如果每一位大于0 記為 1,小于0 記為 0。最后算出結果為:“1 0 1 0 1 1”。Vgr28資訊網——每日最新資訊28at.com

private void analysis(String content) {   Map/<String, Double/> wordInfos = wordExtractor.extract(content);   Map/<String, Double/> newwordInfo = valueUpSort(wordInfos);   wordInfos.entrySet().stream()   .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))   .forEachOrdered(x -/> newwordInfo.put(x.getKey(), x.getValue()));     double[] featureVector = new double[FNVHash.HASH_BITS];   Set/<String/> words = wordInfos.keySet();   for (String word : words) {   BigInteger wordhash = FNVHash.fnv1aHash64(word);   for (int i = 0; i /< FNVHash.HASH_BITS; i++) {   BigInteger bitmask = BigInteger.ONE.shiftLeft(FNVHash.HASH_BITS - i - 1);   if (wordhash.and(bitmask).signum() != 0) {   featureVector[i] += wordInfos.get(word);   } else {   featureVector[i] -= wordInfos.get(word);   }   }   }   BigInteger signature = BigInteger.ZERO;   StringBuffer hashBuffer = new StringBuffer();   for (int i = 0; i /< FNVHash.HASH_BITS; i++) {   if (featureVector[i] />= 0) {   signature = signature.add(BigInteger.ONE.shiftLeft(FNVHash.HASH_BITS - i - 1));   hashBuffer.append("1");   } else {   hashBuffer.append("0");   }   }   this.hash = hashBuffer.toString();   this.signature = signature;  }

算法部分流程圖如下:Vgr28資訊網——每日最新資訊28at.com

圖片圖片Vgr28資訊網——每日最新資訊28at.com

三、空間換時間提高排重速度

通過這種特殊的局部敏感哈希算法看起來是解決了相似性對比的問題,但是,檢索一條漢明距離小于給定閾值的simhash時間復雜度是O(n2) ,這在海量數據下使用的代價是昂貴的。Vgr28資訊網——每日最新資訊28at.com

為了解決這個問題,可以采用空間換時間的思路,假定漢明距離<3時認為文檔與給定文檔相似;每一個simHash都從高位到低位均分成4段,每一段都是16位。在建立倒排索引的過程中,這些截取出來的16位01串的片段,分別作為索引的key值,并將對應位置上具有這個片段的所有文本添加到這個索引的value域中。直觀上理解,首先有四個大桶,分別是1,2,3,4號(對應的是64位hash值中的第一、二、三、四段),在每一個大桶中,又分別有個小桶,這些小桶的編號從0000000000000000到1111111111111111.在建立索引時,每一個文本得到對應的simHash值后,分別去考察每一段(確定是1,2,3和4中的哪個大桶),再根據該段中的16位hash值,將文本放置到對應大桶中對應編號的小桶中。索引建立好后,由于相似文本一定會存在于某一個16位hash值的桶中,因此針對這些分段的所有桶進行去重(可以并行做),便可以將文本集合中的所有相似文本去掉。Vgr28資訊網——每日最新資訊28at.com

1、設漢明距離<n時認為文檔與給定文檔相似;Vgr28資訊網——每日最新資訊28at.com

2、將simhash值分為n段,則漢明距離<n時兩串simhash之間至少有一段完全相同;Vgr28資訊網——每日最新資訊28at.com

3、將信息保存到哈希表中,其中n段中的每一段都作為key,simhash值作為value。Vgr28資訊網——每日最新資訊28at.com

圖片圖片Vgr28資訊網——每日最新資訊28at.com

這樣,檢索速度最快為OO(1),最慢為O(n),遠優于原本的O(n^2),缺點是空間膨脹到原來的n倍。通常n為4,是一個可以接受的膨脹倍率。Vgr28資訊網——每日最新資訊28at.com

因此,我們把64位的01串分隔為4份,每份以key-list的結構存入redis中,當新的文章需要判斷時,則分四段分別到索引中查找。Vgr28資訊網——每日最新資訊28at.com

private void buildContenIndex(String docId, String simHash, String title, String url, String content_index_name, String eid, String oid) {   long storageTime = System.*currentTimeMillis*();   String simHashFragment1 = simHash.substring(0, 16);   String simHashFragment2 = simHash.substring(16, 32);   String simHashFragment3 = simHash.substring(32, 48);   String simHashFragment4 = simHash.substring(48, 64);     String redisKey1 = content_index_name + "_" + simHashFragment1;   String redisKey2 = content_index_name + "_" + simHashFragment2;   String redisKey3 = content_index_name + "_" + simHashFragment3;   String redisKey4 = content_index_name + "_" + simHashFragment4;     String value = docId + "http://001" + title + "http://001" + simHash + "http://001" + url + "http://001" + storageTime + "http://001" + eid;   NewRedisCrud.set2list(redisKey1, value, oid);   NewRedisCrud.set2list(redisKey2, value, oid);   NewRedisCrud.set2list(redisKey3, value, oid);   NewRedisCrud.set2list(redisKey4, value, oid);  }

四、總結

內容去重有很多應用場景,simhash作為谷歌選來作為網頁內容去重的一種算法,在海量數據去重的效率上有著明顯的速度優勢,相對傳統文本相似性方法,simhash的降維解決了計算量龐大的問題,但對短文本的去重準確率上有較明顯的欠缺,因此我們在了解業務的背景和需求后才能做出相對合理的選擇。Vgr28資訊網——每日最新資訊28at.com


Vgr28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-75291-0.htmlSimhash在內容去重中的應用,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Pingora正式開源:超強的Nginx替代品,每秒可處理4000萬請求!

下一篇: Java中的并發鎖是什么,提供一個使用并發鎖的實際案例

標簽:
  • 熱門焦點
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 電視息屏休眠仍有網絡上傳 愛奇藝被質疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(theSankei) 前不久,愛奇藝發布了一份亮眼的一季報,不僅營收和會員營收創造歷史最佳表現,其運營利潤也連續6個月實現增長。自去年年初
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久香蕉国产线看观看av| 亚洲欧洲三级电影| 国产精品盗摄久久久| 欧美日韩亚洲一区二区三区在线 | 久久精品国产69国产精品亚洲| 久久久久一区二区| 欧美日韩不卡一区| 国产精品永久免费观看| 精品91免费| 日韩午夜av在线| 久久er99精品| 欧美精品国产精品日韩精品| 国产精品久久久久久久久搜平片 | 欧美精品一区二区三区很污很色的| 欧美日韩一区二区三区在线看| 国产农村妇女精品一区二区| 亚洲国产精品va在看黑人| 亚洲一区三区在线观看| 老司机午夜免费精品视频 | 亚洲激情二区| 午夜精品视频网站| 欧美国产日韩在线观看| 国产情人综合久久777777| 最新高清无码专区| 欧美呦呦网站| 欧美激情精品久久久久| 国产午夜精品全部视频播放| 亚洲精品国精品久久99热| 欧美一级欧美一级在线播放| 欧美精品123区| 国产一区二区在线免费观看| 99综合在线| 久久偷窥视频| 国产精品美女久久久免费 | 亚洲精品国产精品国产自| 欧美一区二区高清在线观看| 欧美久久99| 在线观看欧美日韩| 欧美一级理论性理论a| 欧美日本二区| 在线免费观看日本欧美| 欧美一级久久久| 欧美日韩在线观看一区二区| 一区二区三区亚洲| 欧美一区二区三区在线观看视频 | 欧美日韩一区二区三区在线看| 狠狠爱www人成狠狠爱综合网 | 欧美特黄一级| 亚洲人午夜精品| 久久亚洲国产成人| 国产一区视频在线看| 亚洲欧美日韩国产另类专区| 欧美日韩国产色综合一二三四| 亚洲福利视频一区| 久久久久久9999| 国产精品一区二区你懂得| 夜夜嗨av一区二区三区网页| 欧美成人精品一区| 在线精品亚洲一区二区| 欧美在线你懂的| 国产老女人精品毛片久久| 亚洲视频视频在线| 欧美日韩另类综合| 亚洲精品麻豆| 男女av一区三区二区色多| 黄色成人精品网站| 久久久久9999亚洲精品| 国产亚洲精品自拍| 欧美专区在线观看一区| 国产无遮挡一区二区三区毛片日本| 亚洲午夜一区二区三区| 欧美三级在线| 亚洲桃色在线一区| 国产精品扒开腿做爽爽爽视频| 宅男噜噜噜66一区二区66| 欧美日韩一区二区国产| 一区二区欧美在线| 欧美三级日韩三级国产三级| 一区二区三欧美| 国产精品a久久久久| 亚洲网站视频福利| 国产精品免费aⅴ片在线观看| 亚洲一二三级电影| 国产精品美女在线| 欧美一二区视频| 国产午夜精品一区理论片飘花| 欧美一级大片在线观看| 国产一区二区三区免费观看| 久久精品视频在线观看| 精品99一区二区| 欧美va天堂| 亚洲精品美女91| 欧美日韩国产美| 亚洲一区二区三区欧美| 国产伦精品一区二区三区在线观看| 欧美伊人久久大香线蕉综合69| 国产欧美午夜| 久热精品视频在线| 亚洲精品免费电影| 欧美午夜电影网| 欧美一级淫片播放口| 韩国av一区二区三区四区| 毛片av中文字幕一区二区| 亚洲日本va在线观看| 欧美视频精品一区| 午夜视频在线观看一区二区三区| 国产亚洲一区二区精品| 媚黑女一区二区| 日韩亚洲欧美成人一区| 国产精品美女午夜av| 久久久久中文| 日韩视频免费观看| 国产精品久久久久秋霞鲁丝 | 国产精品日韩精品欧美精品| 久久九九国产精品| 亚洲精品中文字幕有码专区| 国产精品久久久久久妇女6080| 羞羞漫画18久久大片| 在线不卡视频| 欧美日韩小视频| 欧美一区二区视频网站| 亚洲国产精品国自产拍av秋霞| 欧美色视频日本高清在线观看| 欧美永久精品| 亚洲欧洲三级电影| 国产美女精品| 欧美成人一区二区三区片免费| 亚洲图片自拍偷拍| 国外视频精品毛片| 欧美日韩国产欧| 久久精品日韩欧美| 一区二区三区视频在线| 好看的日韩av电影| 欧美婷婷久久| 看欧美日韩国产| 中日韩美女免费视频网站在线观看| 国产亚洲网站| 欧美日韩一区二区三区免费| 久久久久九九视频| 亚洲视频在线观看免费| 精品二区久久| 国产精品久久久久国产精品日日| 老色批av在线精品| 香蕉久久夜色精品国产| 亚洲人成啪啪网站| 国产一区二区三区免费观看| 欧美日韩在线观看一区二区| 久久综合网络一区二区| 亚洲欧美国产制服动漫| 亚洲区免费影片| 国内一区二区三区在线视频| 国产精品豆花视频| 久久夜色精品国产欧美乱极品| 亚洲一区二区欧美日韩| 亚洲欧洲日产国码二区| 国产一区欧美日韩| 国产精品大片免费观看| 欧美精品v日韩精品v韩国精品v | 欧美日韩午夜在线视频| 久久永久免费| 欧美一级专区| 亚洲午夜精品久久| 最新国产成人av网站网址麻豆 | 国产欧美日韩一区二区三区在线| 欧美日韩国产在线观看| 久久一区二区精品| 欧美在线不卡| 亚洲一区国产精品| 99ri日韩精品视频| 亚洲国产日韩欧美一区二区三区| 国产一区二区三区成人欧美日韩在线观看 | 国产日韩一区二区三区在线| 欧美色网在线| 欧美久久久久久久久| 老司机精品视频网站| 性欧美办公室18xxxxhd| 亚洲无线一线二线三线区别av| 亚洲人成网站影音先锋播放| 亚洲成人资源| 好吊一区二区三区| 国产一区二区中文字幕免费看| 国产精品久久影院| 欧美性猛交视频| 欧美视频一区二区三区| 欧美日韩大陆在线| 欧美精品一区三区在线观看| 欧美成人免费小视频| 久久综合九色综合欧美狠狠| 久久久国产成人精品| 久久精品国产亚洲精品| 欧美一区二区福利在线| 午夜久久久久| 小黄鸭精品aⅴ导航网站入口| 亚洲在线观看| 亚洲欧美日韩精品久久亚洲区| 亚洲手机在线| 亚洲午夜av| 亚洲综合日本| 午夜精品美女自拍福到在线 | 欧美在线网站| 久久国产精品亚洲77777| 久久av一区二区| 久久―日本道色综合久久| 久久午夜羞羞影院免费观看|