2010-06-06 1 views
2

L'ensemble de données MovieLens fournit une table avec des colonnes:Comment élaguer les données établies par la fréquence pour se conformer à la description du papier

userid | movieid | tag | timestamp 

J'ai du mal à reproduire la façon dont ils élagués l'ensemble de données MovieLens utilisées dans:

Tag Informed Collaborative Filtering, by Zhen, Li and Young

Dans 4.1 ensemble de données du document ci-dessus, il écrit « pour les informations de marquage, nous ne gardons que les balises qui sont ajoutés sur au moins 3 films distincts. En ce qui concerne les utilisateurs, nous ne Gardez les utilisateurs qui ont utilisé au moins 3 balises distinctes dans leur historique de balisage . Pour les films, nous ne gardons que les films qui sont annotées par au moins 3 balises distinctes «

J'ai essayé d'interroger la base de données.

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; 

Je suis une liste de 1760 utilisateurs marqué 3 balises distinctes . Cependant, certaines balises ne sont pas ajoutés sur au moins 3 films distincts.

Toute aide est appréciée.

+0

Quel RDBMS utilisez-vous? L'effet est-il censé être cumulatif ou indépendant? par exemple. Si une étiquette est rejetée comme n'étant pas sur au moins 3 films distincts, cette suppression peut-elle affecter le calcul des utilisateurs qui ont utilisé au moins 3 étiquettes distinctes dans leur historique de marquage? (Indépendant semble avoir plus de sens) –

+0

J'utilise MYSQL. Si une étiquette est rejetée comme n'étant pas sur au moins 3 films distincts, je pense que la suppression devrait affecter le calcul des utilisateurs qui ont utilisé au moins 3 étiquettes distinctes dans leur historique de marquage. L'auteur de l'article a reçu une liste de 757 utilisateurs. Si elle est indépendante, vous devriez avoir obtenu 1760 en utilisant la requête SQL que j'ai tapé dans le premier message. –

Répondre

0

vous ne limitons pas les films partout par étiquette partout. Il semble que vous devriez d'abord éliminer les étiquettes qui n'ont pas été utilisées sur au moins trois films et par trois utilisateurs. Limitez ensuite aux utilisateurs qui ont marqué trois fois.

Cette requête devrait vous donner les balises qui sont tous deux marqués par trois + utilisateurs, et trois films +:

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; 

Si vous interrogez place par les utilisateurs, et d'utiliser la chose comme une sous-requête, vous devriez être capable de vérifier pour les utilisateurs qui ont également marqué trois fois:

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; 
Questions connexes