Je voudrais comparer deux chaînes et obtenir un score à quel point elles se ressemblent . Par exemple "La phrase est presque similaire" et "La phrase est similaire".
Je ne connais pas bien les méthodes existantes en Java, mais pour PHP, je connais la fonction levenshtein .
Existe-t-il de meilleures méthodes en Java?
La distance de Levensthein est une mesure de la similitude des chaînes. Ou, plus précisément, combien de modifications doivent être apportées pour les rendre identiques.
Le algorithme est disponible en pseudo-code sur Wikipedia. Convertir cela en Java ne devrait pas être un problème, mais cela n’est pas intégré à la bibliothèque de classes de base.
Wikipedia a quelques algorithmes supplémentaires qui mesurent la similarité des chaînes.
Les bibliothèques Java suivantes offrent plusieurs algorithmes de comparaison (Levenshtein, Jaro Winkler, ...):
Les deux bibliothèques ont une documentation Java ( Apache Commons Lang Javadoc , Simmetrics Javadoc ).
//Usage of Apache Commons Lang 3
import org.Apache.commons.lang3.StringUtils;
public double compareStrings(String stringA, String stringB) {
return StringUtils.getJaroWinklerDistance(stringA, stringB);
}
//Usage of Simmetrics
import uk.ac.shef.wit.simmetrics.similaritymetrics.JaroWinkler
public double compareStrings(String stringA, String stringB) {
JaroWinkler algorithm = new JaroWinkler();
return algorithm.getSimilarity(stringA, stringB);
}
ouais c'est une bonne métrique, vous pouvez utiliser StringUtil.getLevenshteinDistance () from Apache commons
Vous pouvez trouver des implémentations de Levenshtein et d'autres mesures de similarité/distance de chaînes sur https://github.com/tdebatty/Java-string-similarity
Si votre projet utilise maven, l’installation est aussi simple que
<dependency>
<groupId>info.debatty</groupId>
<artifactId>Java-string-similarity</artifactId>
<version>RELEASE</version>
</dependency>
Ensuite, pour utiliser Levenshtein par exemple
import info.debatty.Java.stringsimilarity.*;
public class MyApp {
public static void main (String[] args) {
Levenshtein l = new Levenshtein();
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
}
}
Fiche sans vergogne, mais j'ai écrit une bibliothèque aussi:
https://github.com/vickumar1981/stringdistance
Il a toutes ces fonctions, plus quelques-unes pour la similitude phonétique (si un mot "sonne comme" un autre mot - renvoie vrai ou faux, contrairement aux autres similitudes floues qui sont des nombres compris entre 0 et 1).
Inclut également des algorithmes de séquençage d'adn tels que Smith-Waterman et Needleman-Wunsch, qui sont des versions généralisées de Levenshtein.
Je prévois, dans un avenir proche, de faire fonctionner cela avec n’importe quel tableau et pas seulement avec des chaînes (un tableau de caractères).