開発したのでその使い方を紹介しよう。らによって提案/開発された単語をベクトルに変換するOSSツールである。自然言語で書かれたテキストファイルを読み込み、単語ベクトルを出力するようになっている。テキストファイルの代わりにLuceneインデックスを入力コーパスとして用いる。扱うテキストファイルは単語単位で分かち書きされている必要がある。この点は英語テキストなどでは問題ないが、単語で分かち書きされていない日本語などではあらかじめMeCabなどの形態素解析器や分かち書きツールを用いて単語で分かち書きされたテキストファイルを用意しておかなければならない。単語テキストの直後に続くピリオド/カンマの削除など、事前の正規化作業が必要になってくる。Luceneインデックスを入力コーパスとして用いるため、事前の正規化作業が不要である。デモを実行する手順を説明する。ダウンロード2.デモデータの準備3.Lucene/Solrインデックスの準備(デモデータの登録)4.単語ベクトルの作成5.単語ベクトルで遊ぶという感じである。Luceneインデックスを持っている方は手順2〜3の代わりに手持ちのLuceneインデックスを手順4で指定することにしてもよい。インデックスで動作するものと思われる。こと、Elasticsearch(バージョンはよく知らないが1.x系以降)で作成したインデックスも指定できる。手順5で楽しい結果を得るためにはそれなりに大きなコーパスが必要である。環境をインストールする想定で話を進める。text8.zip手順3.Lucene/Solrインデックスの準備(デモデータの登録)コンソールを2つ用意して最初のコンソールでSolrを起動する。start.jar2つめのコンソールではtext8コーパスをSolrに登録する。スクリプトにSolrコア名を指定してword2vecを実行する。実行結果はvectors.txtというファイルに出力される。実行するとvectors.txtファイルを読み込んで入力待ちになる。そこで単語を入力すると、その単語に最も近い(コサインを計算)ベクトルを持つ単語上位40個を表示する。実行するとvectors.txtファイルを読み込んで入力待ちになるので、3つの単語をスペース区切りで入力する。womanと入力しているが、「manに対するkingの関係を、womanに適用するとどうなるか」という意味である。するとqueenが期待値になるが、実行結果もそのようになる。いう英語の正規化済みのコーパスを使った手順であるが、以下では日本語の(正規化済みでない)コーパスを使った手順も紹介しよう。ニュースコーパスを用いる。ニュースコーパスをダウンロードする。livedoorニュースコーパスをSolrに登録し、word2vecを実行する。コア名にはldccを指定する。-aオプションでLuceneのAnalyzerクラスを指定する。以下では-fオプションで出力先ベクトルファイル名を指定している(指定しないとデフォルトのvectors.txtとなってしまい、先ほど作成した英語の単語ベクトルファイルを上書きしてしまう)。見てもらうとわかるように、いくつかのパラメータがハードコーディングで指定されている。以下はLuceneに関連するパラメータである。インデックスのデータでword2vecが動くはずである。Luceneインデックスのディレクトリを指定する。実行するLuceneインデックスのフィールド名を指定する。このフィールドはindexedでかつstoredでなければならない。-fieldオプションで指定されたフィールドのstoredデータをここで指定されたLuceneのAnalyzerクラスでanalyzeする。indexedでなければいけないかというと、(オリジナル実装でも)word2vecではコーパスを2度読んでいて、1回目の読み込みで単語表を作成しているが、indexedであればそこは一瞬で完了し、なんといってもLuceneっぽいからである。word2vecで解析したくなるようなLuceneフィールドはたいていindexedでかつstoredと考えられるので、多くのLuceneインデックスオーナーにはこの条件は受け入れられるはずである。Luceneを手持ちのLuceneインデックス上で試していただき、どんな結果になったか教えていただければありがたい。比較のポイント商用検索エンジンを購入した企業担当者は読まないでください。McCandlessFastVectorHighlighterについて解説記事を寄稿しました。