[英]Algorithm to get similar thematic text by tag frequency
我有一堆文字(標題+消息),我想為它們添加標簽。 我通過這種方式處理每個文本:
並為每個文本和條目的數量獲取一些標簽。
現在我有標簽和文本ID的關系頻率表:
tag_id1 | tag_id2 | tag_id3 | tag_id4
text_id1 | 10 | 1 | 3 | 1
text_id2 | 1 | 1 | 1 | 1
text_id3 | 13 | 0 | 2 | 0
text_id4 | 9 | 1 | 2 | 1
text_id5 | 0 | 0 | 0 | 0
我如何通過mysql查詢text_id1的類似文本? 我想得到類似排序列表text_id3 text_id4 text_id2的東西
“Jaccard相似性”algo是不夠的,因為它只計算標簽關系
一個相似的度量是每個標記字段中差異的絕對值。 您可以在SQL中計算如下:
select t2.name, abs(t1.tag_id1-t2.tag_id1)+abs(t1.tag_id2-t2.tag_id2)+
abs(t1.tag_id3-t2.tag_id3)+abs(t1.tag_id4-t2.tag_id4) score from
tag t1, tag t2 where t1.name='text_id1' and t2.name != 'text_id1'
order by score asc;
+----------+-------+
| name | score |
+----------+-------+
| text_id4 | 2 |
| text_id3 | 6 |
| text_id2 | 11 |
| text_id5 | 15 |
+----------+-------+
您可以將文本特征解釋為向量,將標記作為維度(或者更確切地說是基礎,如果您深入到線性代數中)。 然后,您可以計算文本之間的點積以評估相似性。
這將獎勵共同標簽中的高頻率,但不會主動懲罰一個文本中具有高頻率而另一個文本中具有低頻率的標簽。 因此,在很多地方談論大多數標簽的長文本將比僅包含少量標簽的短文本排名更高,但這些標簽與參考文本非常相似。 如果這是一個問題,您可以通過使用相對而不是絕對頻率來改善情況,即將頻率乘以一個公因子,使得它們的和等於每個文本的1(或100或其他)。
如果您的頻率僅在一列中,並且在另外兩列中包含text和tag id,則執行此計算會更容易。 假設你有一個名為freqs
的表, freqs
包含text_id
, tag_id
和frequency
。 然后你可以做類似的事情
SELECT t2.text_id, SUM(t1.frequency * t2.frequency) AS score
FROM freqs AS t1, freqs AS t2
WHERE t1.text_id = ? -- insert the ID of the reference text
AND t2.text_id <> t1.text_id -- different text
AND t1.tag_id = t2.tag_id -- but same tag
GROUP BY t2.text_id -- one result for every text
ORDER BY score DESC -- closest text first
您可以在http://sqlfiddle.com/#!2/a6af7/4上看到這一點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.