質問

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

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

外部ライブラリを使用したくありません。 私はすでに特異値分解(SVD)の実装を行っています。

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

あなたが私を助けてくれることを願っています。よろしくお願いします!

役に立ちましたか?

解決

LSAリンク:

完全なアルゴリズムは次のとおりです。 SVDをお持ちの場合は、ほとんどそこにいます。上記の論文は私よりもそれをよく説明しています。

仮定:

  • SVD関数は、特異値と特異ベクトルを降順で提供します。そうでない場合は、さらにアクロバットを行う必要があります。

M :コーパス行列、w(単語)x d(ドキュメント)(w行、d列)。これらは、rawカウント、またはtfidfなどです。ストップワードは削除される場合とされない場合があり、ステミングが発生する場合があります(ランダウアーはストップワードを保持し、語幹を削除しますが、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}で近似します。

(ここでは、 '->転置ではなく素数)

サイズw x 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つを選択して、「トピック」を指定します。前のステップで計算されたとおり。

他のヒント

この回答は、ポスターの質問に対する直接的な質問ではなく、ニュース項目に自動タグを付ける方法のメタ質問に対するものです。 OPはNamed Entity Recognitionに言及していますが、自動タグ付けに沿ったものを意味すると思います。本当にNERを意味する場合、この応答はhogwashです:)

これらの制約(1日あたり600アイテム、1アイテムあたり100〜200文字)が異なるソースである場合、タグ付けオプションは次のとおりです。

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

  2. LSA、トピックモデル(潜在ディリクレ割り当て)などを使用した次元数の削減....実世界のデータセットでLSAの運が非常に悪かったため、その満足度が低い統計的根拠。 LDAの方がはるかによく、信じられないほどのメーリングリストトピックをテキストに割り当てる方法に関する最良の考え方。

  3. 単純なヒューリスティック...実際のニュースアイテムがある場合は、ニュースアイテムの構造を活用する。最初の文に焦点を当て、すべての一般的な単語(ストップワード)を捨て、最初の2つの文から最高の3つの名詞を選択します。または、最初の文のすべての名詞を取り、それがあなたをどこに導くかを見てください。テキストがすべて英語である場合は、シバン全体の音声分析の一部を実行し、それがあなたに何をもたらすかを見てください。ニュースレポートなどの構造化されたアイテムでは、LSAおよびその他の順序に依存しないメソッド(tf-idf)は多くの情報をスローします。

がんばって!

(この回答が気に入った場合は、質問に合わせてタグを付け直してください)

最後のステップまで、すべてが正しく見えます。 SVDの通常の表記法は、3つの行列A = USV *を返すことです。 Sは、この場合、各次元が元のデータをどの程度キャプチャするかの尺度を基本的に与える対角行列(対角線からすべてゼロを意味する)です。数値(「特異値」)は下がってくるので、有用な次元数のドロップオフを探すことができます。それ以外の場合は、必要な次元数として任意の数Nを選択するだけです。

ここで少しあいまいになります。次元が削減された空間内の用語(単語)の座標はUまたはVのいずれかであり、入力行列の行または列のどちらにあるかによって異なります。一方で、単語の座標はUの行になると思います。つまり、Uの最初の行は入力行列の最初の行、つまり最初の単語に対応します。次に、その行の最初のN列を、縮小されたスペース内の単語の座標として取得します。

HTH

更新:

これまでのこのプロセスでは、タグを選択する方法を正確に説明していません。 LSIを使用してタグを選択する人を聞いたことはありません(たとえば、決定木など、機械学習アルゴリズムがタスクに適している場合があります)。 LSIは、2つの単語が類似しているかどうかを示します。これはタグの割り当てから長い道のりです。

2つのタスクがあります-a)使用するタグのセットは何ですか? b)最適な3つのタグの選択方法。 (a)答えるのにLSIがどのように役立つかについての感覚はあまりありません。タグのセットは手動で選択できます。ただし、LSIを使用している場合、タグはおそらくドキュメント内で発生する単語である必要があります。次に、(b)で、ドキュメント内で見つかった単語に最も近いタグを選択します。それを実装するいくつかの方法を試すことができます。ドキュメント内の任意の単語に最も近い3つのタグを選択します。タグの座標(Uの行)と単語の座標(行U)。

これをすべてPHPで行うことの危険性については、リンクで追加のSOスレッドがあります。テキスト

具体的には、潜在セマンティックマッピングに関するこのペーパーへのリンクがあります。結果の「トピック」を取得する方法を説明します。テキスト用。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top