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、コロン、メキシコ、HG KONG

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 と cutoff 引数を使用して、返される結果の数と一致の感度を指定できます。

注: get_close_matches メソッドは大文字と小文字を区別するため、一致を探す前にすべてを小文字に変換することをお勧めします。

get_close_matches を使用してサンプル データを実行したところ、台湾以外のすべてで機能しました。

既知のトリッキーな一致が多数ある場合は、これらの例外を手動で処理するために、'China T' などの一般的な困難な入力データのディクショナリを配置する価値があります。もちろん、入力データが比較的一貫している場合は、単純な辞書検索を使用するのが最適なオプションかもしれません。

于 2013-03-13T06:54:34.390 に答える