Я работаю над системой рекомендаций по тегам, которая берет строки метаданных (например, текстовые описания) объекта и разбивает их на 1-, 2- и 3-граммы.Вычисление относительных частот в SQL
Данные для этой системы хранится в 3-х таблиц:
- "объект" таблицы (например, , что является описываемым)
- The "лексема" стол, наполненные всем 1- , Найдено 2 и 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
и т. Д.
Я не могу, для жизни меня, выяснить, как это сделать. Любая помощь очень ценится!
Brilliant! Работал как шарм! Я даже не знал о оконных функциях! Благодаря! – BillyBBone