Je veux comparer plusieurs chaînes entre elles et trouver celles qui sont les plus similaires. Je me demandais s'il existe une bibliothèque, une méthode ou une meilleure pratique qui me renverrait quelles chaînes sont plus similaires à d'autres chaînes. Par exemple:
- "Le renard rapide a sauté" -> "Le renard a sauté"
- "Le renard rapide a sauté" -> "Le renard"
Cette comparaison renverrait que le premier est plus similaire que le second.
Je suppose que j'ai besoin d'une méthode telle que:
double similarityIndex(String s1, String s2)
Y a-t-il une telle chose quelque part?
EDIT: Pourquoi est-ce que je fais ça? J'écris un script qui compare la sortie d'un fichier MS Project à la sortie d'un système hérité qui gère les tâches. Étant donné que l'ancien système a une largeur de champ très limitée, lorsque les valeurs sont ajoutées, les descriptions sont abrégées. Je veux un moyen semi-automatisé pour trouver quelles entrées de MS Project sont similaires aux entrées du système afin que je puisse obtenir les clés générées. Il présente des inconvénients, car il doit encore être vérifié manuellement, mais cela économiserait beaucoup de travail
la source
La manière courante de calculer la similitude entre deux chaînes de 0% à 100% , telle qu'elle est utilisée dans de nombreuses bibliothèques, est de mesurer combien (en%) il faudrait changer la chaîne la plus longue pour la transformer en la plus courte:
Calcul du
editDistance()
:La
editDistance()
fonction ci-dessus devrait calculer la distance d'édition entre les deux chaînes. Il existe plusieurs implémentations à cette étape, chacune pouvant mieux convenir à un scénario spécifique. Le plus courant est l' algorithme de distance de Levenshtein et nous l'utiliserons dans notre exemple ci-dessous (pour les très grandes chaînes, d'autres algorithmes sont susceptibles de mieux fonctionner).Voici deux options pour calculer la distance d'édition:
apply(CharSequence left, CharSequence rightt)
Exemple de travail:
Voir la démo en ligne ici.
Production:
la source
org.apache.commons.lang3.StringUtils
.J'ai traduit l' algorithme de distance de Levenshtein en JavaScript:
la source
Vous pouvez utiliser la distance de Levenshtein pour calculer la différence entre deux chaînes. http://en.wikipedia.org/wiki/Levenshtein_distance
la source
Il existe en effet de nombreuses mesures de similarité de chaînes:
Vous pouvez trouver une explication et une implémentation java de ceux-ci ici: https://github.com/tdebatty/java-string-similarity
la source
Vous pouvez y parvenir en utilisant la bibliothèque java apache commons . Jetez un œil à ces deux fonctions:
- getLevenshteinDistance
- getFuzzyDistance
la source
Théoriquement, vous pouvez comparer les distances d'édition .
la source
Cela se fait généralement à l'aide d'une mesure de distance d'édition . La recherche de «modifier la distance java» ouvre un certain nombre de bibliothèques, comme celle-ci .
la source
Cela me semble être un outil de recherche de plagiat si votre chaîne se transforme en document. Peut-être qu'une recherche avec ce terme donnera quelque chose de bien.
"Programming Collective Intelligence" comprend un chapitre sur la question de savoir si deux documents sont similaires. Le code est en Python, mais il est propre et facile à porter.
la source
Merci au premier répondant, je pense qu'il y a 2 calculs de computeEditDistance (s1, s2). En raison du temps passé, a décidé d'améliorer les performances du code. Alors:
la source
Vous pouvez également utiliser l'algorithme z pour rechercher une similitude dans la chaîne. Cliquez ici https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
la source