Facebookが開発したfastTextで類義語を取得

プログラミング

皆さん、こんにちは。

この度、Pythonを使って類義語を取得する機会があり、Word2VecやWordnet、Chive、fastTextなどを触りました。その中のfastTextについて簡単に紹介します。

fastTextとは

2016年にFacebookが公開した自然言語処理のライブラリです。

Googleが開発したWord2Vecをベースにして、FacebookがfastTextを開発しました。

特徴は、Word2vecよりも高速に処理できること、サブワードの組み合わせで未知語(Out Of Vocabulary, 略OOV)に対応できることです。

 

使い方

インストール

まずはpipインストールではなく、Githubからソースをダウンロードして手動で入れます。以下のようなイメージです。

git clone https://github.com/facebookresearch/fastText.git
cd fastText
pip install .

 

以下のようなエラーが発生することがございます。

ModuleNotFoundError: No module named 'Cython'

その場合は、以下のようにpipでCythonをインストールします。

pip install Cython

Cythonとは、処理速度が遅いPythonをC/C++に変換することでより高速化しようとするためのライブラリのことです。fastTextはこのライブラリを使っているため、こちらもインストールしないといけないようです。

 

学習済みモデルのダウンロード

ネットで指定のサイトにアクセスしてダウンロードすることもできますが、fasttextのメソッドでダウンロードできるので、以下のようにpythonファイルに記述して実行して学習済みモデルをダウンロードします。対話モードでも問題ないかと思います。

import fasttext.util
fasttext.util.download_model("ja", if_exists='ignore')

PCのスペックにもよりますが時間がかかります。

 

類義語の取得

ダウンロードした学習済みモデルはPythonファイルと同じディレクトリに保存しています。

import fasttext

word = "公園"
model_ft = fasttext.load_model("cc.ja.300.bin")
result = model_ft.get_neareset_neighbors(word)

サンプル

キーワード:公園

[(0.690787136554718, ‘緑地’),(0.656505823135376, ‘遊歩道’), (0.6252226829528809, ‘広場’), (0.6210625767707825, ‘城址’), (0.617851197719574, ‘公園東’), (0.6046748161315918, ‘運動公園’), (0.6008357405662537, ‘遊具’), (0.5918800234794617, ‘東公園’), (0.5866348147392273, ‘森林公園’), (0.5831413269042969, ‘原っぱ’)]

キーワード:gopro

[(0.7442644834518433, ‘goprohero’), (0.7172117233276367, ‘ゴープロ’), (0.6856545209884644, ‘goprojp’), (0.6724032759666443, ‘goprolife’), (0.6701846122741699, ‘sjcam’), (0.6535431146621704, ‘Gopro’), (0.6015459895133972, ‘eosm’), (0.5864362716674805, ‘GOPRO’), (0.5797611474990845, ‘GoPro’), (0.5725175738334656, ‘vsco’)]

キーワード:にんじん

[(0.7558069825172424, ‘ニンジン’), (0.6690472960472107, ‘じゃがいも’), (0.6666346192359924, ‘さつまいも’), (0.6585174798965454, ‘小松菜’), (0.6423161029815674, ‘人参’), (0.6414036750793457, ‘ほうれん草’), (0.6255921125411987, ‘玉ねぎ’), (0.6151055097579956, ‘かぼちゃ’), (0.6028880476951599, ‘ピーマン’), (0.5887352824211121, ‘きゅうり’)]

 

感想及び今後の展望

感想

・chiveやWordnetと比較して、未知語への反応が良い(chiveは字面で判断してしまい、wordnetはそもそも未知語に対して類義語を返さない)

例、いずれのモデルも「人参」は登録されているが、「にんじん」は未知語であり、chiveでは「じんじん」、「にんまり」などの言葉を返し、wordnetは返さない、fastTextは「ニンジン」、「じゃがいも」などを返す

・たまに全く類似していない言葉を返すことがある

・chiveよりもコサイン類似度の点の付け方が厳しい

 

今後の展望

このfastTextをMagnitudeと組み合わせることで、より未知語に強くなるような記事を見つけたので、次は組み合わせてどのような結果が出るかを試してみたいです。

 

コメント

タイトルとURLをコピーしました