python - 如何根据用fuzzywuzzy比率计算的相似度得分从列表中消除重复字符串?
问题描述
假设有 4 个列表:
1) [12b, shanti vihar, 12b shanti bihar, 201 Anupam residency, 401 enclaves]
2) [12b, shanti vihar, 12b shanti bihar, 12b shanti bihar, 401 enclaves]
3) [12b, shanti vihar, 12b shanti vihar, 12b shanti bihar, 12b shanti bihar]
4) [12b, shanti vihar, 12b rue de Paris road, 201 Anupam residency, 401 enclaves]
将这 4 个列表插入到模糊匹配函数后,它应该根据模糊分数(超过 90%)删除重复的字符串并返回:
1) [12b, shanti vihar, 201 Anupam residency, 401 enclaves]
2) [12b, shanti vihar,401 enclaves]
3) [12b, shanti vihar]
4) [12b, shanti vihar, 12b rue de Paris road, 201 Anupam residency, 401 enclaves]
为了更清楚地说明情况 1) [12b, shanti vihar, 12b shanti bihar, 201 Anupam 居住地, 401 enclaves] 12b, shanti vihar 和 12b shanti bihar 是重复的(相同的地址或相同的含义),这就是为什么它们会有一个较高的模糊相似度得分(超过 90%)而其他的得分较低,因为它们不同。所以我只需要在最终输出中保留二分之一,即 [12b, shanti vihar, 201 Anupam 居住地, 401 enclaves]。类似情况 3)所有地址都相同,所以我在最终输出中只需要一个地址:[12b,shanti vihar]。
所以我试图实现这一点,但我不确定我是否以正确的方式做到这一点:
def fuzzydeduplicate(list_address):
list=[]
for i in list_address:
add_list=process.extract(i, list_address, scorer=fuzz.token_set_ratio)
list.append(add_list)
return list
调用此函数后,我得到的输出为:
[[('12b, shanti vihar', 100), ('12b, shanti bihar', 94), ('301 anupam residency', 28), ('13x', 11)], [('12b, shanti bihar', 100), ('12b, shanti vihar', 94), ('301 anupam residency', 28), ('13x', 11)], [('13x', 100), ('12b, shanti vihar', 11), ('12b, shanti bihar', 11), ('301 anupam residency', 9)], [('301 anupam residency', 100), ('12b, shanti vihar', 33), ('12b, shanti bihar', 28), ('13x', 9)]]
从这里我想根据相似度得分(超过 90%)消除重复的字符串并获得所需的输出。
谁能帮帮我吗?在执行这个?
解决方案
import pandas as pd
from fuzzywuzzy import fuzz
elements = ['12b, shanti vihar','12b, shanti bihar','401 enclaves','301 anupam residency']
remove = []
for (i, element) in enumerate(elements):
#print(element)
#print(i)
for (j, choice) in enumerate(elements[i+1:]):
#print(choice)
#print(j)
if fuzz.ratio(element, choice) >= 90:
print('duplicate index ='+ str(j+i+1))
remove.append(j+i+1)
#if choice not in remove:
#remove.append(choice)
print('///////')
remove_2 = []
for string in set(remove):
print(string)
print(elements[string])
remove_2.append(elements[string])
#del elements[string]
for i in remove_2:
elements.remove(i)
推荐阅读
- android - 如何在 Android Studio 运行时以编程方式设置构建变体?
- javascript - 如何使用 JavaScript 检测 JSP 是否加载到 PORTLET 或浏览器中?
- python - 按月份和这些月份的小时数对 pandas 数据框进行分组
- linux - 从bash中的给定日期减去月份
- database-design - 如何将富文本编辑器的状态存储在泛化到 Web 和移动应用程序的数据库中?
- laravel - Laravel 黄昏无法输入完整的输入
- android - 用安卓怎么做这样的设计,阴影怎么放?
- c - 如何从 phy_device 到 net_device?
- node.js - 用于在 Kubernetes 集群上部署的带有 Node 和 Nginx 映像的 React App 的 Dockerfile
- react-native - firebase.notifications().getInitialNotification() 在 IOS 中处于后台时不起作用