Как ранжировать элементы, которые соответствуют ключевым словам по сходству - PullRequest
0 голосов
/ 19 октября 2010

У меня есть таблица элементов, связанных с таблицей ключевых слов.Я хочу перечислить все элементы с общими ключевыми словами и ранжировать результаты так, чтобы наиболее похожие элементы отображались наивысшими.Итак, я считаю, что элементы, которые соответствуют всем ключевым словам, будут наивысшими, а элементы, которые соответствуют только одному ключевому слову, будут отображаться ниже в списке.

Если элементы соответствуют одинаковому количеству ключевых слов, которые я хочу оценить, результаты ранжируются по частоте ключевого слова, так что элементы, которые имеют необычное ключевое слово, будут отображаться выше, чем элементы, которые имеют часто встречающееся ключевое слово.

В настоящее время моя схема похожа на эту (но это можно изменить при необходимости):

Item    ItemKeywords    Keywords
____    ____________    ________
ID       ItemID          ID
Item    KeywordID       Word

Я пытаюсь даже начать с sql, чтобы получить элементы, которые соответствуют большинству ключевых слов.Кто-нибудь может помочь?Я использую Sql Server 2005

EDIT - (добавлено для полноты)

Используя 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

Я немного изменил синтаксис, чтобы избежать подзапроса (все делает при объединении), я изменил *От 1017 * до IK1.ItemID < IK2.ItemID, чтобы исключить пары, и я добавил второй порядок по элементам, чтобы учесть частоту использования слова.Но, по сути, Бет ответила на вопрос, поэтому я отмечу его как ответ (большое спасибо)

1 Ответ

2 голосов
/ 19 октября 2010
Select keywordID, count(itemID) as cnt_item
from itemKeywords
group by keywordID
order by count(itemID) desc

ОК, лучше понимая, чего вы не хотите, попробуйте объединить 2 экземпляра таблицы itemKeyword в поле ключевого слова, где itemID не совпадает:

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

тогда, с этимустановить, подсчитать количество ключевых слов и вернуть список в порядке убывания:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...