潜在的意味インデキシング
id:naoyaさんやたつをさんなどの超有名人な方々が以前から実施されている「IIR輪読会」というものがありまして、どうやら今回は第18章の "Matrix decompositions and latent semantic indexing"を輪読したようです。
http://d.hatena.ne.jp/naoya/20090208
http://chalow.net/2009-02-08-2.html
Latent Semantic Indexingとは、通称LSIとかLSA(Latent Semantic Analysis)とかいいますが、日本語だと「潜在的意味インデキシング」なんて呼びますね。
簡単に言ってみると
でっかいマトリックス(数万×数万とかの行列)をたとえば「数百×数万」ぐらいにまで、ぎゅぎゅっと横に押しつぶすように圧縮してみると、あら不思議、のこった行列はとても意味あいの濃いベクトルの集まりになってるよ。
だからこれらを「特徴ベクトル」として使うといいよ。
特徴ベクトルを高次元の空間にマッピングすると距離計算とかで類似度なんかが計算できるんだよ。
といった感じかな。よく自然言語処理の分野などで使われています。
言葉で書くと実に馬鹿っぽいのですが、じつは「次元圧縮」とかいう辺りが数学的にはずいぶんと高度で難しいみたいです。よくわかりませんが。
で、たまたまなんですが、自分も数ヶ月前にLSIについてperlでごにょごにょと実験を繰り返していた時期がありまして、
その時に勢いでつくって無責任にもCPANにあげていたモジュールがあったので、ちょうどいい機会なので紹介しておきます。
http://search.cpan.org/~miki/Algorithm-DimReduction/
Algorithm::DimReduction - Dimension Reduction tool that relies on 'Octave'
なんのことはない、文字通り「Octaveを使ってSVD(特異値分解)で次元圧縮の計算処理をさせる」ためのperlモジュールです。
やってる処理も定型的だし汎用性も拡張性も全然ありません。モジュールとしては正直「クソ系」です。
だけどLSIとか興味ある人にとっては少しは何かの参考になるやもしれない、と思いupして晒している次第です。
で、少しだけ中身のことに触れますが、もともとはPDL(Perl Data Language)で色々と試したのですが、10万×10万程度の行列が何日まっても終わらなかったので諦めました。(PDLではあまり大きな行列は扱えないのかな。。だれかPDLに詳しい人いたら教えて!)そこでPDLはあきらめてOctaveでやってみたところすんなり計算結果がでてきました。Octave、Sugee!
バリバリの研究者の方であれば、もっと高度なMathematicaとかを使うんでしょうが、私は数学わからない文系な子なので、Octaveで、あわよくばperlでなんとかできないか、とか思って書いてみてしまいました。。すんません、ほんの出来心です。勘弁してつかあさい。。。
というわけで、イマイチ自信ないモジュールですが、興味ある方はCPANから落として触ってみてください。