1

私は約100,000のコメントを含むデータベースを持っており、最もよく使用される単語を検出したいと思います(一般的な単語を避けるためにストップワードを使用します)。

これを1回だけ実行してから、最も人気のある単語をいくつか使用して、それらを含むコメントにタグを付けます。

これを行うためのクエリとPHPコードを手伝ってもらえますか?ありがとう!

4

1 に答える 1

3

私が推測する最も簡単なアプローチは次のとおりです。

  • keywords(id、word)とkeywords_comments(keyword_id、comment_id、count)の 2つの新しいテーブルを作成します
    • keywordsテキストで見つけた一意のIDとキーワードを保存します
    • keywords_commentsそのキーワードを含む各コメント間の接続ごとに1行を格納します。コメントでこのcountキーワードが発生した回数を保存します。2つの列keyword_id+comment_idは一緒になって、一意の、または直接主キーを形成します。
  • データベースからすべてのコメントを取得する
  • すべてのコメントを解析し、文字以外(または他の境界)で分割します
  • これらのエントリをテーブルに書き込みます

次の2つのコメントがあります。

こんにちは元気ですか?!

うわー、こんにちは。私の名前はステファンです。

ここで、両方を繰り返し処理し、文字以外で分割します。これにより、各テキストに次の小文字が表示されます。-最初のテキスト:hello、how、are、you-2番目のテキスト:wow、hello、my、name、is、stefan

このテキストの1つを解析するとすぐに、それをデータベースに再度挿入できます。100.000コメントをRAMにロードしたくないと思います。

だからそれはこれに行きます:

  • 最初のテキストを解析して、上記のキーワードを取得します
  • keywordsまだない場合は、各キーワードをタブに書き込みます
  • キーワードからコメント(keywords_comments)への参照を設定し、カウントを正しく設定します(この例では、各単語は各テキストで1回だけ出現するため、カウントする必要があります)。
  • 2番目のテキストを解析する
  • …</li>

マイナーな改善

おそらく100.000コメントに使用する必要がある非常に簡単な改善は、カウント変数を使用するか、各コメントに新しいフィールドhas_been_analyzedを追加することです。次に、データベースからのコメントごとにそれらを読むことができます。

私は通常、データをチャンク単位で読み取るときにカウント変数を使用し、データが開始方向から変更できないことを知っています(つまり、現在の時点まで一貫性が保たれます)。それから私は次のようなことをします:

SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…

これは、すでに読んだと思われる場所に追加する日付がないことが確実にわかっている場合にのみ機能することを考慮してください。たとえばDESC、データが挿入される可能性があるため、使用は機能しません。そうすると、オフセット全体が壊れて、1つの記事を2回読み、新しい記事を読むことはありません。

外部カウント変数の一貫性を維持できない場合は、コメントを読んだらすぐにtrueに設定した分析済みの新しいフィールドを追加できます。そうすれば、どのコメントがすでに読まれているか、どのコメントが読まれていないかをいつでも確認できます。SQLクエリは次のようになります。

SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */

これは、(複数のクライアントまたはスレッドを使用して)ワークロードを並列化しない限り機能します。それ以外の場合は、読み取り+ trueの設定がアトマー(同期)であることを確認する必要があります。

于 2012-06-29T19:02:51.567 に答える