我正在开发一个标签推荐系统,该系统采用对象的元数据字符串(例如文本描述),并将其拆分为 1-、2-和 3-gram。
该系统的数据保存在 3 个表中:
- “对象”表(例如正在描述的内容),
- “token”表,填充了所有找到的 1-、2-和 3-grams(下面的示例),以及
- “映射”表,它维护 (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'
现在我希望能够在单个对象 ID 的上下文中获得每个术语的相对概率,以便我可以按概率对它们进行排序,并查看哪些术语最有可能(例如ORDER BY rel_prob DESC LIMIT 25
)
对于每一行,我设想添加一列,其结果为freq/sum of all freqs for that given token_size
. 例如,在“大”的情况下,那将是1/(1+3) = 0.25
. 对于“a”,就是1/3 = 0.333
等。
对于我的一生,我无法弄清楚如何做到这一点。任何帮助是极大的赞赏!