[英]How to rank items that match keywords by similarity
我有一個鏈接到關鍵字表的項目表。 我想列出所有共享關鍵字的項目,並希望對結果進行排名,以便最相似的項目出現在最高位置。 因此,我認為與所有關鍵字匹配的項目將排在最高位置,而僅與一個關鍵字匹配的項目在列表中排在后面。
如果項目與相同數量的關鍵字匹配,則我想按關鍵字的頻率對結果進行排名,以便共享不尋常關鍵字的項目看起來比共享頻繁出現的關鍵字的項目更高。
目前,我的架構是這樣的(但是如果需要可以更改):
Item ItemKeywords Keywords
____ ____________ ________
ID ItemID ID
Item KeywordID Word
我甚至努力從sql開始來獲取與大多數關鍵字匹配的項目。 有人可以幫忙嗎? 我正在使用Sql Server 2005
編輯-(為完整性而添加)
使用Beth的SQL作為指針,我提出了以下內容,我認為它們可以按我的意願工作,只是要做一些更多的測試:
SELECT IK1.ItemID,
IK2.ItemID,
COUNT(IK2.KeywordID) AS KeywordCount,
MIN(WordFrequency) AS WordFrequency
FROM ItemKeywords IK1
INNER JOIN ItemKeywords IK2
ON IK1.KeywordID = IK2.KeywordID --Keywords match
AND IK1.ItemID < IK2.ItemID --Eliminate pairs (Bill & Ted but not Ted and Bill or Bill and Bill)
INNER JOIN (SELECT KeywordID, COUNT(*) WordFrequency
FROM dbo.ItemKeywords
GROUP BY KeywordID) AS KF
ON KF.KeywordID = IK2.KeywordID --Join to sub-query to get frequency of word
GROUP BY IK1.ItemID, IK2.ItemID
ORDER BY COUNT(IK2.KeywordID) DESC, MIN(WordFrequency) ASC --Order by most matching keywords then by most unusual word
我已略微更改了語法以避免子查詢(在連接上做所有事情),將IK1.ItemID <> IK2.ItemID
更改為IK1.ItemID < IK2.ItemID
以消除對,並添加了第二項也要考慮到單詞使用的頻率。 但本質上,貝絲回答了這個問題,所以我將其標記為答案(非常感謝)
Select keywordID, count(itemID) as cnt_item
from itemKeywords
group by keywordID
order by count(itemID) desc
確定,更好地了解您不想要的內容,請嘗試在itemID不匹配的keywordID字段上加入itemKeyword表的2個實例:
select ik.itemID, ik1.itemID as itemID1, ik.keywordID
from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
where ik.itemID <> ik1.itemID
然后,使用該設置,計算keywordID的數量,並以降序返回列表:
select itemID, itemID1, count(keywordID) as count_kwd
from
( select ik.itemID, ik1.itemID as itemID1, ik.keywordID
from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
where ik.itemID <> ik1.itemID
) t
group by itemID, itemID1
order by count(keywordID) desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.