はじめに
この記事では、下記リンク先にあるLDA in Pythonを、Python 3で使う方法を説明します。
(conda 4.6.2で確認しています。Pythonのバージョンは3.6.7です。)
http://chasen.org/~daiti-m/dist/lda-python/
makeする前の準備
上のWebページにあるtar.gzファイルをダウンロードしたら、
$ tar zxvf lda.py-0.1.tar.gz
として解凍します。そして、
$ cd lda.py-0.1
と、ディレクトリに下りていきます。
logging.pyというファイルがありますが、logging
モジュールと名前がかぶっているので、
$ mv logging.py mylogging.py
と、適当なファイル名(ここではmylogging.py)へと変更します。
そして、lda.pyというファイルの中に現れるlogging
という文字列を、すべてmylogging
へと置き換えます。
こうすれば、lda.pyの中ではmylogging.pyを見に行くようになります。
この後で、
$ make
として、ldac.pyxのコンパイルをおこないます。
lda.pyの実行
lda.pyを実行するとき、
$ ./lda.py -h
とすると、
$ ./lda.py -h
Traceback (most recent call last):
File "./lda.py", line 8, in <module>
import ldac
ImportError: No module named ldac
というエラーが出るかもしれませんので、
$ python lda.py -h
とします。
あとはPython 2とPython 3の違いに由来するエラーがいくつか出るだけです。
それらをひとつずつ修正していきます。
Python 3で使うためのコードの修正
まず、lda.pyでもfmatrix.pyでも、xrange
が使われていますので、range
に置き換えておきます。
そして、他のエラーについては、以下のように対処します。
$ python lda.py -h
File "lda.py", line 40
except getopt.GetoptError, err:
^
SyntaxError: invalid syntax
これについては、lda.pyの所定の行に行って「, err
」を削除します。
(コードの気持ちとしては「except getopt.GetoptError as err:
」だと思いますが、
単に「, err
」を削除して「except getopt.GetoptError:
」と書き直すだけでも、ちゃんと動きます。)
$ python lda.py -h
Traceback (most recent call last):
File "lda.py", line 12, in <module>
import fmatrix
File "/data10/masada/lda.py-0.1/fmatrix.py", line 55
print data
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(data)?
これについては、fmatrix.pyの所定の行に行って「print(data)
」と丸カッコを追加します。
$ python lda.py -h
Traceback (most recent call last):
File "lda.py", line 15, in <module>
import cPickle as pickle
ModuleNotFoundError: No module named 'cPickle'
これについては、lda.pyの最初のほうにある「import cPickle as pickle
」を、
「import pickle
」と書き直せばいいだけです。
2019年2月14日の追記
同じ内容の記事が以下の場所にあります。
https://gist.github.com/nzw0301/7b1047dde2528b47aaabc9a4010a1003
私のここの記事では、lexicon
関数のv = None
に関するエラーに言及するのを忘れていました。
おわりに
以上でLDA in PythonがPython 3で使えるようになると思います。
$ python lda.py -K 10 -N 100 train model
LDA: K = 10, iters = 100, alpha = 5, beta = 0.01
loading data.. documents = 100, lexicon = 1325, nwords = 16054
initializing..
Gibbs iteration [100/100] PPL = 698.9706
saving model to model ..
done.