studylog/北の雲

chainer/python/nlp

(未解決)大規模疎行列のコサイン類似度

タスク:
文章同士の類似度をコサインで出したい。

次元:
60000単語*1000000文章

結果;
破綻

どうにかならないものかとnumpy・scipyを使ってみるんだけど行列の知識が無さ過ぎてさっぱりわからない。stackoverflow.com

とりえあえずこれを試して見るも30000*30000の時点で
similarity = numpy.dot(A, A.T)
が時間かかってなかなか終わらない。(結局これは13分)
たしかこれ内積内積って何だっけ。そんなところすらわかってないレベル。
メモリも13GBを突破してるから60000次元にしたらまずダメ。

文章ベクトルは疎行列でほとんど0なのでそこを利用すると速くなるかもしれないらしい。

http://hamukazu.com/2014/06/04/scipy-sparse-universal-function/
http://hamukazu.com/2014/09/26/scipy-sparse-basics/

こういう風にそもそもの行列をsparseで作るべきっぽい。
これならメモリは劇的に少なくなる。

しかしそうするとコサイン類似度をどうやって出せばいいのかわからない。
そういう便利な関数が用意されてないっぽいので自分で計算しないといけないのだろうか。
forで回してtodenseしてscipyのcosineに投げたら結局意味無いし、なんか行列をこねくり回して計算しないといけないっぽい。今の自分には無理…。

まず基礎レベルの線形代数を勉強しないとscipyを使うのすらも厳しいという現実がわかった土曜日。
gensimみたいなライブラリに頼るべきなのだろうか。
低頻度単語をもっと削るとか、LSI?とかで次元削減するとかそういう必要もあるか。

これ書いてたら今ようやく終わって20分近くかかった。
このくらいの規模感だとそういうものなのだろうか?
ちゃんとプログラム書いて1日ぐらい放置しておけばもっと次元大きくなっても終わってくれるのかな。
寝よう。