Elasitcsearchと日本語版WikipediaでLDA

今まで、以下のあたりでいくつか書いてきました。

gensimを利用して、LDAに適用するコーパスを使う例を上げてきましたが、今までのものはbzip2されたデータからコーパスを作成しているだけな jawikicorpus.py だったので、さらに一歩進んで、データ自体もElasticsearchに入れておいて、形態素解析も含めて、Elasticsearchを使うように変えてみます。
適用するにあたっては、

  • Elasticsearchの環境を作っておくこと
  • RiverでWikipediaのデータを投入しておくこと
  • elasticsearch-extended-analyzeプラグインを入れておくこと
  • gensim等の必要なpythonモジュールを入れておくこと(pyenvとかで入れれば良いかも)

という前提で、jawikicorpus.py をダウンロードして、

$ python jawikicorpus.py localhost:9200/jawiki-pages-articles wiki_ja_output

を実行すると

$ ls wiki_ja_output_*
wiki_ja_output_bow.mm wiki_ja_output_tfidf.mm wiki_ja_output_wordids.txt.bz2
wiki_ja_output_bow.mm.index wiki_ja_output_tfidf.mm.index

という感じでコーパスが作成されます。
あとは、英語版WikipediaでLDA日本語版WikipediaでLDAにあるような感じで、LDAを適用できるかと思います。

日本語版WikipediaでLDA

英語版WikipediaでLDA」に続いて、日本語版で試してみる。
日本語の場合は形態素が必要になる。そうすると、ぐぐってみると、jawikicorpus.pyというのを用意して、コーパスを利用することになる。
でも、ぐぐってみると、古かったり、動くのかよくわからないものがいろいろと転がっている感が…。あとは、形態素解析もmecabだったりとか…。
今回、この話の流れの一番始めにElasticsearchに突っ込んでいたりとかで、Elasticsearchの形態素機能を利用できるのでそれを利用することにしたい。でも、ElasticsearchのAnalyzeAPIは名詞などの品詞情報を取得することができない。というわけで、elasticsearch-extended-analyzeをElasticsearchに入れる必要がある。

$ cd $ES_HOME
$ bin/plugin -i info.johtani/elasticsearch-extended-analyze/1.4.1

上記のプラグインを入れたら、Elasticsearchを再起動する。あと、WikipediaをElasticsearchに取り込むにあるようにja_analyzerが設定されたインデックスを用意しておく必要がある。
そして、今回利用するjawikicorpus.pyはここに置いておくので、取得して適当に変えてください。変える必要があるのはElasticsearch Infoのコメントを置いたあたりかも。このファイルでは名詞だけに絞っているので、そこを編集したりとかもありかも。
という感じで、ここまで準備ができれば、英語版と同様に実行すればよい。まずは、wikipediaの日本語ファイルをダウンロードする。

$ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2

次にコーパスを作る。

$ python jawikicorpus.py jawiki-latest-pages-articles.xml.bz2 wiki_ja_output

トピックモデルを作成する。

$ python wiki_lda.py --wordids wiki_ja_output_wordids.txt.bz2 --tfidf wiki_ja_output_tfidf.mm --output wiki_lda_ja.pkl

という感じでできあがり。
model.print_topics(100)とかすると、形態素解析を実行する前にwikipedia記法を取り除いて文書にした方がコーパス的には良いかなというような気も…。