需求起因

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

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

计划实现

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

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

代码逻辑

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : chairDu
# @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)

实现效果

匹配前

匹配后

小明喜欢张红,已经结婚了

小明和张红结婚了

小明和小张结婚了

今天是个好天气

是个好天气

是个好天气

我喜欢你

我喜欢你

被删重复数据

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