9

テキストのトピック/タグを見つけるために、潜在的意味分析 (LSA) を PHP に実装したいと考えています。

これが私がしなければならないと思うことです。これは正しいです?PHPでコーディングするにはどうすればよいですか?どの単語を選択するかを決定するにはどうすればよいですか?

外部ライブラリを使用したくありません。私はすでに Singular Value Decomposition (SVD) の実装をしています。

  1. 指定されたテキストからすべての単語を抽出します。
  2. tf–idfなどを使用して、単語/フレーズに重みを付けます。重み付けが複雑すぎる場合は、発生回数だけを取ります。
  3. マトリックスを作成します。列はデータベースからのいくつかのドキュメント (多いほど良いですか?)、行はすべて固有の単語、値は出現回数または重みです。
  4. 特異値分解 (SVD) を実行します。
  5. 行列 S (SVD) の値を使用して、次元削減を行います (どのように?)。

あなたが私を助けてくれることを願っています。事前にどうもありがとうございました!

4

4 に答える 4

7

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 つの方法!)

  1. SVD と縮小ヒューリスティックを使用して、U' Sigma' V' 次元縮小行列を構築します。

  2. 手で、U' 行列を調べて、各「トピック」を説明する用語を考え出します。たとえば、そのベクトルの最大の部分が「ブロンクス、ヤンキース、マンハッタン」である場合、「ニューヨーク市」が適切な用語かもしれません。これらを連想配列またはリストに保持します。ベクトルの数は有限であるため、このステップは合理的なはずです。

  3. ドキュメントの単語のベクトル (v1) があると仮定すると、v1 * t(U') はそのドキュメントの最も強力な「トピック」を提供します。上位 3 つを選択し、前の手順で計算した「トピック」を指定します。

于 2009-06-24T15:17:29.607 に答える
1

この回答は、投稿者の質問に対する直接の回答ではなく、ニュース項目に自動タグを付ける方法に関するメタ質問に対する回答です。OP は Named Entity Recognition について言及していますが、自動タグ付けに沿った何かを意味していると思います。彼らが本当にNERを意味しているなら、この反応はごちゃごちゃです:)

これらの制約 (1 日あたり 600 アイテム、1 アイテムあたり 100 ~ 200 文字) とさまざまなソースがある場合、いくつかのタグ付けオプションを次に示します。

  1. 手で。アナリストは、おそらく数時間で、1 日あたり 600 個のこれらを簡単に実行できます。Amazon の Mechanical Turk のようなもの、またはユーザーにそれをさせることも実現可能かもしれません。たとえそれが 50 や 100 であっても、「手作業でタグ付けされた」数があることは、以下の自動生成された方法で得られるものを比較するための良い基礎となります。

  2. LSA、トピック モデル (潜在的ディリクレ配分法) などを使用した次元削減.... 実世界のデータ セットでの LSA は本当に不運で、その統計的根拠に満足していません。LDA の方がはるかに優れている と思います。また、トピックをテキストに割り当てる方法について最もよく考えられた素晴らしいメーリング リストがあります。

  3. 単純なヒューリスティック... 実際のニュース アイテムがある場合は、ニュース アイテムの構造を利用します。最初の文に注目し、一般的な単語 (ストップ ワード) をすべて捨てて、最初の 2 つの文から最適な名詞を 3 つ選びます。または、最初の文のすべての名詞を取り上げて、どこに到達するかを確認してください。テキストがすべて英語の場合は、シバン全体で品詞分析を行い、何が得られるかを確認してください。ニュース レポートなどの構造化されたアイテムでは、LSA やその他の順序に依存しないメソッド (tf-idf) によって多くの情報が破棄されます。

幸運を!

(この回答が気に入ったら、それに合うように質問にタグを付け直してください)

于 2009-06-23T13:40:53.427 に答える
0

link textで、これをすべて PHP で行う危険性に関する追加の SO スレッドがあります。

具体的には、Latent Semantic Mappingsに関するこのペーパーへのリンクがあり、テキストの結果の「トピック」を取得する方法が説明されています。

于 2009-06-23T13:51:31.847 に答える