0

我正在开发一个标签推荐系统,该系统采用对象的元数据字符串(例如文本描述),并将其拆分为 1-、2-和 3-gram。

该系统的数据保存在 3 个表中:

  1. “对象”表(例如正在描述的内容),
  2. “token”表,填充了所有找到的 1-、2-和 3-grams(下面的示例),以及
  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'

现在我希望能够在单个对象 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等。

对于我的一生,我无法弄清楚如何做到这一点。任何帮助是极大的赞赏!

4

1 回答 1

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小提琴示例

希望有帮助

于 2013-08-10T21:29:08.590 回答