ツイッターの男女判定(2013年4月2日の記事)のために、LDAを使ったテキストマイニングがやりたくなった。そのために、まず練習としてgensimを使ってwikipediaのコーパスを作成してみた。その手順メモ。
gensim関係のやってみたシリーズのリンク一覧
Python GensimでLDAを使うための前準備・パッケージのインストール
gensim0.8.6のチュートリアルをやってみた【コーパスとベクトル空間】
LDAを使うためにはgensimを使うのが簡単らしい
LDA(Latent Dirichlet Allocations)を使うために現時点で一番簡単な方法は、pythonのgensimというパッケージを使う方法のようです。
gensimのインストール方法は、「Python GensimでLDAを使うための前準備・パッケージのインストール」に書いています。
この記事では、gensimに実装されたLDAを使ってツイッターの分析を行う手順を書いています。となるはずだったんですが、事前にやることが多かったのでそこまでいっていません…(^^)
gensimが正しくインストールされていることの確認
pythonは環境の準備がけっこうややこしいので、正しくインストールできていることの確認からやります。
numpy, scipy, gensimがpythonのインタープリターでエラーなくimportできれば、それぞれのパッケージは正しくインストールできています。
cd python2.7 >>> import numpy >>> import scipy >>> import gensim
この時点でエラーが起きる場合は、「Python GensimでLDAを使うための前準備・パッケージのインストール」を参考に、関連するパッケージをインストールし直してみてください。
※すごく重要な注意点※
上記の記事では最新版のnumpy, scipy, gensimをインストールしていますが、日本語版wikipediaのコーパス作成にはgensim0.7.8を使う必要があります。
日本語版wikipediaのコーパス作成に他の人が作ってくださったpythonスクリプトを利用するのですが、そのスクリプトがgensim0.7.8にしか対応していないためです。
numpy, scipy, gensimは、最後にインストールしたバージョンが使われるっぽいです。
本記事では、英語版wikipediaのコーパス作成にはgensim0.8.6(最新版)、日本語版wikipediaのコーパス作成にはgensim0.7.8を利用しています。
gensim0.8.6を使って英語版wikipediaのコーパスを作成する
ツイッターに対してLDAを適用するにしても事前の知識がなさすぎて色々意味不明なので、まずは、英語版(と日本語版)のwikipediaのコーパスを作成し、そのコーパスに対してtfidf, LSA, LDAを適用してみます。
英語版のコーパスと日本語版のコーパスを両方作る意味は特にない(日本語版だけでいい)のですが、gensimが正しくインストールできているかの確認のためにやった方が無難です。「公式チュートリアル」の手順通りにやります。
cd wget http://dumps.wikimedia.org/enwiki/20130304/enwiki-20130304-pages-articles.xml.bz2 # これだけで実行すると、必要なオプションの情報が表示される python2.7 -m gensim.scripts.make_wiki # 改めて実行 python2.7 -m gensim.scripts.make_wiki enwiki-20130304-pages-articles.xml.bz2 output # gensim0.8.6だとこれらのファイルが生成される output_bow.mm output_bow.mm.index output_tfidf.mm output_tfidf.mm.index output_wordids.txt
ここだけで8時間くらいかかりました。EC2のM3 ダブルエクストララージインスタンス(CPU仮想コアx8、メモリ30G、1.5ドル/時!)で実行しました。ハイメモリーエクストララージだと24時間ちょいです。CPUの性能が実行時間にかなり影響するようです。ちなみにCore i7のMacBook Proだと9時間くらいのようです。
英語版wikipediaのbz2ファイルだけで9GByte以上あるので気を付けてください。さらに、約35GByteのディスクスペースが必要だと公式ドキュメントに書いてあります。私はEBSをマウントして使いました。
抜粋した実行ログもアップしておきました。
gensim0.7.8を使って日本版wikipediaのコーパスを作成する
英語版とほとんど同じ手順です。日本語版の場合は先に分かち書きをしておく必要があるのでmecabが必要になります。さらに、他の人が作ってくださったpythonスクリプトを利用します。
mecabとmecab-pythonバインディングをインストールしておく必要があります。「mecabの辞書に新しい単語を登録する方法」の通りにインストールしておいてください。
jawikicorpus.pyこのpythonスクリプトを保存してください。日本語版wikipediaに対する分かち書きとコーパス作成を行うpythonスクリプトです。
mecab、 mecab-pythonバインディング、pythonスクリプト、の準備ができたら下記のコマンドを実行してください。
cd wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 python2.7 jawikicorpus.py jawiki-latest-pages-articles.xml.bz2 jawiki # gensim0.7.8だとこれらのファイルが生成される jawiki_bow.mm jawiki_tfidf.mm jawiki_wordids.txt
英語版wikipediaのコーパス作成をgensim0.8.6でやったときより生成されるファイル数が減ってますが、おそらく、gensim0.7.8だと機能が少ない=生成されるファイル数も少ない、みたいな感じなんだと思います。
再度になりますが、numpy, scipy, gensimのバージョンを「LSIやLDAを手軽に試せるGensimを使った自然言語処理入門」と揃えておかないとエラーが起きる点に注意です。特にgensimのバージョンが重要です。
ちなみに、gensimのバージョンだけ上げ下げすると、scipy0.11とgensim0.7.8の組み合わせのときに、scipyのmaxentropyモジュールのimportに失敗します。gensimの作者いわく、「たいして使ってないモジュールだから必要な関数だけコピればOK」だそうです。
wikipediaのコーパス生成時に作成されたファイルの意味
先ほどのpythonスクリプトの作者のページいわく、下記のような意味らしいです。
jawiki_bow.mm
単語頻度(Term Frequency, tf)を次元の値とする文書単語行列
jawiki_tfidf.mm
単語頻度からtfidfを計算した文書単語行列
jawiki_wordids.txt
次元と単語の関係。例えば、1次元目は"python"を表す、など。Gensimの中ではDictionaryと呼ばれる。
紹介した解説記事はgensim0.7.8を対象としているので、gensim0.8.6でしか生成されない下記のファイルの意味は不明です…(^^)
output_bow.mm.index
gensim0.8.6で英語版wikipediaのコーパスを作成すると一緒に生成される。
output_tfidf.mm.index
gensim0.8.6で英語版wikipediaのコーパスを作成すると一緒に生成される。
まだまだ続きます…!
ここまででやっと、必要なライブラリのインストール、正しく動くことの確認、wikipediaのコーパス作成が終わりました。
次回は、今回作成した日本語版wikipediaのコーパスに対して、tfidf, LSA, LDAを適用してみます。さらに次々回でやっと、ツイッター分析にいけそうです。
全然お手軽じゃないですね…(^^)
参考リンク
gensim公式チュートリアル一覧
http://radimrehurek.com/gensim/tutorial.html
gensim公式 LSA、LDAの実行方法
http://radimrehurek.com/gensim/wiki.html
「gensimで日本語版wikipediaのコーパスを作成し、tfidf、LSA、LDAを適用してみる方法」が解説されています。すごく分かりやすいです。本記事でもだいぶ参考にしています。
LSIやLDAを手軽に試せるGensimを使った自然言語処理入門
面白かったのでメモ。
LDAを利用した、twitter上のユーザ類似度判定システム