manejo - extraer una parte de una cadena en java
¿Cómo comparar cadenas similares en Java?(Medida de distancia de cadena) (5)
Me gustaría comparar dos cadenas y obtener una puntuación de cuánto se parecen. Por ejemplo, "La oración es casi similar" y "La oración es similar" .
No estoy familiarizado con los métodos existentes en Java, pero para PHP conozco la función levenshtein .
¿Hay mejores métodos en Java?
Encontré un algoritmo de Levenshtein en esta página .
La distancia Levensthein es una medida de cómo son cadenas similares. O, más precisamente, cuántas modificaciones se deben hacer para que sean iguales.
El algorithm está disponible en pseudo-código en Wikipedia. Convertir eso a Java no debería ser un gran problema, pero no está integrado en la biblioteca de la clase base.
Wikipedia tiene algunos algoritmos más que miden la similitud de las cadenas.
Las siguientes bibliotecas de Java ofrecen múltiples algoritmos de comparación (Levenshtein, Jaro Winkler, ...):
- Apache Commons Lang 3 : https://commons.apache.org/proper/commons-lang/
- Simmetrics : http://sourceforge.net/projects/simmetrics/
Ambas bibliotecas tienen una documentación de 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);
}
Puede encontrar implementaciones de Levenshtein y otras medidas de similitud / distancia de cadenas en https://github.com/tdebatty/java-string-similarity
Si su proyecto utiliza maven, la instalación es tan simple como
<dependency>
<groupId>info.debatty</groupId>
<artifactId>java-string-similarity</artifactId>
<version>RELEASE</version>
</dependency>
Entonces, para usar Levenshtein por ejemplo
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"));
}
}
sí, eso es una buena métrica, podrías usar StringUtil.getLevenshteinDistance() de apache commons