自然言語処理をやっていると類似度などの文字列同士の計算をしたベクトルを得たいときがあります。例えば文字列のリスト['aiueo', 'aaa', 'iii']から'aiueo'に似ているものを選びたいとき。
そんなときは、類似度計算関数をnumpy.vectorizeすると以下のように類似度のベクトルを得られます (ここでは類似度関数としてpython-levenshteinパッケージのjaro_winkler関数を使っています)
>>> import numpy
>>> from Levenshtein import jaro_winkler
>>> vectorized_jaro_winkler = numpy.vectorize(jaro_winkler)
>>> print(vectorized_jaro_winkler('aiueo', ['aiueo', 'aaa', 'iii']))
[1. 0.56 0.51111111]
そして最もスコアが高いものを選ぶときはnumpy.argmaxを使います。
>>> result = vectorized_jaro_winkler('aiueo', ['aiueo', 'aaa', 'iii'])
>>> print(numpy.argmax(result))
0
スコアが高い順にソートするときはnumpy.argsortにマイナスをかけたパラメータを与えます。
>>> print(numpy.argsort(-result))
[0 1 2]
ちなみにPythonのstr型にあるような関数で一括で処理するときはnumpy.chararrayを使うと便利です。
>>> a = numpy.array(['aiueo', 'aaa', 'iii'])
>>> print(numpy.chararray.startswith(a, 'a'))
[ True True False]