算法-模糊匹配 计算权重, 并去除相似度数据

文章介绍了一个使用Python编写的函数,通过模糊匹配和自定义权重阈值来去除列表中的重复数据。它首先将字符串拆分并排序,然后计算两个字符串之间的重复字符比例,如果比例超过预设权重,则认为是重复项并删除。
摘要由CSDN通过智能技术生成

需求起因

处理多条数据的时候,可能会有重复, 导致数据冗余, 设想通过模糊匹配去除冗余数据

小明喜欢张红了三年,已经结婚了
小明和张红结婚了
今天是个好天气
是个好天气
我喜欢你

计划实现

目的: 去除列表的重复数据,
方法: 每条内容顺序打乱, 按文字内容进行匹配, 若重复权重 > 50% ,则算重复, 删除该条数据;
类似:

  1. 小明喜欢张红了三年,已经结婚了 一共十一个汉子,
  2. 小明和张红结婚了 有七个汉子重复, 权重= 8/15 ≈ 0.5714

代码逻辑

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : chairDu
# @Email : chair7@163.com
# @File : removeDuplication.py
# @DataTime : 2023-02-08 21:59:00
# @Description :去除重复
import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(__file__)))


def removeDuplication(countList: list, _weight = 0.5):
    """
    :param countList: 去除重复的列表
    :param _weight: 权重比例去除重复(0-1)
    :return: 去除重复的数据
    """
    fuzzyMatching = FuzzyMatching() #调用模糊匹配函数
    count1num = 0
    while count1num < len(countList):
        count1 = countList[count1num]   #循环第获取匹配数据
        count1num += 1
        for count2num in range(count1num, len(countList)):
            count2 = countList[count2num]   #得出要匹配的数据
            weight = fuzzyMatching.disorderWeight(count1, count2)
            # print(count1num, count2num, weight)
            if weight[2] > _weight : #如果乱序模糊匹配权重>0.5,删除匹配的数据
                countList.remove(count1)
                count1num-=1
                break
    # print(countList)
    return countList


class FuzzyMatching():
    """
    模糊匹配, 计算模糊匹配权重
    count1: 要匹配的对象
    cpunt2: 匹配的对象
    disorderWeight: 无序匹配后权重 权重=重复汉字/要匹配的对象数
    """
    def __init__(self, count1="", count2=""):
        self.count1 = count1
        self.count2 = count2
    def main(self):
        #暂不使用, 后续扩展其他匹配对象权重格式进行汇总使用
        Weihgt = []
        outOfOrdeWeihgt = self.disorderWeight(self.count1, self.count2)
        Weihgt.append(outOfOrdeWeihgt)
        print(Weihgt)
    def disorderWeight(self, count1, count2):    # 乱序匹配
        """
        :param count1: 要匹配的对象
        :param count2: 匹配的对象
        :return: 要匹配的对象, 匹配的对象, 权重
        """
        newCount1 = [i for i in count1 if i not in ",./<>?;':\"\[\]\{\}\\|~`!@#$%^&*()-_=+" ]  # 拆分列表1, 生成 newCount1
        # newCount2 = [i for i in count2 if i not in ",./<>?;':\"\[\]\{\}\\|~`!@#$%^&*()-_=+" ]  # 拆分列表2, 生成 newCount2
        newCount1.sort()    #去除重复
        # newCount2.sort()    #去除重复
        x = 0
        for i in newCount1:
            if i in count2:
                x += 1
        disorderWeight = round( x / len(newCount1), 4) #权重=重复汉字/要匹配的对象
        return count1, count2, disorderWeight

if __name__ == '__main__':
    demolist = ["小明喜欢张红,已经结婚了", "小明和张红结婚了"
        ,"今天是个好天气", "是个好天气"
        , "我喜欢你"
    ]
    print(demolist)
    demolist = removeDuplication(demolist)
    print(demolist)

实现效果

匹配前匹配后
小明喜欢张红,已经结婚了
小明和张红结婚了小明和小张结婚了
今天是个好天气
是个好天气是个好天气
我喜欢你我喜欢你

被删重复数据

小明喜欢张红,已经结婚了 > 小明和张红结婚了
今天是个好天气 > 是个好天气
我喜欢你 > 我喜欢你

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左左才

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

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

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

打赏作者

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

抵扣说明:

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

余额充值