FastTextでmost_similar(類似単語検索)、"東京"-"日本"+"アメリカ"をしたい

TL; DL

most similar(=類似単語検索)はget_nearest_neighborsで、「"東京"-"日本"+"アメリカ"」(=単語の足し算, 引き算)はget_analogiesで実装できる

なぜこの記事を書いたか

Facebookの訓練済みFastTextモデルではmost_similarが使えない

また、gensimでFacebookの訓練済みベクトルを読み込もうとすると、以下のようなエラーが出てしまう

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data

gensimで読み込み直すこと無く、そのままFastTextで類似単語検索などを行いたい

コード

import fasttext
import fasttext.util
# 日本語版FastTextの訓練済みベクトルダウンロード
fasttext.util.download_model('ja', if_exists='ignore') # 10分以上かかる
ft = fasttext.load_model('cc.ja.300.bin')

# 類似単語検索
ft.get_nearest_neighbors('日本')
"""
 => [(0.683641791343689, '国内'),
 (0.6735708117485046, '米国'),
 (0.6710543036460876, 'アメリカ'),
 (0.6430486440658569, '欧米'),,,
"""

# 単語の足し算, 引き算
ft.get_analogies("東京", "日本", "アメリカ")
"""
[(0.6167652606964111, 'ニューヨーク'),
 (0.5732213854789734, 'ロサンゼルス'),
 (0.5674026608467102, 'フィラデルフィア'),
 (0.5639261603355408, 'フロリダ'),,,
"""