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

InformationsquelleAutor WilliamKF | 2013-03-08