【问题标题】:How to find similar values from list but not exact?如何从列表中找到相似但不准确的值?
【发布时间】:2021-03-27 17:03:54
【问题描述】:

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

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

这是仅一个城市的示例,我必须扫描超过 50 万条记录并希望找到相似但不完全相似的单词。

我创建了 .txt 文件并分享了链接,其中包括了 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 是您想要使用的,但您正在反向使用它。您能否扩展您的代码以包含 citylist 和所需的输出?
  • 我刚刚更新了所需的输出,您可以检查一下吗?
  • 在您的示例中,您只需要匹配一个城市 (AHMADNAGAR),这使得这只是对 get_close_matches 的一次简单调用。
  • 注意:我希望从您的描述中得到两个列表——一个(拼写正确的)城市名称列表和一个(可能拼写错误的)用户输入列表。如果这确实是您要解决的问题,请更新您的示例以显示列表和预期输出!

标签: python regex list bigdata


【解决方案1】:

您无需实现自己的循环或将get_close_matches 包装在另一个函数中。只需提供您要匹配的城市名称 ('AHMADNAGAR') 和get_close_matches 函数的可能匹配列表。默认为 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

【讨论】:

  • 您好,我刚刚分享了一个包含我记录中 17K 城市的文件的链接,AHMADNAGAR 只是一个例子,我想遍历每个城市并找到类似的,但不准确
  • 请将您的代码更新为具有城市列表、示例输入列表以及基于这些输入的预期输出的最小可重现示例。您提供的示例与您尝试构建的内容并不真正匹配,因为所有输入都对应于同一个城市。
【解决方案2】:

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)

【讨论】:

  • 我会尝试这样做,同时,我更新了一些有问题的代码,如果你能检查一下,提前谢谢
  • 我刚刚检查过它没有打印这些值AEHMADNAGAR, AHEMADNAGR
  • @KaustubhKulkarni 我正在调查。此外,您在第 5 项的逗号前缺少撇号
  • 好的,我修正了逗号,也在这里,以防我们只是通过一个城市,但实际上我们需要一次发送多个城市,所以我遍历了城市列表,但它显示了意外的输出``` for d in city_list: close_matches = get_close_matches(d, city_list) for close_match in close_matches: print(close_match)```
  • @KaustubhKulkarni 请更新您的问题,以包括您对多个城市的预期输入。我想我不明白你在做什么
猜你喜欢
  • 2012-12-26
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多