simhash 演算法是一種區域性敏感的雜湊演算法,能實現相似文字內容的去重。
資訊摘要演算法:如果兩者原始內容只相差乙個位元組,所產生的簽名也很有可能差別很大。
simhash 演算法: 如果原始內容只相差乙個位元組,所產生的簽名差別非常小。
simhash值的對比: 通過兩者的 simhash 值的二進位制位的差異來表示原始文字內容的差異。差異的個數又被稱為海明距離。
注意:simhash 對長文字 500字+ 比較適用,短文本可能偏差比較大。
在 google 的**給出的資料中,64 位的simhash值,在海明距離為 3 的情況下,可認為兩篇文件是相似的或者說是重複的。當然這個值只是參考值,針對自己的應用可能有不同的測試取值。
使用 python 實現 simhash 演算法,該模組得出的 simhash 值的長度是 64 位。
接著我們來看一下簡單的示例:
# 測試 simhash 庫的簡單使用
# pip install simhash
import re
from simhash import simhash
def get_features(s):
"""對文字全部轉小寫 去掉空白字元以及標點符號
:param s:
:return:
"""width = 3
s = 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之前,進行一定的預處理是非常重要的。
獲取兩個 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, simhashindex
def get_features(s):
"""對文字進行預處理
轉小寫;去除空白字元以及標點符號
:param s:
:return:
"""width = 3
s = s.lower()
s = re.sub(r'[^\w]+', '', s)
return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]
# 我們已經存在的資料
data =
# 由初始資料建立的 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
# 計算乙個新來資料的 simhash 值
s1 = simhash(get_features(u'how are you i am fine. blar blar blar blar blar thank'))
# 找到資料庫中與此最接近的乙個 simhash 值的索引
print(index.get_near_dups(s1))
# 將新資料新增到原有的索引中
index.add('4', s1)
print(index.get_near_dups(s1))
如果我們要在實際專案上使用 simhash 計算,很顯然需要儲存這個索引物件 。
因此我們可以考慮使用 序列化工具。
序列化工具: 將乙個物件轉換為二進位制的乙個資料。
反序列化工具: 將二進位制恢復為乙個物件。
大姨媽來的一天,實在是有點疼。不過過了艱難的第一天,就又可以活蹦亂跳了。人生也是這樣吧,過了最艱難的時候,其實處於通途的時刻還是會有的。
可是,總之,也不想自己說消極的話而已。
MOSS 應用場景介紹
最近總是看到很多人都在問 sharepoint究竟能作什麼?都用來作了什麼?微軟moss 經過多年發展,已經演化到2010版本了。這裡我把自己接觸到的moss的應用場景中的一部分說下,可能也不是很全,希望能給大家一些啟發,能激發出更好的想法,作為拋磚引玉。第一 自定義列表的應用 自定義列表因為非常靈...
Kafk的優勢以及應用場景
kafak是一種分布式的,基於發布 訂閱的訊息系統。以時間複雜度為o 1 的方式提供訊息持久化能力,即使對tb級以上資料也能保證常數時間複雜度的訪問效能。高吞吐率。即使在非常廉價的商用機器上也能做到單機支援每秒100k條以上訊息的傳輸。支援kafka server間的訊息分割槽,及分布式消費,同時保...
vue mixins 合併策略以及應用場景
混合 mixins 是一種分發 vue 元件中可復用功能的非常靈活的方式。混合物件可以包含任意元件選項。當元件使用混合物件時,所有混合物件的選項將被混入該元件本身的選項。具體合併策略 1 data mixins中的data會合併到data中,有衝突的話,data中資料覆蓋mixins中的資料。2 鉤...