Python Simhash & 海明距离:Excel 文本相似度计算和去重
以下是使用 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 文件,对指定列进行文本相似度计算和去重。 - 遍历每个文本,计算 Simhash 值,并与已保存的 Simhash 值比较海明距离,大于 3 则视为不同文本。
- 将去重后的结果保存为新的 Excel 文件。
- 对去重后的结果进一步过滤,删除海明距离小于等于 3 或相似度高于 0.8 的文本。
- 将最终过滤后的结果保存为新的 Excel 文件。
需要注意,此示例代码仅供参考,实际使用中可能需要根据具体情况进行调整。 Simhash 算法和海明距离只是一种文本相似度计算和去重的方法,不一定适用于所有情况,需要根据实际需求选择合适的算法。
原文地址: https://www.cveoy.top/t/topic/nDZG 著作权归作者所有。请勿转载和采集!