Similarité cosinus vs distance de Hamming
Pour calculer la similarité entre deux documents, j'ai créer un vecteur contenant le terme de fréquences. Mais alors, pour la prochaine étape, je ne peux pas décider entre "Similarité cosinus" et "La distance de Hamming".
Ma question: avez-vous une expérience avec ces algorithmes? Qui vous donne de meilleurs résultats?
En outre que: Pourriez-vous me dire comment faire pour le code de la similarité Cosinus en PHP? Pour la distance de Hamming, j'ai déjà le code:
function check ($terms1, $terms2) {
$counts1 = array_count_values($terms1);
$totalScore = 0;
foreach ($terms2 as $term) {
if (isset($counts1[$term])) $totalScore += $counts1[$term];
}
return $totalScore * 500 / (count($terms1) * count($terms2));
}
Je ne veux pas utiliser un autre algorithme. Je voudrais seulement avoir de l'aide pour décider entre les deux.
Et peut-être que quelqu'un peut dire quelque chose sur la façon d'améliorer les algorithmes. Vous obtiendrez de meilleurs résultats si vous filtrez l'arrêt de mots ou des mots communs?
J'espère que vous pourrez m'aider. Merci à l'avance!
OriginalL'auteur caw | 2009-06-03
Vous devez vous connecter pour publier un commentaire.
Une distance de Hamming doit être fait entre deux chaînes de caractères de longueur égale et avec la commande prise en compte.
Que vos documents sont certainement de longueur différente et si les mots des lieux ne comptent pas, la similarité cosinus est mieux (veuillez noter que, en fonction de vos besoins, de meilleures solutions existent). 🙂
Voici une similarité cosinus fonction de 2 tableaux de mots:
C'est rapide (
isset()
au lieu dein_array()
est un tueur sur de grands tableaux).Comme vous pouvez le voir, les résultats ne tiennent pas compte de la "grandeur" de chaque mot.
Je l'utiliser pour détecter les multi-posté des messages de "presque" copier-collé de textes. Il fonctionne bien. 🙂
Le meilleur lien sur la chaîne de métriques de similarité:
http://www.dcs.shef.ac.uk/~sam/stringmetrics.html
Pour de plus amples lectures intéressantes:
http://www.miislita.com/information-retrieval-tutorial/cosine-similarity-tutorial.html
http://bioinformatics.oxfordjournals.org/cgi/content/full/22/18/2298
Mike fonction n'est pas vraiment exact. Essayez
echo check(array('a', 'b', 'c'), array('a', 'b', 'c'));
Il doit retourner 1 (cos(0)), mais sa fonction renvoie à 0,33. 🙁Est votre fonction vraiment correcte? Il donne de 0,71 [1, 1, 1] et [1, 1, 0]. Mais miislita.com/searchito/binary-similarity-calculator.html donne 0.82?! Est-il toujours nécessaire de faire diviser la valeur de similarité par la longueur du document?
Cet outil est pour chaîne binaire comparaison. "Mon" est fonction de "documents de mots". Le résultat ne sera pas le même. 🙂
Ok, merci. Je cherchais un outil pour comparer car je veux être sûr que cette fois, j'ai la fonction correcte 😉 Et je n'ai pas besoin de diviser la valeur de la longueur d'un document puisque la longueur ne joue pas un rôle dans la similarité cosinus, droit?
OriginalL'auteur
Si je ne me trompe, je pense que vous avez un algorithme à mi-chemin entre les deux algorithmes. Pour la distance de Hamming, utilisation:
(Notez que vous ne faites qu'ajouter 1 pour chaque appariés élément dans le jeton de vecteurs.)
Et de similarité cosinus, utilisation:
(Notez que vous êtes en train d'ajouter le produit du jeton de compte entre les deux documents.)
La principale différence entre les deux est que similarité cosinus va donner un plus fort indicateur lorsque les deux documents ont le même mot plusieurs fois dans les documents, tandis que de Hamming distance ne se soucie pas de la façon dont souvent les jetons individuels venir.
Modifier: juste remarqué que votre requête à propos de la fonction de suppression de mots, etc. Je ne vous conseille si vous allez utiliser le cosinus de similarité en fonction des mots sont très fréquents (en anglais, au moins), vous risquez de fausser un résultat pas de filtrage. Si vous utilisez de Hamming distance, l'effet ne sera pas aussi grand, mais il pourrait encore être appréciable dans certains cas. Aussi, si vous avez accès à un lemmatizer, il permettra de réduire les accidents lorsqu'un document contient des "galaxies" et l'autre contient "la galaxie", par exemple.
Quelle façon vous allez, bonne chance!
je pense que la similarité cosinus est le meilleur dans ce cas - voir aussi ma récente modifier au sujet de la fonction des mots. votre intuition était mort.
Thx, la modification est instructif, aussi. Dernière question: 🙂 Quelle est la différence entre le cosinus de similarité et de mon algorithme (code en question)? Lequel est le mieux?
Il y a quelque chose d'étrange dans cette similarité cosinus fonction. Ne pas le résultat de 1 dans ce cas: echo vérifier(array('a', 'b', 'c'), array('a', 'b', 'c')); à la place je reçois 0.333 qui btw est le même résultat que: echo vérifier(array('a', 'b', 'c'), array('a', 'b'));
Toto est correct. Le vecteur de norme calculs sont incorrects pour les deux fonctions de distance.
OriginalL'auteur
Je m'excuse pour ignorer le fait que vous avez dit que vous ne souhaitez pas utiliser d'autres algorithmes, mais sérieusement, Levenshtein et Distance de damerau-Levenshtein sont plus foutu utile que la distance de Hamming. Voici un D-L la distance implémentation en PHP, et si vous n'aimez pas PHP natif
levenshtein()
fonction, je pense que vous n'aurez pas parce qu'il a une limite de longueur, voici un non-longueur de la version limitée:Oups. Je n'ai ne parviennent pas à absorber la fonction de vecteur de la partie. Jamais l'esprit. 🙂 Puisque vous aimez le code, je vais laisser la réponse récupérés. J'espère que le downvoters aura pitié. 🙂
Oui, ils en ont. Il y a plus de upvoters que downvoters. 😉
levenshtein, devrait être utilisée pour calculer la distance d'édition. donc, cela dépend de la nécessité. "ANNA FRED" et "FRED ANNA". Lenvenshtein donnera un nombre élevé, mais pour la similarité cosinus (pour les paroles), il sera de 100% similaire. Similaires ou pas? Il dépend de vos besoins.
OriginalL'auteur
Voici mon code corrigé pour le Cosinus fonction de Distance posté par Toto
Si vos versions sont tous les deux corrects, Lorenzo et Toto? Ils travaillent tous les deux?
OriginalL'auteur