Ищите советы по запросу "похожие видео" в тегированной видеосистеме - PullRequest
9 голосов
/ 20 декабря 2008

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

Пример текущего запроса:

SELECT video_name FROM videos INNER JOIN videotags ON videos.id=videotags.video_id INNER JOIN tags ON tags.id=videotags.tag_id WHERE tag_name='x' AND videos.id<>'y' LIMIT 5

Где x - любой из тегов текущего видео, а y - идентификатор текущего видео. (П.С. Я использую параметризованные запросы, не волнуйтесь)

Мне просто любопытно, как вы все справитесь с этим, может быть, было бы лучше включить похожие названия видео?

Вот как настраиваются мои таблицы базы данных:

VIDEOS TABLE
------------
video_id [PK,auto_increment] int(11)
video_name varchar(255)

TAGS TABLE
----------
tag_id [PK,auto_increment] int(11)
tag_name varchar(255)

VIDEOTAGS TABLE
---------------
tag_id [PK,FK] int(11)
video_id [PK,FK] int(11)

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

Сайт построен на PHP с базой данных MySQL, но это действительно не имеет значения:)

РЕДАКТИРОВАТЬ: Ходили разговоры о том, чтобы пойти по органическому маршруту, поэтому я решил опубликовать две другие таблицы, которые связаны друг с другом и связаны с просмотром видео и оценками видео. Теперь обратите внимание, что я не собираюсь добавлять дополнительные столбцы специально к таблице просмотров видео из-за проблем с конфиденциальностью (да, я знаю, что храню IP-адреса в таблице рейтинга)

VIDEOVIEWS TABLE
----------------
video_id [FK] int(11)
view_time datetime

VIDEORATINGS TABLE
------------------
video_id [PK,FK] int(11)
ip_address [PK] varchar(15)
rating int(1)
rate_time datetime

Ответы [ 2 ]

4 голосов
/ 21 декабря 2008

Этот запрос должен возвращать идентификаторы видео (v2), которые имеют общие теги с данным видео (v1), в порядке убывания количества общих тегов.

SELECT v2.video_id
FROM VideoTags AS v1
  JOIN VideoTags AS v2
  USING (tag_id)
WHERE v1.video_id = ?
  AND v1.video_id <> v2.video_id
GROUP BY v2.video_id 
ORDER BY COUNT(*) DESC;
1 голос
/ 20 декабря 2008

Очень интересный вопрос.

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

1) Используйте все теги - например, представьте запросы для списка видео, каждый тег которого содержит это видео. Создайте список видео, упорядоченный по количеству тех списков, в которых они появляются, то есть по количеству тегов, которые они имеют общего с этим видео. Те, у кого больше общих тегов, предположительно «более связаны».

(Я не предлагаю вам делать несколько запросов в реальности, просто пытаюсь объяснить, что я имею в виду ... кто-то с лучшим SQL-фу, чем я, вероятно, может придумать один запрос, который сделает это. Возможно, вы можете дополнительно заказать по популярности или другой имеющейся у вас информации).

2) Попытайтесь использовать алгоритм, позволяющий естественным образом создавать похожие видео, например, «люди, которые купили это, также купили это». Например, если вы отслеживаете, кто что просматривал, вы можете составить запрос, который выдаст такой список.

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