simhash–顧名思義,通過hash值比較相似度,通過兩個字串得出來的hash值,進行異或操作,然後得到相差的個數,數字越大則差異越大。
1、用分詞工具(jieba、nlpir、哈工大分詞器等)對字串進行分詞、去除停用詞,英文除外;
seg = jieba.cut(
str)
keyword = jieba.analyse.extract_tags(
'|'.join(seg)
, topk=
20, withweight=
true
, allowpos=()
)
for i in feature:
if i ==
'1':
else
:-weight)
list1 = np.
sum(np.array(keylist)
, axis=
0)
1、用hash得出來的hash值兩兩進行比較;
t1 =
'0b'
+ self.sim1
t2 =
'0b'
+ self.sim2
n =int
(t1,2)
^int
(t2,
2)
2、通過異或比較,得處simhash值。
i =
0while n:
n &=(n -1)
i +=
1return i
如何使用simhash處理大規模文字資料,原理很簡單,以上步驟我們可以計算兩個字串之間的相似度,引申這種思想,對文字中的資料進行處理。
其中使用到了排序的思路,我們對文字中的資料進行兩兩比較,那麼本身不用比,本身和後面字串比較過的也不必比較,那就是乙個對角矩陣,即i與i+1個元素對比。
for i in
range
(len
(list)-
1):for y in
range
(i+1
,len
(list
))
以上為在處理大規模文字相似度時所用到的simhash思想。
# -*- coding: utf-8 -*-
# !/usr/bin/env python
'''function:python實現大規模simhash對比
time:2020-06-19 14:32:10
author:為援不可圖
'''import jieba
import jieba.analyse
import numpy as np
# 獲取字串對應的hash值
class
simhashstr()
:def
__init__
(self,
str)
: self.
str=
str# 得到輸入字串的hash值
defget_hash
(self)
:# 結巴分詞
seg = jieba.cut(self.
str)
keyword = jieba.analyse.extract_tags(
'|'.join(seg)
, topk=
20, withweight=
true
, allowpos=()
) keylist =
# 獲取每個詞的權重
for feature, weight in keyword:
weight =
int(weight *20)
feature = self.string_hash(feature)
temp =
for i in feature:
if i ==
'1':
else
:-weight)
list1 = np.
sum(np.array(keylist)
, axis=0)
# 獲取simhash值
simhash =
''for i in list1:
# 對特徵標準化表示
if i >0:
simhash = simhash +
'1'else
: simhash = simhash +
'0'return simhash
defstring_hash
(self, feature)
:if feature =="":
return
0else
:# 將字元轉為二進位制,並向左移動7位
x =ord(feature[0]
)<<
7 m =
1000003
mask =2**
128-
1for c in feature:
x =((x * m)
^ord
(c))
& mask
x ^=len
(feature)
if x ==-1
: x =-2
x =bin(x)
.replace(
'0b',''
).zfill(64)
[-64:
]return
str(x)
# 比較兩個字串的相似度
class
simliary()
:def
__init__
(self, sim1, sim2)
: self.sim1 = sim1
self.sim2 = sim2
# 比較兩個simhash值的相似度
defcom_sim
(self)
:# 轉為二進位制結構
t1 =
'0b'
+ self.sim1
t2 =
'0b'
+ self.sim2
n =int(t1,2)
^int
(t2,2)
# 相當於對每一位進行異或操作
i =0while n:
n &=(n -1)
i +=
1return i
#比較大量文字中資料之間的相似度
class
com_file_data_sim()
:def
__init__
(self, path)
: self.path = path
# 獲取檔案中的資料列表
defget_file_data
(self)
: content_txt =
with
open
(self.path,
'r', encoding=
'utf-8'
)as f:
lines = f.readlines(
)for line in lines:
content = line.strip(
)return content_txt
# 對列表中的資料進行hash值比對
defcom_data_sim
(self)
: content_data = self.get_file_data(
)for i in
range
(len
(content_data)-1
):for y in
range
(i +1,
len(content_data)):
str1 = content_data[i]
str2 = content_data[y]
sim1 = simhashstr(str1)
.get_hash(
) sim2 = simhashstr(str2)
.get_hash(
) sim = simliary(sim1, sim2)
.com_sim(
)print
(str1 +
' '+ str2 +
' '+
'\n'
+'simhash值為:'
+str
(sim)
)if __name__ ==
'__main__'
: com_file_data_sim(
'com.txt'
).com_data_sim(
)
本程式參考自並在原基礎上進行了說明和改善。 simHash介紹及python實現
simhash演算法是googlemoses charikear於2007年發布的一篇 detecting near duplicates for web crawling 中提出的,專門用來解決億萬級別的網頁去重任務。simhash是區域性敏感雜湊 locality sensitve hash 的...
SIMhash演算法原理
第一次聽說google的simhash演算法 1 時,我感到很神奇。傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上相當於偽隨機數產生演算法。傳統hash演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...
simhash演算法的原理
第一次聽說google的simhash演算法 1 時,我感到很神奇。傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上相當於偽隨機數產生演算法。傳統hash演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...