日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

simhash 介绍以及应用场景

發(fā)布時間:2024/3/26 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 simhash 介绍以及应用场景 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

simhash 算法是一種局部敏感的哈希算法,能實現(xiàn)相似文本內(nèi)容的去重。

與信息摘要算法的區(qū)別

信息摘要算法:如果兩者原始內(nèi)容只相差一個字節(jié),所產(chǎn)生的簽名也很有可能差別很大。

simhash 算法: 如果原始內(nèi)容只相差一個字節(jié),所產(chǎn)生的簽名差別非常小。

simhash值的對比: 通過兩者的 simhash 值的二進制位的差異來表示原始文本內(nèi)容的差異。差異的個數(shù)又被稱為海明距離。

注意:
simhash 對長文本 500字+ 比較適用,短文本可能偏差比較大。

在 google 的論文給出的數(shù)據(jù)中,64 位的simhash值,在海明距離為 3 的情況下,可認(rèn)為兩篇文檔是相似的或者說是重復(fù)的。當(dāng)然這個值只是參考值,針對自己的應(yīng)用可能有不同的測試取值。

Python 中的 simhash 模塊

使用 python 實現(xiàn) simhash 算法,該模塊得出的 simhash 值的長度是 64 位。

github 地址: https://github.com/leonsim/simhash

接著我們來看一下簡單的示例:

# 測試 simhash 庫的簡單使用 # pip install simhashimport re from simhash import Simhashdef get_features(s):"""對文本全部轉(zhuǎn)小寫 去掉空白字符以及標(biāo)點符號 :param s: :return: """width = 3s = s.lower()s = re.sub(r'[^\w]+', '', s)return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]# 計算出這幾個文本的 simhash 值 print('%x' % Simhash(get_features('How are you? I am fine. Thanks.')).value) print('%x' % Simhash(get_features('How are u? I am fine. Thanks.')).value) print('%x' % Simhash(get_features('How r you?I am fine. Thanks.')).value)

其實,由此我們也可以知道,在進行simhash之前,進行一定的預(yù)處理是非常重要的。

獲取兩個 simhash 值之間的距離:

print(Simhash('furuiyang').distance(Simhash('yaokailun'))) print(Simhash('furuiyang').distance(Simhash('ruanyifeng'))) print(Simhash('ruiyang').distance(Simhash('ruiyang')))

一般我們在爬蟲項目中使用 simhash 的模式:

"""以一種更加通用的模式去運用海明距離"""import re from simhash import Simhash, SimhashIndexdef get_features(s):"""對文本進行預(yù)處理轉(zhuǎn)小寫;去除空白字符以及標(biāo)點符號:param s::return:"""width = 3s = s.lower()s = re.sub(r'[^\w]+', '', s)return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]# 我們已經(jīng)存在的數(shù)據(jù) data = {1: u'How are you? I Am fine. blar blar blar blar blar Thanks.',2: u'How are you i am fine. blar blar blar blar blar than',3: u'This is simhash test.', } # 由初始數(shù)據(jù)建立的 key 以及 simhash 值的對象集 objs = [(str(k), Simhash(get_features(v))) for k, v in data.items()] # 建立索引 可索引到的相似度海明距離是 3 index = SimhashIndex(objs, k=3) print(index.bucket_size()) # 11 # 計算一個新來數(shù)據(jù)的 simhash 值 s1 = Simhash(get_features(u'How are you i am fine. blar blar blar blar blar thank')) # 找到數(shù)據(jù)庫中與此最接近的一個 simhash 值的索引 print(index.get_near_dups(s1)) # 將新數(shù)據(jù)添加到原有的索引中 index.add('4', s1) print(index.get_near_dups(s1))

如果我們要在實際項目上使用 simhash 計算,很顯然需要保存這個索引對象 。
因此我們可以考慮使用 序列化工具。

序列化工具: 將一個對象轉(zhuǎn)換為二進制的一個數(shù)據(jù)。
反序列化工具: 將二進制恢復(fù)為一個對象。

后記

大姨媽來的一天,實在是有點疼。不過過了艱難的第一天,就又可以活蹦亂跳了。人生也是這樣吧,過了最艱難的時候,其實處于通途的時刻還是會有的。

可是,總之,也不想自己說消極的話而已。

更新時間: 2020-02-04

總結(jié)

以上是生活随笔為你收集整理的simhash 介绍以及应用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。