使用python利用simhash算法和海明距离对Excel文件的指定一列进行文本相似度计算和去重删除海明距离大于3和相似度高于08的文本
以下是一个使用Python实现simhash算法和海明距离对Excel文件指定一列进行文本相似度计算和去重的示例代码:
import pandas as pd
import hashlib
import numpy as np
def simhash(text):
# 分词
words = text.split()
# 初始化特征向量
v = np.zeros(128)
# 对每个分词进行hash,然后根据哈希值的二进制位是否为1,对特征向量进行加减操作
for word in words:
h = hashlib.md5(word.encode('utf-8')).hexdigest()
for i in range(len(h)):
if h[i] == '1':
v[i] += 1
else:
v[i] -= 1
# 根据特征向量的正负值,生成simhash值
simhash_value = ''
for i in range(len(v)):
if v[i] >= 0:
simhash_value += '1'
else:
simhash_value += '0'
return simhash_value
def hamming_distance(s1, s2):
# 计算两个simhash值的海明距离
return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])
def remove_duplicates(file_path, col_name):
# 读取Excel文件
df = pd.read_excel(file_path)
# 对指定列的每个文本计算simhash值,并将simhash值作为新的一列
df['simhash'] = df[col_name].apply(simhash)
# 初始化去重结果列表
unique_texts = []
# 遍历每个simhash值,如果当前simhash值与已保存的simhash值的海明距离大于3,则将当前文本加入去重结果列表
for i in range(len(df)):
text = df.loc[i, col_name]
simhash_value = df.loc[i, 'simhash']
is_duplicate = False
for unique_text in unique_texts:
if hamming_distance(unique_text['simhash'], simhash_value) <= 3:
is_duplicate = True
break
if not is_duplicate:
unique_texts.append({'text': text, 'simhash': simhash_value})
# 将去重结果列表转换成DataFrame格式,并保存为Excel文件
unique_df = pd.DataFrame(unique_texts)
unique_df.to_excel('unique_' + file_path, index=False)
# 删除海明距离大于3和相似度高于0.8的文本
filtered_texts = []
for i in range(len(unique_df)):
text = unique_df.loc[i, 'text']
simhash_value = unique_df.loc[i, 'simhash']
is_duplicate = False
for filtered_text in filtered_texts:
if hamming_distance(filtered_text['simhash'], simhash_value) <= 3 or \
(len(text) > 0 and len(filtered_text['text']) > 0 and
len(set(text.split()) & set(filtered_text['text'].split())) / \
(len(set(text.split())) + len(set(filtered_text['text'].split()))) > 0.8):
is_duplicate = True
break
if not is_duplicate:
filtered_texts.append({'text': text, 'simhash': simhash_value})
# 将去重并过滤的结果保存为Excel文件
filtered_df = pd.DataFrame(filtered_texts)
filtered_df.to_excel('filtered_' + file_path, index=False)
# 示例用法
remove_duplicates('example.xlsx', 'text_column')
这个代码做了以下事情:
- 定义了一个
simhash函数,用于计算一个字符串的simhash值。 - 定义了一个
hamming_distance函数,用于计算两个simhash值的海明距离。 - 定义了一个
remove_duplicates函数,用于对Excel文件的指定一列进行文本相似度计算和去重。 - 在
remove_duplicates函数中,首先读取Excel文件,然后对指定列的每个文本计算simhash值,并将simhash值作为新的一列。 - 然后遍历每个simhash值,如果当前simhash值与已保存的simhash值的海明距离大于3,则将当前文本加入去重结果列表。
- 将去重结果列表转换成DataFrame格式,并保存为Excel文件。
- 最后,删除海明距离大于3和相似度高于0.8的文本,并将去重并过滤的结果保存为Excel文件。
注意,这个示例代码仅供参考,实际使用时需要根据具体情况进行调整。另外,simhash算法和海明距离仅是一种文本相似度计算和去重的方法,不一定适用于所有情况,需要根据具体需求进行选择
原文地址: https://www.cveoy.top/t/topic/diHO 著作权归作者所有。请勿转载和采集!