首页 > 解决方案 > 如何根据用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%)消除重复的字符串并获得所需的输出。

谁能帮帮我吗?在执行这个?

标签: pythonfuzzywuzzy

解决方案


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)



推荐阅读