1

私は、2 つの列 (整数の wordID と varchar の単語) で構成される 1 つのテーブルのデータベースを使用しています。表は数千行の長さで、プログラムで大量のテキストを読み取り、スペースで分割し、個々の単語を大文字にしてデータベースに挿入することによって作成されました。目標は、この辞書を使用して、全文のブログ投稿、ツイート、その他のテキスト コンテンツを読み、それらの関連性を評価することです。

私がやりたいのは、各単語の数(私はそれ自体で作業しています)と各単語の「スコア」を計算することです。つまり、単語マッシュは、スコアを持つように設定されたデータで、スコアは単語の頻度の逆数であり、1 ~ 10 のスケールで表されます。考えられるのは、単語が頻繁に登場するほど、後のテキスト検索での価値が低くなるということです。ただし、1 回限りはタイプミスである可能性があるため、有用であるためには最小限の回数表示する必要があります。

これが私の選択ステートメントであり、カウントを生成すると同時に単語の頻度をスコアリングしようとしています。

  select word, 
  count(word), 
  10*(((max(count(word))+1) - count(word))/(max(count(word))))
  from dictwords where length(word)>3 group by word having count(word)>35 
  order by count(word) desc;

mysql から返されるエラーは、「グループ関数の無効な使用」です。エラー 1111。

この種のことを mySQL の 1 つのステートメントで行うことは可能ですか? または、選択を実行して結果テーブルをプレースホルダーテーブルにフィードし、スコアリングを試みることにより、カウントとスコアリングを2つのクエリに分割する必要がありますか?

4

2 に答える 2

1

最も一般的な単語が出現する回数を見つけようとしているため、単一のクエリでこれを行うことはできないと思います (私は思います)。これは、テストデータセットでうまくいきました:

# get the number of times the most common word occurs
select @maxCount := count(word)
from temp 
where length(word)>3 
group by word 
having count(word)>10
order by count(word) desc
limit 1;

# now use that max value to calculate a score
select 
    word, 
    count(word) as wordCount,
    @maxCount as maxWordCount,
    10*(((@maxCount+1) - count(word))/(@maxCount)) as score
from temp 
where length(word)>3 
group by word 
having wordCount>10
order by wordCount desc;

私が正しいかどうかを確認したい場合は、ここで sqlfiddleを参照してください。

于 2013-11-13T19:46:28.637 に答える