simhash 介紹以及應用場景

2021-10-02 13:14:23 字數 2560 閱讀 2833

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 鉤...