2017-06-29 31 views
3

辞書に複数の単語のための近い試合を得る:Pythonの私は、次のような構造を持つ辞書を持っている

{ 
    1: {"names": ["name1_A", "name1_B", ...]}, 
    2: {"names": ["name2_A", "name2_B", ...]}, 
    ... 
} 

どこname1_Aname1_B IDで同じ名前を書くための同義語/エイリアス/さまざまな方法があります1. name2_Aname2_Bは、同じ名前のエイリアスで、IDは2などです。

ユーザー入力を受け取り、エイリアスがユーザー入力と最も似ている名前のIDを返す関数を記述する必要があります。

私が意味することを理解することはそれほど直感的ではありませんので、ここに例があります。

{ 
    1: {"names": ["James", "Jamie"]}, 
    2: {"names": ["Karen", "Karyn"]} 
} 

単語Jimmyにおけるユーザーのタイプ:これは私の辞書であるとしましょう。辞書からJimmyに最も近いマッチがJamieあるので、この関数は世界Karenaでユーザーがタイプした場合ID 1.

を返すために持っている、最も近いマッチがKarenであるため、機能はID 2を返すことがあります。

最も近い数値を得るにはdifflibget_close_matches()を使用するのが最善の方法だと思います。しかし、その関数は引数として可能性のリストを取ります。関数で正しく使用する方法は考えられません。どんな助けもありがとう。

+1

どのように「最も類似」を定義していますか? –

+0

「Jamie」が「Jimmy」のクローゼットマッチだと言ったとき、あなたは両方のストリングの各キャラクターの最高のマッチを比較していますか? –

+0

"ダイナミックプログラミングスペルチェッカー"を検索します。これはおそらく一組のルールであり、必ずしもベストであるとは限りません。すなわち、音声的な距離を使うほうがいいでしょうか? – user2864740

答えて

4

サードパーティのモジュールに興味がある人は、fuzzywuzzyというこの種のものに使用したいと思う素敵なモジュールがあります。これは、Pythonでのファジー文字列マッチングです。このモジュールでは、2つの文字列間の距離の計算にLevenshtein Distanceメトリックを使用します。ここでは、それを使用する方法の例です:

>>> from fuzzywuzzy import fuzz 
>>> from functools import partial 
>>> data_dict = { 
...  1: {"names": ["James", "Jamie"]}, 
...  2: {"names": ["Karen", "Karyn"]} 
... } 
>>> input_str = 'Karena' 
>>> f = partial(fuzz.partial_ratio, input_str) 
>>> matches = { k : max(data_dict[k]['names'], key=f) for k in data_dict} 
>>> matches 
{1: 'James', 2: 'Karen'} 
>>> { i : (matches[i], f(matches[i])) for i in matches } 
{1: ('James', 40), 2: ('Karen', 100)} 

それは最高のスコアを持っているので、今、あなたはKarenを抽出することができます。

私はこのデモの目的でこの関数を2回呼び出す必要がありましたが、この例を拡張する方法に応じて1回だけ行うことができます。

もう1つ注目すべきことは、fuzz.partial_ratioはそのマッチにもっと寛大であるということです。厳密なマッチングスキームを使用する場合は、fuzz.ratioを使用することを検討してください。

ファジー文字列照合hereを使用して、さらに多くの例を閲覧することができます。

関連する問題