Оценяване на честотата на думите в MySQL заявка

Работя с база данни с една таблица, която е съставена от 2 колони: целочислен wordID и думата varchar. Таблицата е дълга няколко хиляди реда и е създадена чрез програмно четене на много текст и разделяне на интервал, след което отделните думи се използват и се вмъкват в база данни. Целта е да използвате този речник, за да четете пълнотекстови публикации в блогове, туитове, друго текстово съдържание и да ги оценявате за уместност.

Това, което бих искал да направя, е да изчисля броя на всяка дума (която имам да работи сама), както и "резултата" на всяка дума - тоест една дума се показва минимален брой пъти в набор от данни, за да има резултат, като резултатът е обратен на честотата на думата, по скала от 1-10. Мисълта е, че колкото по-често се появява една дума, толкова по-малко ценна ще бъде тя в моето текстово търсене по-късно. Въпреки това трябва да се появи минимален брой пъти, за да бъде и полезно, защото еднократното вероятно е печатна грешка.

Ето моя оператор select и се опитвам да отбележа честотите на думите едновременно с генерирането на брой.

  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? Или трябва да разделя преброяването и точкуването на две заявки, като направя избор в и подавам таблицата си с резултати в таблица със запазени места, след което се опитвам да я оценявам?


person Micah    schedule 13.11.2013    source източник
comment
MAX(COUNT е проблемът. За повече/по-добра помощ, обмислете предоставянето на подходящи DDL и/или sqlfiddle ЗАЕДНО С ЖЕЛАНИЯ РЕЗУЛТАТ.   -  person Strawberry    schedule 13.11.2013
comment
Мисля, че неговата дължина (дума)›3 също е грешна. Че той има предвид брой (дума)›3   -  person Andrew - OpenGeoCode    schedule 13.11.2013
comment
Той трябва да промени count(word) в SELECT дума, count(word) на: SELECT дума, count(word) като честота. След това той може да замени всички препратки към броя (думата) с честота. Много по-четливо.   -  person Andrew - OpenGeoCode    schedule 13.11.2013


Отговори (2)


Не мисля, че можете да направите това в една заявка, тъй като се опитвате да намерите колко пъти се среща най-често срещаната дума (мисля). Това работи за мен на набор от тестови данни:

# 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 тук, ако искате да видите дали го разбирам правилно.

person boodle    schedule 13.11.2013
comment
Това е доста подобно на отговора, който получих от играта с кода - вижте отговора ми по-долу. - person Micah; 13.11.2013

  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 в този набор от резултати.

person Micah    schedule 13.11.2013