studylog/北の雲を見つけたので乗っかってみる。未解決って書いてあるし。文書群データが疎行列\(A\)で与えられているとする。ここで、各行が文書を、各列が語を表しているとする。ここで文書間のコサイン類似度を総当りで計算したいものとして、その方法を示す。\(\tilde{A}\)をどう計算するかだが、ブロードキャスティングを使ってインプレイスで求めるのがいいかと思う。以下にサンプルコードを示す。a.dot(a.T)print(sims.toarray())ここで、4行目~6行目では適当な疎行列を用意している。8行目~10行目では各行をインプレイスで正規化している。12行目のsimsにはコサイン類似度を表す行列が入る。注意すべきなのは、結果として出てくるsimsは型として疎行列になるのだが、かなり密になると思われるので、文書数が多いときは全ペアについてコサイン類似度計算しようというのはそもそも計算量的にもメモリ量的にも現実的ではない。実際上記リンク先に具体的な問題のサイズが書かれているが、そのくらいの大きさだとまともに動かないだろう。kNNなどを使って近いところだけを求めるのが現実的だと思うが、scipy.sparse.NearestNeighborsではコサイン類似度の指定がうまく動かないようだ(ドキュメントには書かれているのだが)。そこで、正規化してからL2ノルムでkNNすればよい。各ベクトルのL2ノルムが1であるという前提の元、L2ノルムとコサイン類似度には次のような関係がある。2\mathrm{cossim}(x,y)\end{align}つまりL2ノルムでの昇順ソートはコサイン類似度の降順ソートと一致する。2017年4月13日はむかずさんが使われているベクトル/行列のスパース度はどれくらいですか?概算でいいです。非ゼロ要素が1/10000以下くらいです。コメントをキャンセルメールアドレスが公開されることはありません。