pycountries: 将国家名称(可能不完整)转换为国家代码

2 投票
1 回答
3169 浏览
提问于 2025-04-17 18:54

我正在尝试使用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”这样的常见难输入数据。当然,如果输入数据比较一致,使用简单的字典查找可能是最好的选择。

撰写回答