私は約100,000のコメントを含むデータベースを持っており、最もよく使用される単語を検出したいと思います(一般的な単語を避けるためにストップワードを使用します)。
これを1回だけ実行してから、最も人気のある単語をいくつか使用して、それらを含むコメントにタグを付けます。
これを行うためのクエリとPHPコードを手伝ってもらえますか?ありがとう!
私が推測する最も簡単なアプローチは次のとおりです。
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回だけ出現するため、カウントする必要があります)。おそらく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の設定がアトマー(同期)であることを確認する必要があります。