【问题标题】:How to rank items that match keywords by similarity如何按相似度对匹配关键字的项目进行排名
【发布时间】:2010-10-19 13:53:14
【问题描述】:

我有一个链接到关键字表的项目表。 我想列出所有共享关键字的项目,并且我想对结果进行排名,以便最相似的项目出现最高。 因此,我认为匹配所有关键字的项目将排名最高,仅匹配一个关键字的项目在列表中显示较低。

如果项目匹配相同数量的关键字,我想然后按关键字的频率对结果进行排名,这样共享不寻常关键字的项目将出现高于共享频繁出现的关键字的项目。

目前我的架构是这样的(但必要时可以更改):

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 &lt;&gt; IK2.ItemID 更改为 IK1.ItemID &lt; IK2.ItemID 以消除对,我已经将第二个顺序添加到还要考虑一个词的使用频率。但基本上贝丝回答了这个问题,所以我将其标记为答案(非常感谢)

【问题讨论】:

  • 你能添加一个你想要的例子吗?给我们3个item,keywords,以及足够的itemkeywords来展示你想要的结果

标签: sql search keyword


【解决方案1】:
Select keywordID, count(itemID) as cnt_item
from itemKeywords
group by keywordID
order by count(itemID) desc

好的,更好地了解您不想要的内容,尝试在 itemID 不匹配的关键字 ID 字段上加入 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

然后,使用该集合,计算关键字 ID 的数量并按降序返回列表:

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

【讨论】:

  • 感谢 Beth,但这列出了关键字 id,其中链接到顶部最多的项目。我想要这些项目,与其他项目最相似的项目在顶部。
  • PS 你忘了输入“GROUP BY KeywordID”
猜你喜欢
  • 2021-06-13
  • 2011-02-20
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多