我正在尝试使用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数据相当脏......一个简短的样本列表是
GUATMAL,CHINA T,COLOMB,MEXICO,HG KONG
有没有人知道在给定cntry_name的情况下是否有一个包返回最佳“猜测”匹配?我会很高兴有些人因困难而被拒绝(即中国T - >台湾)。如果best_guess返回了一个关于'guess'的确定性的话,那就太好了。
答案 0 :(得分: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和cutoff参数指定返回的结果数和匹配的灵敏度。
注意:get_close_matches方法区分大小写,因此您可能希望在查找匹配项之前将所有内容转换为小写。
我运行了你通过get_close_matches获得的样本数据,除了台湾之外,它都适用于所有人。
如果您有许多已知的棘手匹配,那么可能值得将常用的输入数据字典(如“China T”)用于手动处理这些异常。当然,如果输入数据相对一致,使用简单的字典查找可能是最好的选择。