需求起因
处理多条数据的时候,可能会有重复, 导致数据冗余, 设想通过模糊匹配去除冗余数据
小明喜欢张红了三年,已经结婚了
小明和张红结婚了
今天是个好天气
是个好天气
我喜欢你
计划实现
目的: 去除列表的重复数据,
方法: 每条内容顺序打乱, 按文字内容进行匹配, 若重复权重 > 50% ,则算重复, 删除该条数据;
类似:
- 小明喜欢张红了三年,已经结婚了 一共十一个汉子,
- 小明和张红结婚了 有七个汉子重复, 权重= 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)
实现效果
匹配前 | 匹配后 |
小明喜欢张红,已经结婚了 | |
小明和张红结婚了 | 小明和小张结婚了 |
今天是个好天气 | |
是个好天气 | 是个好天气 |
我喜欢你 | 我喜欢你 |
被删重复数据
小明喜欢张红,已经结婚了 > 小明和张红结婚了今天是个好天气 > 是个好天气
我喜欢你 > 我喜欢你