pycountries: 将国家名称(可能不完整)转换为国家代码
我正在尝试使用pycountries库将一份国家名称的数据转换为ISO3166国家代码(alpha3)。我的基本函数是这样的:
import pycountries as pc
def guess_country(data, output='alpha3', verbose=False):
#Check Data isn't already in Alpha3
try:
country = pc.countries.get(alpha3=data)
return country
except:
pass #KeyError Raised, data doesn't directly match
#Check if Country is Actual CountryName
try:
country = pc.countries.get(name=data)
return country
except:
pass #KeyError Raised, data doesn't directly match
#Check RegExpr of 'data' in an attempt to match
问题是这些国家名称的数据有点乱……这里有一小部分示例:
GUATMAL, CHINA T, COLOMB, MEXICO, HG KONG
有没有人知道有没有什么工具可以根据国家名称给出最好的“猜测”匹配?我可以接受一些比较难的名称被拒绝(比如说,China T可以被认为是台湾)。如果这个“最佳猜测”能给出一个关于猜测准确度的评分就更好了。
1 个回答
5
你可以使用 difflib(这是Python自带的一个库)来选择相似的国家名称:
import difflib
country_names = [x.name.lower() for x in pycountry.countries]
matching_countries = difflib.get_close_matches(data, country_names)
confidence = difflib.SequenceMatcher(None, matching_countries[0], data).ratio()
在这个匹配的国家列表中,会包含一些相似的国家名称。你可以通过设置n和cutoff这两个选项来指定返回结果的数量和匹配的灵敏度。
注意:get_close_matches这个方法是区分大小写的,所以在查找匹配之前,你可能需要把所有的字母都转换成小写。
我用你提供的示例数据运行了一下get_close_matches,结果除了台湾以外都能正常工作。
如果你知道有一些特别难匹配的情况,可以考虑建立一个字典,专门处理像“China T”这样的常见难输入数据。当然,如果输入数据比较一致,使用简单的字典查找可能是最好的选择。