Какая формула используется для построения списка связанных элементов в системе на основе тегов? - PullRequest
2 голосов
/ 23 мая 2011

Есть много сайтов, которые используют «теги» для классификации элементов в своей системе.Например, YouTube использует ключевые слова для категоризации видео, переполнение стека использует теги для классификации вопросов и т. Д.

Какие формулы используют эти сайты (особенно SO) для создания списка элементов, связанных с другим элементом, на основе теговона имеет?Я строю систему, очень похожую на ту, что написана на SO, и я хотел бы найти способ генерировать список из 20 элементов или около того на основе тегов одного элемента, но также сделать его достаточно распространенным, чтобы каждая фотография генерироваласовершенно другой список, и, таким образом, нажатие на элемент в любом связанном списке может в конечном итоге привести вас практически к каждому элементу в базе данных.

Ответы [ 4 ]

1 голос
/ 24 мая 2011

Технический термин для организации, основанный на пользовательских тегах: folksonomy .Поиск в Google по этому термину позволяет найти огромное количество материалов о том, как эти системы объединяются.Хорошее место для начала - статья Википедии .

0 голосов
/ 26 мая 2011

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

SELECT PT.WidgetID, COUNT(*) AS CommonTags, PS.OtherOrderingCriteria1, PS.OtherOrderingCriteria2, PS.OtherOrderingCriteria3, PS.Date FROM WidgetTags PT INNER JOIN WidgetStatistics PS ON PT.WidgetID = PS.WidgetID
    WHERE PT.TagID IN (SELECT PTInner.TagID FROM WidgetTags PTInner WHERE PTInner.WidgetID = @WidgetID)
    AND PT.WidgetID != @WidgetID
GROUP BY PT.WidgetID, PS.OtherOrderingCriteria1, PS.OtherOrderingCriteria2, PS.OtherOrderingCriteria3, PS.Date
ORDER BY CommonTags DESC, PS.OtherOrderingCriteria1 DESC, PS.OtherOrderingCriteria2 DESC, PS.OtherOrderingCriteria3 DESC, PS.Date DESC, PT.WidgetID DESC
0 голосов
/ 24 мая 2011

Сходство между элементами часто представляется в виде точечных произведений между векторами, представляющими элементы.Поэтому, если у вас есть система на основе тегов, каждый тег будет определять одно измерение.Тогда вектор для элемента становится 1 в измерении i, если для этого элемента установлен тег i (или более высокие числа, если вы разрешаете множественное тегирование).Если вы вычислите скалярное произведение векторов двух элементов, вы получите сходство для этих элементов (Примечание: векторы должны быть нормализованы так, чтобы абсолютное значение равнялось 1).

Обратите внимание, что размерность станет очень большой (обычно несколько десятков тысяч тегов).Это звучит как шоу-стоппер для такого рода вещей.Но вы также не заметите, что векторы действительно редки, и произведение из нескольких точек становится одним большим матричным умножением разреженной матрицы с ее собственным транспонированием.Используя эффективные алгоритмы для разреженного умножения матриц, это можно сделать относительно быстро.

Также обратите внимание, что большинство систем полагаются не только на теги, но и на «поведение пользователя» (что бы это ни значило).То есть для поведения пользователя YouTube будет «Просмотр видео», «Подписка на канал», «Поиск похожих видео как видео X» или «Пометка видео x с тегом y».

0 голосов
/ 23 мая 2011

Я должен был решить эту проблему для контракта несколько лет назад, и компания была достаточно хороша, чтобы позволить мне писать в блоге о том, как я сделал это в http://bentilly.blogspot.com/2011/02/finding-related-items.html.

Вы заметите, что если вы получите приличный объем данных, то вы действительно захотите сделать это из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...