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

Набор данных MovieLens предоставляет таблицу со столбцами:

userid | movieid | tag | timestamp

У меня проблемы с воспроизведением способа обрезки набора данных MovieLens, используемого в:

Совместная фильтрация по меткам, по Жень, Ли и Янгу

В 4.1 Data Set вышеупомянутой бумаги, это пишет «Для информации о тегах мы сохраняем только те теги, которые добавлены по крайней мере, 3 различных фильма. Что касается пользователей, мы только сохранить тех пользователей, которые использовали по крайней мере 3 различных тега в своих пометка истории. Для фильмов мы сохраняем только те фильмы, которые помечены как минимум тремя разными тегами. "

Я пытался запросить базу данных:

select TMP.userid, count(*) as tagnum
from (select distinct T.userid as userid, T.tag as tag from tags T) AS TMP 
group by TMP.userid
having tagnum >= 3;

Я получил список из 1760 пользователей, которые пометили 3 разных тега. Тем не менее, некоторые из тегов не добавляются как минимум в 3 отдельных фильма.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 августа 2011

Вы нигде не ограничиваете количество фильмов по тегу. Похоже, вы должны сначала удалить теги, которые не использовались по крайней мере в трех фильмах и тремя пользователями. Затем ограничьте количество пользователей, отметивших теги три раза.

В этом запросе должны быть указаны теги, помеченные тремя + пользователями и тремя + фильмами:

select T1.tag,
       (select count( distinct T2.movieid ) from tags T2 where T2.tag = T1.tag) as mcount,
       (select count( distinct T3.userid ) from tags T3 where T3.tag = T1.tag) as ucount
from tags T1
having mcount >= 3 and ucount >= 3;

Если вы вместо этого запрашиваете пользователей и используете все это как подзапрос, вы сможете проверить пользователей, которые также отметили теги три раза:

select T4.user, count(*) as ucount from
 (select T1.userid as user,
         (select count( distinct T2.movieid ) from tags T2 where T2.tag = T1.tag) as mcount,
         (select count( distinct T3.userid ) from tags T3 where T3.tag = T1.tag) as ucount
  from tags T1
  having mcount >= 3 and ucount >= 3) as T4
group by user
having ucount > 3;
...