如何从列表中找到相似但不精确的值?

How to find similar values from list but not exact?

我有超过 50 万条城市名称记录,但数据输入不正确,例如单词 AHMADNAGAR 按以下方式输入,

 1. AEHMADNAGAR
 2. AHEMADNAGR
 3. AHMAD NAGAR
 4. AHMADNAGGAR

这只是一个城市的示例,我必须扫描超过 500k 条记录&想找到相似但不完全相似的词。

我创建了 .txt 文件并分享了 link,其中包含 17K 个城市,请参阅文件 Here

我尝试了什么?

from difflib import get_close_matches
        
def closeMatches(patterns, word):
    print(get_close_matches(word, patterns))

    
citylist=['AHMADNAGAR','XYZ','AEHMADNAGAR','AHEMADNAGR','AHMADNAGAR','AHMADNAGGAR','ABC','test','test2']
     for city in citylist:  
         closeMatches(patterns, city)

预期输出:(当我们通过 city 运行时它应该打印相似的值但不完全相似,即使我已经删除了相似的值,我们没有任何重复项)

example output of one city ( we have 500K cities, please check file, I included some of them there )

    AHMADNAGAR
    AEHMADNAGAR
    AHEMADNAGR
    AHMADNAGAR
    AHMADNAGGAR

这里的问题是,不能在这里传递 city 来手动创建 pattern & 另一件事是它没有显示所有变化。

我从朋友那里得知我们可以使用 regex,但是如何使用呢?有什么方法可以创建 regex runtime 并将其与所有记录匹配

只想获取相似城市列表

get_close_matches() 的第二个参数是一个列表,如果您只是想获得接近的匹配项,您可以 运行:

from difflib import get_close_matches
    
city_list = ['AHMADNAGAR','AEHMADNAGAR','AHEMADNAGR','AHMAD NAGAR', 'AHMADNAGGAR','test','test2']

close_matches = get_close_matches('AHMADNAGAR', city_list)
for close_match in close_matches:
    print(close_match)

您无需实现自己的循环或将 get_close_matches 包装在另一个函数中。只需向 get_close_matches 函数提供您要匹配的城市名称 ('AHMADNAGAR') 和可能的匹配列表。它默认为 3,因此如果需要更多,请指定更高的 n

>>> from difflib import get_close_matches
>>> citylist=['AHMADNAGAR','XYZ','AEHMADNAGAR','AHEMADNAGR','AHMADNAGAR','AHMADNAGGAR','ABC','test','test2']
>>> get_close_matches('AHMADNAGAR', citylist, n=len(citylist))
['AHMADNAGAR', 'AHMADNAGAR', 'AHMADNAGGAR', 'AEHMADNAGAR', 'AHEMADNAGR']

请注意,结果是按相似度排序的,因此完全匹配排在第一位,然后是最接近的匹配,依此类推

difflib 的文档在这里:https://docs.python.org/3/library/difflib.html