LSA リンク:
これが完全なアルゴリズムです。あなたがSVDを持っているなら、あなたはそこにいるほとんどの道です。上記の論文は、私よりもうまく説明しています。
仮定:
- あなたのSVD関数は特異値と特異ベクトルを降順で与えます。 そうでない場合は、もっとアクロバットをしなければなりません。
M : コーパス行列、w (単語) x d (ドキュメント) (w 行、d 列)。これらは raw カウント、または tfidf などです。ストップワードは削除される場合とされない場合があり、ステミングが発生する場合があります (Landauer は、ストップワードを保持し、ステミングを行わないと言いますが、tfidf には賛成です)。
U,Sigma,V = singular_value_decomposition(M)
U: w x w
Sigma: min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V: d x d matrix
Thus U * Sigma * V = M
# you might have to do some transposes depending on how your SVD code
# returns U and V. verify this so that you don't go crazy :)
次に、還元性....実際のLSAペーパーは、特異値が特異値の合計の50%を超えるように十分なベクトルを維持することを基礎の適切な近似として示唆しています。
もっと簡潔に... (疑似コード)
Let s1 = sum(Sigma).
total = 0
for ii in range(len(Sigma)):
val = Sigma[ii]
total += val
if total > .5 * s1:
return ii
これは、以前は min(d,w) だった新しい基底のランクを返します。{ii} で概算します。
(ここでは、' -> 素数、転置ではありません)
サイズが wx ii、ii x ii、および ii x d の新しい行列 U'、Sigma'、V' を作成します。
それが LSA アルゴリズムの本質です。
この結果の行列 U' * Sigma' * V' は、「改善された」コサイン類似度検索に使用できます。または、たとえば、その中の各ドキュメントの上位 3 語を選択できます。これが単純な tf-idf 以上のものをもたらすかどうかは、議論の問題です。
私にとって、LSA は実世界のデータ セットでは多義性があり、トピックが多すぎるデータ セットでうまく機能しません。数学的/確率論的根拠は不健全です(通常の(ガウス)分布を想定しており、単語数には意味がありません)。
あなたの走行距離は間違いなく異なります。
LSA を使用したタグ付け (1 つの方法!)
SVD と縮小ヒューリスティックを使用して、U' Sigma' V' 次元縮小行列を構築します。
手で、U' 行列を調べて、各「トピック」を説明する用語を考え出します。たとえば、そのベクトルの最大の部分が「ブロンクス、ヤンキース、マンハッタン」である場合、「ニューヨーク市」が適切な用語かもしれません。これらを連想配列またはリストに保持します。ベクトルの数は有限であるため、このステップは合理的なはずです。
ドキュメントの単語のベクトル (v1) があると仮定すると、v1 * t(U') はそのドキュメントの最も強力な「トピック」を提供します。上位 3 つを選択し、前の手順で計算した「トピック」を指定します。