content合理と非合理のあいだ人工知能・哲学・スタートアップについて綴ります。トピックモデル・LDAの基本構造とアイディアを説明したが、今回はPythonで実際にトピックモデルを使って単語の分散(ベクトル)表現を作ってみる。トピックモデルライブラリgensim今回はフルスクラッチではなく、LDAやLSAやword2vecが簡単に使えるpython用ライブラリgensimを利用する。LdaModelでgensimのLDAModelをimportする。以下の関数は、単語の共起表現ベクトルのリストvectorsを受け、gensimの関数LdaModelを用いてLDAモデルを学習(これにはデータサイズに依るが数十分時間がかかる)し、指定したmodel_nameでモデルを保存する関数である。trained_modelパラメータwordMappingは単語の番号をインデックスに、単語の文字列を値とした辞書である。いう程度のものなので面倒くさければ必要なし。学習データであるvectorsは、ここでは2次元のベクトルで、各行が各単語を表していて(これがトピックモデルでいう「文書」に対応する)、各列がその行の単語と各インデックスの単語との共起回数を表す。単語とjの単語の共起回数だ。このデータは文書集合から自分で作るも良し、どこかのソースから取ってくるもよし、とにかく自分で用意しなければいけない。(つまりここではLDAはベクトルの次元縮約として働く)このベクトルは当然スパースになるので、gensimではスパースコーディングで渡す。0でない成分のインデックスとその成分の組のリストとして渡す。(6,8)]と表される。普通のリストをスパースコーディングに変換する関数は、例えば以下のように書ける。dense_vectornum_topicsに指定するのはベクトルの次元数(トピック数)で、大きければ表現力は上がる一方オーバーフィットしやすく計算量は増すので、100〜300くらいがちょうどよい。gensimのLdaModelオブジェクト標準のメソッドsaveでモデルが保存できるので、一度学習して保存しておけば次回以降はすぐに読み込んでモデルを利用することができる。簡単な応用例として、類似度比較を試してみた。timeの類似度を測ってみた。類似度はコサイン類似度を用いている。以下がLDAの結果(トピック数100)だ。0.21364984806直観に違わず、homeとhouseの類似度がtimeとhouseの類似度を大きく上回っている。ちなみに、学習に使った共起表現の生ベクトル(ボキャブラリーサイズ=ベクトルの次元数=2000)で同じく類似度を計った結果が以下である。0.818144793373ベクトルが長く、スパース過ぎて0がほとんどなため、コサイン相関だと差がほとんどあらわれない。上2つを比較すれば、いかにLDAの次元圧縮が効いているかわかる。コメントをキャンセルメールアドレスが公開されることはありません。