Quels sont certains des algorithmes pour la comparaison de la similarité de deux chaînes sont?
J'ai besoin de comparer des chaînes de décider si elles représentent la même chose. Cela concerne les cas où les titres saisis par les humains, où les abréviations et autres petits détails peuvent différer. Par exemple, considérons les deux titres suivants:
std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";
Par opposition à:
std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";
Un humain peut évaluer rapidement que ceux-ci sont plus probablement de l'un et le même. L'approche actuelle, j'ai pris est de normaliser les cordes par la mise en minuscules toutes les lettres et la suppression de tous les signes de ponctuation et les espaces de donner:
std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";
Et:
std::string secondNormalized = "harpervthelawofficesofhueylueyllp";
Comparant dans ce cas, on est une sous-séquence de l'autre, mais vous pouvez imaginer d'autres plus complexes des variations où cela ne se produit pas nécessairement, mais ils ont d'importants sous-séquences communes. Il pourrait aussi être occasionnelle de l'homme les erreurs de saisie telle que transposée lettres et des fautes d'orthographe.
Peut-être une sorte de personnage diff programme pourrait aider? J'ai vu une bonne ligne de diff programmes pour comparer les différences de code à vérifier dans, il ya quelque chose comme ça sur un personnage de base, peut-être en coup de pouce? Si on pouvait compter le nombre de caractères consécutifs en commun et de prendre le ratio pour les caractères non partagé, peut-être que ce serait une bonne heuristique?
En fin de compte, j'ai besoin d'un Booléen décision de les considérer de la même ou non. Il n'a pas à être parfait, mais idéalement, il devrait rarement être mauvais.
Quel algorithme puis-je utiliser qui va me donner une sorte de quantification de façon similaire, les deux chaînes sont les uns aux autres que j'ai peut ensuite convertir en une réponse oui/non par quelques heuristique?
- J'ai utilisé la distance de Levenshtein avant. Facile à mettre en œuvre... en.wikipedia.org/wiki/Levenshtein_distance
- Est-il un Levenshtein dans coup de pouce?
- Désolé, pas constructif... Voici le page wiki que vous cherchiez.
- Pourquoi? C'est une question intéressante.
- Merci, mais ce ne serait pas juste, assurez-vous que votre réponse et de recueillir les rep. 🙂
- Il n'y a pas de c++ ou de l'amplification dans la question. Il n'y a pas un problème de l'OP a, autres que de ne pas avoir cherché assez longtemps pour trouver ce que les algorithmes sont disponibles. Cela ne signifie pas être impoli, mais il y a probablement un meilleur endroit pour demander cela. Oui, c'est intéressant pour moi aussi.
- C'est le point, WhozCraig fait, si je ne vais pas prendre le crédit pour cela.
- désolé, je ne savais pas que l'. Je ne serais pas s'inquiéter à propos de qui obtient le crédit, à moins que cela vous rend mal à l'aise d'avoir votre nom associé à quelque chose qui n'est pas vraiment le vôtre. À partir du site du point de vue, le point le plus important est d'avoir des réponses.
- des tonnes de mises en œuvre pour la distance d'édition: en.wikibooks.org/wiki/Algorithm_Implementation/Strings/...
- Concernant votre demande pour un 'boolean' décision les meilleurs algorithmes je crois que le retour d'une distance entre deux chaînes de caractères. Compte tenu de votre cas, vous pourriez envisager une méthode qui compare les mots d'une chaîne de caractères pour les mots de l'autre.
- Je n'ai pas de problème avec mon nom soit associé, je pense juste que c'est injuste de prendre le crédit pour le travail d'autres personnes. Mais avec tous ces commentaires, il devrait être clair maintenant 🙂
- double possible de d'Obtenir le plus proche de la chaîne de correspondance
- parce que l'OP est de demander une liste et il y a plusieurs réponses correctes, car il n'y a pas assez de critères. Il s'agit d'une discussion sur la chaîne des algorithmes. Bon ALORS, les questions ont une unique bonne réponse.
- Un autre article très utile pour ceux que ça intéresse: joyofdata.de/blog/comparison-of-string-distance-algorithms
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez sont appelés Chaîne De Métrique algorithmes. Il y a un significative nombre d'entre eux, de nombreux avec des caractéristiques similaires. Parmi les plus populaires:
Jetez un oeil à ces autres ainsi que sur le page wiki sur le sujet.
Distance de damerau Levenshtein est un autre algorithme pour comparer deux chaînes de caractères et il est similaire à l'algorithme de Levenshtein. La différence entre les deux est que il peut également vérifier les transpositions entre les caractères et par conséquent, peut donner un meilleur résultat pour la correction d'erreur.
Par exemple: La distance de Levenshtein entre
night
etnigth
est de 2mais la distance de damerau Levenshtein entre
night
etnigth
sera de 1 parce que c'est juste un échange d'une paire de caractères.Vous pouvez utiliser ngrams pour que. Par exemple, transformer les deux chaînes de caractères dans le mot de trigrammes (généralement minuscules) et de comparer le pourcentage de ceux qui sont égaux l'un à l'autre.
Votre défi est de définir un pourcentage minimum de similitude.
http://en.wikipedia.org/wiki/N-gram
Un autre algorithme que vous pouvez prendre en considération est la Simon Blanc Similitude:
Vous pouvez utiliser l'algorithme de calcul de la longueur de la plus grande commune de la sous-séquence pour résoudre le problème. Si la longueur de la plus grande commune de la sous-séquence pour les deux chaînes d'entrée est inférieure à la longueur des cordes, ils sont inégales.
Vous pouvez utiliser l'approche de programmation dynamique pour résoudre le problème et d'optimiser l'espace de la complexité ainsi dans le cas où vous ne voulez pas la figure la plus longue de la commune de la sous-séquence.