web-dev-qa-db-fra.com

Comment comparer des chaînes presque similaires en Java? (Mesure de distance de chaîne)

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?

35
hsmit

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.

20
Joey

Les bibliothèques Java suivantes offrent plusieurs algorithmes de comparaison (Levenshtein, Jaro Winkler, ...): 

  1. (Apache Commons Lang 3} _: https://commons.Apache.org/proper/commons-lang/
  2. Simmetrics: http://sourceforge.net/projects/simmetrics/

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);
}
50
FiveO

ouais c'est une bonne métrique, vous pouvez utiliser StringUtil.getLevenshteinDistance () from Apache commons

14
jspcal

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"));
  }
}
1
Thibault Debatty

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).

0
Vaibhav Kumar