日本語Wikipediaデータをword2vecで類語検索する

去年、これをやっていたのだが、色々あって他のことに関心が向かったために、使いきれずにおいていたが、もう一度やっておく。類語を抽出できるようになるまでのプロセスをメモがわりに書いておく。
前半は、http://ankaji92.hatenablog.com/entry/2016/11/27/212507を参考にさせていただいた。

まず、適当なフォルダを決めて、wikiの全文を取ってくる。

$ curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

これを使えるように変換してまとめる。

$ git clone https://github.com/attardi/wikiextractor
$ python3 wikiextractor/WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

一カテゴリずつやっていくが、辛抱強く待つ。一つのファイルにまとめる。

$ cat text/*/* > jawiki.txt

分かち書きアプリのインストール。

$ brew install mecab
$ mecab -Owakati jawiki.txt -o data.txt

前は、ここでrubyを使う方法を用いた記憶があるが、使わなくていいので、ここまでは、先の引用元にあるこの方法がいいと思う。次に、word2vecのインストールである。これについては、以下のサイトにある後半部分がc言語でやるとき便利だった。

$ git clone https://github.com/svn2github/word2vec.git
$ cd word2vec
$make

macの場合、malloc.hが無いと、叱られるので、

  • compute-accuracy.c
  • distance.c
  • word-analogy.c

について、sodlib.hに変更する。そして、再度 make。

./word2vec -train data.txt -output jawiki_wakati.bin -size 200 -window 5 -sample 1e-3 -negative 5 -hs 0 -binary 1

data.txtは、先ほど作成したパスを指定し、word2vecも作成したパスを指定して実行する。オプションについては、適宜、webを参考にする。./distanceを、今作成したjawiki_wakati.binを指定して起動する。そして、単語を入力すると、類語のリストを出してくる。

./distance jawiki_wakati.bin 
Enter word or sentence (EXIT to break): コンビニ
Word: コンビニ  Position in vocabulary: 10735
           Word                         Cosine distance
-------------------------------------------------------------
          コンビニエンスストア		0.809326
          デイリーヤマザキ			0.685043
          店舗				0.652178
          スーパーマーケット		0.636046
          ドラッグストア			0.628818
          ミニストップ			0.620285
          キオスク			0.604373
          物販				0.603765
          ブックオフ			0.599682
          直営店				0.597540
          ファミリーレストラン		0.597328
          ローソン			0.594401
          ファミリーマート			0.589032
          売店				0.588488
          ホームセンター			0.587499
          キヨスク			0.587256
          惣菜				0.574461
          出店				0.572560
          セイコーマート			0.568219
          量販				0.559042
          店				0.558693
          飲食				0.557627
          セルフサービス			0.555324
          ファストフード			0.554968
          NEWDAYS			0.554501
          以下まだつづく・・・・・・

このdistanceのjava版を作らなければならない。面倒。