如何从列表中找到相似但不精确的值?
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
我有超过 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