アイソモカ

知の遊牧民の開発記録

開発記録 200305 Thu (お魚の本 2章, カウントベース)

今日は雨が降ったり雹が降ったり晴れたり曇ったり、山みたいな天気だった。

お魚の本 (ゼロから作る Deep Learning自然言語処理編) 2.3 カウントベースの手法 を読んで書いてみる。

2.3.2~2.3.6 単語の共起行列、コサイン類似度を使った類似単語のランキング表示

メモ:大きい順にインデックスを取る

# common/util.py
 ...
for i in (-1 * similarity).argsort():
 ...

argsort() は、配列の要素を小さい順にソートしたときのインデックスのリスト。配列にマイナスをかけて argsort() を使うと、大きい順になる。 大きい順にソートした時のインデックスのリストは、[0 2 4 5 1 3 6]

いままで sort()sorted() を使っていたけど、今回のようにリストのインデックスが他のリストのインデックスや辞書の key と共通する場合は、 argsort() を使ってループを回すと便利そう。

全部表示してみた

# study_2_3_6.py
import sys
sys.path.append('.')
from common.util import preprocess, create_co_matrix, cos_similarity, most_similar

if __name__ == '__main__':
    text = 'You say goodbye and I say hello.'
    corpus, word_to_id, id_to_word = preprocess(text)
    co_matrix = create_co_matrix(corpus, len(word_to_id))

    for idx in id_to_word:
        most_similar(id_to_word[idx], word_to_id, id_to_word, co_matrix)

[query] you
 goodbye: 0.7071067758832467
 i: 0.7071067758832467
 hello: 0.7071067758832467
 say: 0.0
 and: 0.0

[query] say
 and: 0.7071067785348971
 .: 0.4999999968750001
 you: 0.0
 goodbye: 0.0
 i: 0.0

[query] goodbye
 i: 0.9999999949999999
 you: 0.7071067758832467
 hello: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] and
 say: 0.7071067785348971
 you: 0.0
 goodbye: 0.0
 i: 0.0
 hello: 0.0

[query] i
 goodbye: 0.9999999949999999
 you: 0.7071067758832467
 hello: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] hello
 you: 0.7071067758832467
 goodbye: 0.49999999749999996
 i: 0.49999999749999996
 say: 0.0
 and: 0.0

[query] .
 say: 0.4999999968750001
 you: 0.0
 goodbye: 0.0
 and: 0.0
 i: 0.0