【问题标题】:How to eliminate the duplicate string from the list based on similarity score calculated with fuzzywuzzy ratio?如何根据用fuzzywuzzy比率计算的相似度得分从列表中消除重复字符串?
【发布时间】:2021-02-11 17:09:35
【问题描述】:

假设有 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个列表插入到fuzzymatch函数后,它应该根据模糊分数(超过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%)消除重复的字符串并获得所需的输出。

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

【问题讨论】:

    标签: python fuzzywuzzy


    【解决方案1】:
    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)
    
    
    

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2023-01-09
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多