2013-03-13 239 views
1

我想使用pycountries库将国家名称数据列表转换为ISO3166国家/地区代码(alpha3)。我的基本功能是:pycountries:将国家/地区名称(可能不完整!)转换为国家代码

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,中国T,COLOMB,墨西哥,HG KONG

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

+0

我想我可能会根据'pycontries'数据库进行映射,并使用'difflib'来获得最接近的匹配。应该是相当直接的... – root 2013-03-13 06:03:00

+0

我会阅读difflab ...谢谢。正在考虑使用naivebayes将基于'字母'的猜测词作为特征集返回,这会让我对猜测的准确性有所了解 – sanguineturtle 2013-03-13 06:48:51

回答

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”)的字典手动处理这些异常。当然,如果输入数据相对一致,使用简单的字典查找可能是最好的选择。

相关问题