Word2Vecをhubotから使う

概要

overlast さんによる Word2Vec の WebAPI である word-vector-web-api を hubotから利用するスクリプトを書きました。

knjcode/hubot-word-vector-script

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

スクリプトの導入は、以下のとおりです。

# インストール
$ 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 (入力した単語にベクトルが近い単語を出力)

user1>> hubot distance 寿司
hubot>> 握り寿司 (0.7822030782699585)
江戸前寿司 (0.7741451859474182)
押し寿司 (0.7705079317092896)
うどん (0.7651448249816895)
天ぷら (0.7647247314453125)

hubot analogy (a – b + cにベクトルが近い単語を出力)

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
アドレスが追加されていることが分かります。

$ 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のコンテナを起動します。

$ 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

スポンサーリンク
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル(大)