python實現Simhash處理大規模文字相似度

2021-10-07 08:19:03 字數 4531 閱讀 9247

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演算法產生的兩個簽名,如果相等,說明原始內容在一定概率下是相等的 如果不相等,除了說明原始內容不相等外,不再提供任何資訊...