2

次のようなデータベースがあるとします。

Actions_tbl:

-------------------------------------------------- ------
ID | アクション名 | ユーザーID|
-------------------------------------------------- ------
1 | ジョンは一冊の本を読む | 1     
2 | ジョンの本を読む | 1
3 | ジョーは火を飛び越える | 2
4 | 別の本を読む | 2
5 | ジョンは図書館で本を読む | 1
6 | ジョーは本を読む | 2
7 | 本を読む | 3
8 | 理由もなくジャンプするのがロナルドの癖です | 3

Users_tbl:

-----------------------
ユーザー ID | ユーザー名 |
-----------------------
1 | ジョン
2 | ジョー
3 | ロナルド
4 | アラズ
-----------------------

ユーザーに関係なく、最も繰り返される同様のアクションを選択し、自分の user_name を現在のユーザーに置き換えることができるかどうか疑問に思っています!

ある本を読んで、本を読んで、別の本を読んで、図書館で本を読んで、本を読んで、本を読んで、最も一般的な単語を持っているので、本を読むことに関連するスタッフは6回繰り返され、私のシステムは表示するはずですこれらの 6 つの文の 1 つをランダムに選択し、Araz を user_name に置き換えます

Like: アラズは本を読む

私のアイデアは

select replace(a.action_name , b.user_name) from actions_tbl a, user_tble b where a.user_id = b.user_id group_by

次に、phpで類似点を1つずつ確認します

levenshtein()

しかし、これはまったくパフォーマンスがありません!

大きなデータベースといくつかの異なるテーブルに対して同じことをしたいとします。これは私のサーバーを破壊します!!!

より良いアイデアはありますか?

http://www.artfulsoftware.com/infotree/queries.php#552では、levenshtein() 関数が MySQL 関数として実装されていますが、まず、十分なパフォーマンスがあると思いますか? そして、私の場合はどのように使用するのですか?たぶん、自己結合バンがこの問題を修正しますが、私はSQLが得意ではありません!

* 類似のアクションは、X% 以上の一般的な単語を持つアクションです


**詳細情報と注意事項:**

  1. 私はPHPとMySQLに限定されています。

  2. これは単なる例です。私の実際のプロジェクトでは、アクションは長い段落です。だからこそ、パフォーマンスは問題です。実際のシナリオは次のとおりです。ユーザーがいくつかのプロジェクトのプロジェクトの説明を入力しました。これらのデータは類似している可能性があります (ユーザーは同じ作業領域を持っている可能性があります)。次のプロジェクトの説明を (以前の入力に基づいて) 自動的に入力したい、時間を節約するために。

  3. 実用的な解決策があれば幸いです 。NLP 関連のソリューションをチェックしましたが、それらは興味深いものですが、それらの多くは正確ではなく、PHP を使用して実装できるとは思いません。

  4. 出力は、他のすべてのプロジェクトと同様に意味があり、適切な段落である必要があります。そのため、以前のものから選択することを考えていました。


あなたの知的な答えをありがとう、あなたが状況に光を当てることができれば本当に感謝しています

4

2 に答える 2

2

あなたが話しているのは、テキストクラスタリングプロセスです。似たようなテキストを見つけようとしていて、そのうちの 1 つを任意に選択しています。私は、この形式のテキスト マイニングを行うデータベースに精通していません。

あなたが説明したことについては、かなり基本的なテキストマイニング手法がおそらく機能します。ユーザー名を除くすべての単語を使用して、用語とドキュメントのマトリックスを作成します。次に、特異値分解を使用して、最大の特異値とベクトルを取得します (これは、相関行列の最初の主成分です)。同様の活動は、この線に沿って集まるはずです。

語彙が限られており、表に用語がある場合は、重複する単語の割合によって 2 つのアクション間の距離を測定できます。アクション内のすべての単語のリストはありますか?

于 2012-07-18T13:22:09.277 に答える
1

最初に、与えられた入力を既存のすべてのテキストと比較するか、すべてのテキストの対比較を行うかを決定する必要があります。あなたの質問は後者を求めていますが、あなたが概説したアプリケーションは前者のように聞こえます。

単一の入力のみをデータベースと比較する場合、レーベンシュタイン距離の計算が中程度のデータベース サイズまで十分に高速であることを期待したいと思います。また、テキスト ベースの現在のコンテンツに関する何らかの形式の中間データ構造を保存しない限り、処理を高速化する方法はほとんどないでしょう。新しい入力ごとに何かを再計算することは、おそらく同じくらいコストがかかります。

すべてのペアを比較したい場合は、それぞれのレーベンシュタイン計算に時間がかかりすぎます。類似性の別の概念を考案する必要があります。私の頭に最初に浮かぶのは、さまざまな形式の単語にある程度回復力があると思われるサフィックス ツリーです。. そのツリーにすべての段落を挿入できます。サフィックス ツリーは通常、1 つのポインターを格納しますが、1 つはデータベース行を識別し、もう 1 つはその行のテキスト内の位置を示すインデックスのペアを格納する場合があります。ツリーを構築した後、それをトラバースして共通の部分文字列を特定し、対応するペアの類似度カウンターをインクリメントできます。この測定値を調整するには、少し実験する必要があります。カウンタをインクリメントする前に、共通文字列の最小長を課したい場合があります。長いテキストは、意味的に関連性がなくても一般的な単語が含まれる可能性が高いため、何らかの方法で長さを補正する必要がある場合があります。これを行う標準的な方法があるとは思えません。

Gordon によって提案されたterm -document マトリックスアプローチも興味深いようで、PHP でもそれを実装できるはずです。そのアプローチは、語根が同じであっても、語形の変化に敏感です。一方、データベースに格納されている適切なマトリックスを保持し、メインのテキスト テーブルを更新するときにその構造を同期させておく方が簡単な場合があります。これらのアプローチはどちらも、レーベンシュタイン距離とは根本的な違いがあります。全体的な順序はあまり気にしません。あなたの場合、これは良いことだと思います。「ジョンは湖で泳いだ後に本を読んだ」というテキストは、レーベンシュタイン距離よりも「湖で泳いだ後、ジョーが本を読んだ」に似ていると見なすからです。でしょう。

あなたの例は、類似性をランク付けするだけでなく、クラスターの境界も決定したいことを示しています。つまり、「これらはグループを形成している」と「それらは異なるグループに属している」と言います。これには明確なカットオフはありません。そのため、ヒューリスティックを試してみる必要があります。常に最も類似したテキストを選択するか、k 個の最も類似したテキストを選択するだけでアプリケーションに十分である場合を除きます。いずれにせよ、最初に類似度の計算に集中し、後でユーザー名の置換などを追加します。

于 2012-07-26T07:40:13.520 に答える