2013-08-10 2 views
0

Я работаю над системой рекомендаций по тегам, которая берет строки метаданных (например, текстовые описания) объекта и разбивает их на 1-, 2- и 3-граммы.Вычисление относительных частот в SQL

Данные для этой системы хранится в 3-х таблиц:

  1. "объект" таблицы (например, , что является описываемым)
  2. The "лексема" стол, наполненные всем 1- , Найдено 2 и 3 грамма (примеры ниже) и
  3. Таблица «сопоставление», которая поддерживает ассоциации между (1) и (2), а также частоту для этих случаев.

Поэтому я смог построить таблицу с помощью LEFT JOIN, который выглядит примерно так:

SELECT mapping.object_id, mapping.token_id, mapping.freq, token.token_size, token.token 
FROM mapping LEFT JOIN 
    token 
    ON (mapping.token_id = token.id) 
WHERE mapping.object_id = 1; 

    object_id token_id freq token_size token 
+-----------+----------+------+------------+-------------- 
    1   1   1  2   'a big' 
    1   2   1  1   'a' 
    1   3   1  1   'big' 
    1   4   2  3   'a big slice' 
    1   5   1  1   'slice' 
    1   6   3  2   'big slice' 

Теперь я хотел бы иметь возможность получить относительную вероятность каждого члена в пределах контекст одного идентификатора объекта, так что я могу сортировать их по вероятности и посмотреть, какие термины наиболее вероятны (например, ORDER BY rel_prob DESC LIMIT 25)

Для каждой строки я предвижу добавление столбца, который дает результат freq/sum of all freqs for that given token_size , Например, в случае «большого» это будет 1/(1+3) = 0.25. Для «а» это 1/3 = 0.333 и т. Д.

Я не могу, для жизни меня, выяснить, как это сделать. Любая помощь очень ценится!

ответ

2

Если я понял вашу проблему, вот запрос вам нужно

select 
    m.object_id, m.token_id, m.freq, 
    t.token_size, t.token, 
    cast(m.freq as decimal(29, 10))/sum(m.freq) over (partition by t.token_size, m.object_id) 
from mapping as m 
    left outer join token on m.token_id = t.id 
where m.object_id = 1; 

sql fiddle example

надежду, что помогает

+0

Brilliant! Работал как шарм! Я даже не знал о оконных функциях! Благодаря! – BillyBBone

Смежные вопросы