2013-03-13 172 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」)的字典手動處理這些異常。當然,如果輸入數據相對一致,使用簡單的字典查找可能是最好的選擇。

相關問題