1

我正在使用由 2 列组成的单表数据库:整数 wordID 和 varchar 词。该表有几千行长,是通过以编程方式读取大量文本并在空格上拆分,然后使用单个单词并将它们插入数据库来创建的。目标是使用这本词典来阅读全文博客文章、推文和其他文本内容,并对它们的相关性进行评分。

我想做的是计算每个单词的计数(我自己工作)以及每个单词的“分数”——也就是说,一个单词在数据集有一个分数,分数是单词频率的倒数,范围为 1-10。我的想法是,一个词出现的频率越高,它在我以后的文本搜索中的价值就越低。然而,它也必须出现最少的次数才能有用,因为一次性可能是一个错字。

这是我的选择语句,并尝试在生成计数的同时对词频进行评分。

  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返回的错误是“Invalid use of group function”。错误 1111。

是否可以在 mySQL 中的一条语句中执行此类操作?或者我应该通过选择并将我的结果表输入占位符表然后尝试对它进行评分,从而将计数和评分分成两个查询?

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 回答
0
  drop table if exists wordcount;

  create table wordcount(
   word varchar(50) primary key,
   wc   int     not null
  );

  insert into wordcount (word, wc)
  select word, count(word)
  from dictwords 
  where length(word)>3 
  group by word 
  having count(word)>35 
  order by count(word) desc;


  drop table if exists wordscore;
  create table wordscore(
  word  varchar(50) primary key,
  score int     not null);

  insert into wordscore (word, score)
  select word, (1-(10*(((max(wc)+1) - wc)/(max(wc)))))*10
  from wordcount 
  group by word;

不得不在这里创建一张桌子 - 但我得到了它。由于我只在原始数据中查看了 35 个或更多实例的单词,因此我们在这个结果集中得到了 7-10 分。

于 2013-11-13T20:01:14.457 回答