2016-08-16 5 views
1

私は、NCAAのチーム名の配列とそれらに関連する統計を持っています。学校名はしばしば短縮されるか、完全に除外されますが、アラバマクリムゾンタイドとクリムゾンタイドのように、名前のすべてのバリエーションに共通の要素が通常あります。これらの名前はすべて、特定の順序で配列に含まれています。私はそれらをあいまいにマッチングさせてチーム名のすべてのバリエーションを取って、すべてのバリエーションを1つの名前にリネームすることができるようにしたいと思います。私はPython 2.7で作業しており、すべてのデータを持つ配列があります。前にファジーマッチングを使ったことがないので、助けてください。Pythonで配列の列に項目をあいまいにする方法はありますか?

私はforループを使ってファジーマッチングを考えました。これは、(信じられないほど遅いにもかかわらず)配列の各要素を他のすべての要素と比較することになりますが、どのようにビルドするのかは分かりません。

現在、私の配列は次のようになります。

{名前、INFO1、INFO2、情報3}

配列が数千行の長さであるので、私は、効率的なように、プログラムを作成しようとしていますできるだけ。

+0

数千行がメモリ内にある、アレイ上で実行されているループのためにかなり速いものでなければなりません。 – grochmal

+0

これを行う最後の試みで、それは決して終わったことはありません。私はそれが永遠に取るべきではないことに同意するので、私は間違った何かをしなければならない。私はループに取り組む方法を確信しています。 – a7xcarter

答えて

0

Levenshtein edit distanceは、文字列のファジーマッチングを実行する最も一般的な方法です。それはpython-Levenshtein packageで利用できます。別の一般的な距離はJaro Winkler's distanceで、同じパッケージでも利用できます。我々は、我々が持っている文字列と、アレイ内のすべての文字列の間で、私たちのレーベンシュタインとJAROの距離の指標を与えるためにヘルパーを定義

import numpy as np 
import Levenshtein as lv 

ar = np.array([ 
     'string' 
    , 'stum' 
    , 'Such' 
    , 'Say' 
    , 'nay' 
    , 'powder' 
    , 'hiden' 
    , 'parrot' 
    , 'ming' 
    ]) 

:単純な配列numpy配列を想定し

。今

def levenshtein(dist, string): 
    return map(lambda x: x<dist, map(lambda x: lv.distance(string, x), ar)) 

def jaro(dist, string): 
    return map(lambda x: x<dist, map(lambda x: lv.jaro_winkler(string, x), ar)) 

は、レーベンシュタイン距離が文字の数でカウント整数値である、JAROの距離は、通常、0と1との間レッツテストを変化浮動小数点値は、このnp.whereを使用している間:

print ar[np.where(levenshtein(3, 'str'))] 
print ar[np.where(levenshtein(5, 'str'))] 
print ar[np.where(jaro(0.00000001, 'str'))] 
print ar[np.where(jaro(0.9, 'str'))] 

そして、我々が得る:

['stum'] 
['string' 'stum' 'Such' 'Say' 'nay' 'ming'] 
['Such' 'Say' 'nay' 'powder' 'hiden' 'ming'] 
['string' 'stum' 'Such' 'Say' 'nay' 'powder' 'hiden' 'parrot' 'ming'] 
+0

素晴らしいです、ありがとうございます!私はpython-Levenshteinパッケージをしばらくインストールしようとしていましたが、インストールするためにC++コンパイラが必要であることに気づいていませんでしたが、これは私の問題に役立ちます – a7xcarter

+0

@ a7xcarter - Cベースの実装は最も簡単です。しかし、多分、私はPythonで完全に書かれた 'jellyfish '(https://pypi.python.org/pypi/jellyfish)があり、' .levenshtein_distance'と '.jaro_distance'もエクスポートしているはずです。 – grochmal

関連する問題