以下是一个使用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. remove_duplicates函数中,首先读取Excel文件,然后对指定列的每个文本计算simhash值,并将simhash值作为新的一列。
  5. 然后遍历每个simhash值,如果当前simhash值与已保存的simhash值的海明距离大于3,则将当前文本加入去重结果列表。
  6. 将去重结果列表转换成DataFrame格式,并保存为Excel文件。
  7. 最后,删除海明距离大于3和相似度高于0.8的文本,并将去重并过滤的结果保存为Excel文件。

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

使用python利用simhash算法和海明距离对Excel文件的指定一列进行文本相似度计算和去重删除海明距离大于3和相似度高于08的文本

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

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