概要
overlast さんによる Word2Vec の WebAPI である word-vector-web-api を hubotから利用するスクリプトを書きました。
knjcode/hubot-word-vector-script
Word2Vecとは
Word2Vecというのは予め構築したモデル内で各単語を多次元のベクトルとして定義し、単語同士のベクトルの近似度や単語間のベクトルの近似度を求める手法です。詳細はgoogleの公式サイト等を御覧ください。
例えば、(SONY – PlayStation + Nintendo) という表現は、NintendoにおけるSONYのPlayStationに相当するものを表現します。
word-vector-web-apiに付属のモデルでは、(SONY – PlayStation + Nintendo) は Wii、ゲームボーイアドバンス、ニンテンドーDS、…と、かなり妥当な出力を返します。(とはいえ単語によってはおかしな場合もありますが)
word-vector-web-apiとは
名前のとおりWord2VecをWebAPIとして利用可能にするものです。
特徴として、日本語Wikipediaのデータを元にした構築済みモデルが付属しており、このモデルをもとにWord2Vecを試せます。
Dockerのコンテナとして利用できるように設計されており、dockerと1.5GByte程度のメモリがあれば手軽に利用できます。
また、Word2Vecの日本語モデルを構築する際には、mecab等で分かち書き処理をしたデータを利用するため、分かち書きの精度がモデルの精度に影響するようです。word-vector-web-api付属のモデルについては、mecab-ipadic-NEologd を使うことで、普通のmecabとipadicを利用するよりも精度のよいモデルとなっているようです。
mecab-ipadic-NEologdについても、overlastさんが開発公開されており、便利に使わせて頂いています。
hubotから利用する
word-vector-web-apiを使って構築したWebAPIのURLを仲間内に共有して、Slack上で遊んでいたんですが、そもそも、hubotのコマンドとして利用できれば便利かと思い実装したのが、以下のスクリプトです。word-vector-web-apiのURLを環境変数に設定することでhubotからWord2Vecを利用できるようになります。
knjcode/hubot-word-vector-script
スクリプトの導入は、以下のとおりです。
1 2 3 4 5 6 7 8 |
# インストール $ cd /path/to/hubot $ npm install --save knjcode/hubot-word-vector-script # external-scriptsへの登録 $ cat external-scripts.json ["hubot-word-vector-script"] |
利用可能なコマンド
単純に word-vector-web-api のラッパーになっており、distanceとanalogyコマンドを利用できます。
hubot distance (入力した単語にベクトルが近い単語を出力)
1 2 3 4 5 6 7 |
user1>> hubot distance 寿司 hubot>> 握り寿司 (0.7822030782699585) 江戸前寿司 (0.7741451859474182) 押し寿司 (0.7705079317092896) うどん (0.7651448249816895) 天ぷら (0.7647247314453125) |
hubot analogy (a – b + cにベクトルが近い単語を出力)
1 2 3 4 5 6 7 |
user1>> hubot analogy SONY PlayStation Nintendo hubot>> Wii (0.7002160549163818) ゲームボーイアドバンス (0.694932758808136) ニンテンドーDS (0.6919329166412354) ニンテンドー3DS (0.6773288249969482) NINTENDO64 (0.6766645312309265) |
(参考)hubotもコンテナで起動してコンテナ同士をリンクする
word-vector-web-apiはdockerコンテナとして起動します。
同一ホストでhubotも起動するのであれば、hubotもコンテナとして起動してコンテナ同士をリンクすると便利です。
--link
オプションでコンテナ同士をリンク
hubotのコンテナを起動する際に、dockerの--link
オプションでword-vector-web-apiのコンテナをリンクすると、
コンテナ内でリンク先のコンテナのIPアドレスやポート番号を参照できる環境変数が設定され、さらに /etc/hosts にもリンクしたコンテナのIPアドレスが追加されます。
w2v-web-apiというコンテナ名で起動しているコンテナとリンクする場合は、docker-runコマンドのオプションに
--link w2v-web-api:W2V
のようにオプションを追加することで、コンテナ同士をリンクすることができます。
busyboxコンテナを使って試してみると、以下のように /etc/hosts にW2Vという名前でリンクしたコンテナのIP
アドレスが追加されていることが分かります。
1 2 3 4 5 6 7 8 9 10 11 |
$ docker run --rm -it --link w2v-web-api:W2V busybox cat /etc/hosts 172.17.42.24 eb2137b143e5 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.42.8 W2V 65b6658380ca w2v-web-api # --rmオプションを指定しているので、このコンテナは /etc/hosts を表示した後に終了して無くなります |
これを利用して、hubotコンテナ起動時に環境変数を設定しておくことで、hubotがword-vector-web-apiを参照できるようになります。
word-vector-web-apiはデフォルトで22670ポートをpublishするので、以下の様にhubotのコンテナを起動します。
1 2 |
$ docker run -d --env HUBOT_WORD_VECTOR_URL=http://W2V:22670 --link w2v-web-api:W2V yourDockerImage |
謝辞
word-vector-web-apiやmecab-ipadic-NEologd等々の、簡単に利用できる構築済みのモデルや辞書を公開して頂いているoverlastさんに感謝します。
参考
word-vector-web-api
Word2Vec の Web API を作れる word-vector-web-api を公開しました
mecab-ipadic-NEologd