7

mysqlデータセットで最もよく使用される単語を特定する方法を理解しようとしています。

これをどうやって行うのか、もっと簡単なアプローチがあるのか​​わからない。いくつかがアルゴリズムを提案しているいくつかの投稿を読んでください。

例:

24,500のレコードから、使用された上位10の単語を見つけます。

4

5 に答える 5

14

そうです、これは犬のように動作し、単一の区切り文字での作業に制限されていますが、うまくいけば、あなたにアイデアを与えるでしょう。

SELECT aWord, COUNT(*) AS WordOccuranceCount
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(SomeColumn, ' '), ' ', aCnt), ' ', -1) AS aWord
FROM SomeTable
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt
FROM integers a, integers b, integers c) Sub1
WHERE (LENGTH(SomeColumn) + 1 - LENGTH(REPLACE(SomeColumn, ' ', ''))) >= aCnt) Sub2
WHERE Sub2.aWord != ''
GROUP BY aWord
ORDER BY WordOccuranceCount DESC
LIMIT 10

これは、整数と呼ばれるテーブルと、0から9の値を持つ10行のiと呼ばれる単一の列を持つことに依存しています。これは最大1000語に対応しますが、それ以上に対応するように簡単に変更できます(ただし、さらに遅くなります)。

于 2013-02-19T16:53:06.173 に答える
4

すべてをPHPで実行してみませんか?手順は次のようになります

  1. 辞書を作成する(単語=>カウント)
  2. PHPでデータを読む
  3. それを言葉に分割する
  4. 各単語を辞書に追加します(最初に小文字にしてトリミングすることをお勧めします)
  5. すでに辞書にある場合は、その数を増やします。辞書にまだない場合は、値として1を設定します(カウント= 1)
  6. 辞書要素を繰り返して、上位10個の値を見つけます

主にSQLでそれを行わないのは、それがより複雑になるからです。

于 2013-02-25T23:57:45.883 に答える
1

SUBSTRING_INDEX()一般的な考え方は、各フィールドにいくつの区切り文字(スペースなど)があり、そのようなフィールドごとにループで実行されるかを把握することです。これを一時テーブルに入力すると、これをチャンクで実行したり、並列で実行したりできるという追加の利点があります。これを行うためにいくつかのSPをまとめるのは面倒ではありません。

于 2013-02-21T01:55:02.443 に答える
1
SELECT `COLUMNNAME`, COUNT(*) FROM `TABLENAME` GROUP BY `COLUMNNAME`

その非常にシンプルで機能しました...:)

于 2017-07-28T00:10:12.073 に答える
0

少し改善し、AND Sub2.aWordが含まれていないリストからストップワードを削除します(ストップワードのリスト)

SELECT aWord, COUNT(*) AS WordOccuranceCount
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(txt_msg, ' '), ' ', aCnt), ' ', -1) AS aWord
FROM mensagens
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt
FROM integers a, integers b, integers c) Sub1
WHERE (LENGTH(txt_msg) + 1 - LENGTH(REPLACE(txt_msg, ' ', ''))) >= aCnt) Sub2
WHERE Sub2.aWord != '' AND Sub2.aWord not in ('a','about','above', .....)
GROUP BY aWord
ORDER BY WordOccuranceCount DESC
LIMIT 10
于 2016-11-14T16:09:25.280 に答える