2010-06-19 8 views
0

J'ai des milliers de grands ensembles de données de nuage d'étiquettes; Je peux récupérer un nuage de tags pondérés pour chaque jeu avec une simple instruction select/groupe (par exemple)Comparer de grands ensembles de nuages ​​d'étiquettes pondérés?

SELECT tag, COUNT(*) AS weight 
FROM tags 
WHERE set_id = $set_id 
GROUP BY tag 
ORDER BY COUNT(*) DESC 

Ce que je voudrais savoir est ce - quelle est la meilleure façon de comparer les nuages ​​de tags pondérés et trouver d'autres ensembles qui sont les plus similaires, en tenant compte du poids (le nombre d'occurrences dans l'ensemble) et peut-être même en calculant un score de comparaison, le tout en une seule instruction quelque peu effieciente?

J'ai trouvé que le web manquait de littérature de qualité sur le sujet, je l'ai trouvé un peu pertinent et j'ai essayé de faire abstraction de mon exemple pour le rendre globalement applicable.

Répondre

1

Vous devez d'abord normaliser chaque nuage de tags comme vous le feriez pour un vecteur, en supposant qu'un nuage de tags est un vecteur n dimensions dans laquelle toutes les dimensions rapresents un mot et sa valeur rapresents le poids du mot.

Vous pouvez le faire en calculant la norm (ou amplitude) de chaque nuage, qui est la racine carrée de tous les poids au carré:

m = sqrt(w1*w1 + w2*w2 + ... + wn*wn) 

vous Générez votre nuage de tags normalisé en divisant chaque poids pour la norme du nuage. Après cela, vous pouvez facilement calculer la similarité en utilisant un produit scalaire entre les nuages, c'est-à-dire multiplier chaque composant de chaque paire et tous ensemble. Par exemple:

v1 = { a: 0.12, b: 0.31; c: 0.17; e: 0.11 } 
v2 = { a: 0.21, b: 0.11; d: 0.08; e: 0.28 } 

similarity = v1.a*v2.a + v1.b*v1.b + 0 + 0 + v1.e*v2.e 

si un vecteur a une étiquette que l'autre ne est pas alors ce produit spécifique est évidemment 0.

Cette similitude portée [0,1], 0 signifie aucune corrélation en 1 signifie l'égalité.

+0

Bien que la théorie semble solide, je ne sais pas comment cela serait mis en œuvre lors de la comparaison à la volée de milliers d'ensembles de balises, dans une seule déclaration. – JeremyFelix

+0

Habituellement, ces tâches intensives ne sont pas nécessaires pour être en temps réel. vous n'avez pas vraiment besoin d'être capable de les faire dans MySQL, il suffit d'avoir les nuages ​​et de les travailler de manière asynchrone. Puis stocker les résultats dans la base de données. – Jack

Questions connexes