2

我正在尝试使用 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

问题是 CountryName 数据相当脏......样本的简短列表是

危地马拉,中国 T,哥伦比亚,墨西哥,香港

有谁知道是否有一个包可以返回给定 cntry_name 的最佳“猜测”匹配?我会很高兴有些人因为困难而被拒绝(即中国 T -> 台湾)。如果 best_guess 返回关于“猜测”的确定性度量,那就太好了。

4

1 回答 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()

matching_countries 将包含相似的国家名称列表。您可以使用选项 n 和截止参数指定返回的结果数和匹配的敏感性。

注意:get_close_matches 方法区分大小写,因此您可能希望在查找匹配项之前将所有内容转换为小写。

我通过 get_close_matches 运行了您获得的样本数据,它适用于除台湾以外的所有地区。

如果您有许多已知的棘手匹配项,则值得放入一个包含常见困难输入数据的字典,例如“China T”来手动处理这些异常。当然,如果输入数据比较一致,使用简单的字典查找可能是最好的选择。

于 2013-03-13T06:54:34.390 回答