読者です 読者をやめる 読者になる 読者になる

xiangze's sparse blog

機械学習、ベイズ統計、コンピュータビジョンと関連する数学について

論文コーパスの次元圧縮とLDAによるトピックの関係の可視化

機械学習 python

機械学習の方法として教師なし学習で得られた量を特徴量として教師あり学習で使うという方法があります。
OnlineNewsPopularityの列の中にもLDAで推定されたトピックがあるようです。文書データもOnlineNewsPopularityと同じようにLDAで得られた量を使って機械的に分類が可能かと思われます。

そこで例としてNIPS論文の全文に対して各論文の語の頻度が作るベクトルをSVDとt-SNEを用いて2次元に圧縮した場合にきれいに分離されるかを見てみたのですが、うまくいきませんでした。mathutils.corpus2cscを用いたgensimでの疎行列の扱い方scikit.learnとの連携の例として挙げます。更なる解析の試みとしてはword2vecの使用などが挙げられるかも知れません。
gist.github.com

トピック数10としてトピック間の関係を多次元尺度法を用いて2次元に埋め込んだ結果
f:id:xiangze:20160913012624p:plain
https://dl.dropboxusercontent.com/u/27452774/NIPSpapers/nips2015papers_10.html

トピック数10,SVDによる次元削減50,perplexity=40の場合
f:id:xiangze:20160913011338p:plain

t-SNEの説明が詳しいです。
blog.albert2005.co.jp

ためになる本

thinkit.co.jp

5章のpythonによる独自実装とscikit.learnの主成分分析(PCA)による次元圧縮*1
8章の自然言語処理 scikit.learnのCountVectizer, HashingVectozerを用いたBag of wordの作成とtf-idf処理

が関係しますが本記事で使った方法(単語カウントは素朴なpython実装、stop wordはNLTKのもの)とはほとんどかぶっていません。未知のデータから知見を得ようとする場合はまず最初に定番の手法を使った方が良さそうです。

*1:この本で扱っているLDAは線形判別分析で、Latent Dirichlet Allocationとは別物です。