自然言語処理をやっていると類似度などの文字列同士の計算をしたベクトルを得たいときがあります。例えば文字列のリスト['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]