Quiero comparar varias cadenas entre sí y encontrar las que sean más similares. Me preguntaba si hay alguna biblioteca, método o mejor práctica que me devuelva qué cadenas son más similares a otras cadenas. Por ejemplo:
- "El zorro rápido saltó" -> "El zorro saltó"
- "El zorro rápido saltó" -> "El zorro"
Esta comparación devolvería que el primero es más similar que el segundo.
Supongo que necesito algún método como:
double similarityIndex(String s1, String s2)
¿Existe tal cosa en alguna parte?
EDITAR: ¿Por qué estoy haciendo esto? Estoy escribiendo un script que compara la salida de un archivo de MS Project con la salida de algún sistema heredado que maneja tareas. Debido a que el sistema heredado tiene un ancho de campo muy limitado, cuando se agregan los valores, las descripciones se abrevian. Quiero alguna forma semiautomática de encontrar qué entradas de MS Project son similares a las entradas en el sistema para poder obtener las claves generadas. Tiene inconvenientes, ya que todavía tiene que verificarse manualmente, pero ahorraría mucho trabajo
fuente
La forma común de calcular la similitud entre dos cadenas de una manera 0% -100% , como se usa en muchas bibliotecas, es medir cuánto (en%) tendrías que cambiar la cadena más larga para convertirla en la más corta:
Calcular el
editDistance()
:Se
editDistance()
espera que la función anterior calcule la distancia de edición entre las dos cadenas. Hay varias implementaciones para este paso, cada una puede adaptarse mejor a un escenario específico. El más común es el algoritmo de distancia de Levenshtein y lo usaremos en nuestro ejemplo a continuación (para cadenas muy grandes, es probable que otros algoritmos funcionen mejor).Aquí hay dos opciones para calcular la distancia de edición:
apply(CharSequence left, CharSequence rightt)
Ejemplo de trabajo:
Vea la demostración en línea aquí.
Salida:
fuente
org.apache.commons.lang3.StringUtils
.Traduje el algoritmo de distancia Levenshtein en JavaScript:
fuente
Puede usar la distancia de Levenshtein para calcular la diferencia entre dos cadenas. http://en.wikipedia.org/wiki/Levenshtein_distance
fuente
De hecho, existen muchas medidas de similitud de cadenas:
Puede encontrar una explicación y la implementación de Java de estos aquí: https://github.com/tdebatty/java-string-similarity
fuente
Puede lograr esto usando la biblioteca java de apache commons . Eche un vistazo a estas dos funciones dentro de él:
- getLevenshteinDistance
- getFuzzyDistance
fuente
Teóricamente, puede comparar distancias de edición .
fuente
Normalmente, esto se hace mediante una medida de distancia de edición . La búsqueda de "java de distancia de edición" muestra una serie de bibliotecas, como esta .
fuente
Me suena como un buscador de plagio si su cadena se convierte en un documento. Tal vez la búsqueda con ese término arroje algo bueno.
"Programación de la inteligencia colectiva" tiene un capítulo sobre la determinación de si dos documentos son similares. El código está en Python, pero es limpio y fácil de portar.
fuente
Gracias al primer contestador, creo que hay 2 cálculos de computeEditDistance (s1, s2). Debido al gran gasto de tiempo, decidió mejorar el rendimiento del código. Entonces:
fuente
También puede usar el algoritmo z para encontrar similitudes en la cadena. Haga clic aquí https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
fuente