用Jaccard相似度对中文段文本进行去重

本专栏更新一些python代码,旨在为新手提供学习内容。本人也会持续输出有价值的内容,欢迎关注。你的关注和点赞是我最的动力,谢谢。

Jaccard就不多介绍了,主要原理可以看站内跳转

实习的时候做新闻文本去重的时候希望筛选一下标题,标题一般十几二十个子,用jaccard配合jieba效果好速度快,下面是核心代码

"""
#!/usr/bin/env python
# -*- coding: utf-8 -*-
------------------------------
# @Author  : aikey
# @Github  : @aikeywitt
# @Time    : 2024/01/11 16:23
# @File    : deduplicator.py
------------------------------
"""
import pandas as pd
import jieba
from config import *

# 设置停用词和标点
punctuation = set(r'./ <>_-=,"。?!“”:‘’@#¥%…&×()——+【】{};;●~|\\s:[]')


class Jaccard:
    def __init__(self, _len):
        self._len = _len
        self.savePath = os.path.join(APPPATH, 'data')
        with open(STOPWORDS_FILE, 'r', encoding='utf-8') as f:
            self.stopwords = set([w.strip() for w in f.readlines()])

    def cut2list(self, paragraph):
        paragraph = ''.join(ch for ch in paragraph if ch not in punctuation)
        words = [w for w in jieba.cut(paragraph) if w not in self.stopwords and w not in punctuation]
        word_set = [''.join(words[i:i + self._len]) for i in range(0, len(words), self._len)]
        return word_set

    def jaccard(self, str1, str2):
        # 确保 str1 和 str2 是字符串
        str1 = str(str1) if not isinstance(str1, str) else str1
        str2 = str(str2) if not isinstance(str2, str) else str2

        set1, set2 = set(self.cut2list(str1)), set(self.cut2list(str2))
        intersection = len(set1.intersection(set2))
        union = len(set1) + len(set2) - intersection
        return float(intersection / union) if union != 0 else 0


if __name__ == '__main__':
    data = pd.read_excel(DATA_FILE, engine='openpyxl')
    jaccard = Jaccard(1)  # 这里假设每个词组长度为1

    # 初始化重复标记列
    data['Duplicate'] = 1

    # 用于记录已标记为重复的行索引
    marked_as_duplicate = set()

    # 生成重复项标记
    num = data.shape[0]
    for i in range(num):
        for j in range(i+1, num):  # 只比较不同的标题组合
            if jaccard.jaccard(data.iloc[i]['Title'], data.iloc[j]['Title']) > 0.5:
                if i not in marked_as_duplicate and j not in marked_as_duplicate:
                    # 标记为重复
                    data.at[j, 'Duplicate'] = 0
                    marked_as_duplicate.add(j)  # 添加到已标记集合

    # 写回原始的 Excel 文件
    data.to_excel(DATA_FILE, index=False)

感谢看到最后,我是牛有果,如果这篇文章帮到你,请点一个免费的关注和赞,谢谢,有问题可以在评论区留言。
请添加图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛有果真的是你啊啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值