以下是使用 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')

代码实现的主要步骤包括:

  1. 定义 simhash 函数计算文本的 Simhash 值。
  2. 定义 hamming_distance 函数计算两个 Simhash 值的海明距离。
  3. 定义 remove_duplicates 函数,读取 Excel 文件,对指定列进行文本相似度计算和去重。
  4. 遍历每个文本,计算 Simhash 值,并与已保存的 Simhash 值比较海明距离,大于 3 则视为不同文本。
  5. 将去重后的结果保存为新的 Excel 文件。
  6. 对去重后的结果进一步过滤,删除海明距离小于等于 3 或相似度高于 0.8 的文本。
  7. 将最终过滤后的结果保存为新的 Excel 文件。

需要注意,此示例代码仅供参考,实际使用中可能需要根据具体情况进行调整。 Simhash 算法和海明距离只是一种文本相似度计算和去重的方法,不一定适用于所有情况,需要根据实际需求选择合适的算法。

Python Simhash & 海明距离:Excel 文本相似度计算和去重

原文地址: https://www.cveoy.top/t/topic/nDZG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录