Quero comparar várias strings entre si e encontrar aquelas que são mais semelhantes. Eu queria saber se existe alguma biblioteca, método ou prática recomendada que me retornaria quais strings são mais semelhantes a outras strings. Por exemplo:
- "A raposa rápida saltou" -> "A raposa saltou"
- "A raposa rápida saltou" -> "A raposa"
Essa comparação retornaria que o primeiro é mais semelhante do que o segundo.
Acho que preciso de algum método como:
double similarityIndex(String s1, String s2)
Existe tal coisa em algum lugar?
EDIT: Por que estou fazendo isso? Estou escrevendo um script que compara a saída de um arquivo do MS Project com a saída de algum sistema legado que lida com tarefas. Como o sistema legado tem uma largura de campo muito limitada, quando os valores são adicionados, as descrições são abreviadas. Quero uma maneira semiautomática de descobrir quais entradas do MS Project são semelhantes às entradas do sistema para que eu possa obter as chaves geradas. Ele tem desvantagens, pois ainda precisa ser verificado manualmente, mas pouparia muito trabalho
fonte
A maneira comum de calcular a similaridade entre duas strings de 0% -100% , como usado em muitas bibliotecas, é medir quanto (em%) você teria que mudar a string mais longa para transformá-la na mais curta:
Calculando o
editDistance()
:A
editDistance()
função acima deve calcular a distância de edição entre as duas strings. Existem várias implementações para esta etapa, cada uma pode se adequar melhor a um cenário específico. O mais comum é o algoritmo de distância de Levenshtein e vamos usá-lo em nosso exemplo abaixo (para strings muito grandes, outros algoritmos provavelmente terão um desempenho melhor).Aqui estão duas opções para calcular a distância de edição:
apply(CharSequence left, CharSequence rightt)
Exemplo de trabalho:
Veja a demonstração online aqui.
Resultado:
fonte
org.apache.commons.lang3.StringUtils
.Eu traduzi o algoritmo de distância Levenshtein em JavaScript:
fonte
Você pode usar a distância de Levenshtein para calcular a diferença entre duas cordas. http://en.wikipedia.org/wiki/Levenshtein_distance
fonte
De fato, existem muitas medidas de similaridade de string por aí:
Você pode encontrar a explicação e a implementação java deles aqui: https://github.com/tdebatty/java-string-similarity
fonte
Você pode conseguir isso usando a biblioteca java apache commons . Dê uma olhada nessas duas funções dentro dele:
- getLevenshteinDistance
- getFuzzyDistance
fonte
Teoricamente, você pode comparar distâncias de edição .
fonte
Isso normalmente é feito usando uma medida de distância de edição . Pesquisar por "editar distância java" mostra várias bibliotecas, como esta .
fonte
Soa como um localizador de plágio para mim se sua string se transforma em um documento. Talvez pesquisar com esse termo resulte em algo bom.
"Programando Inteligência Coletiva" tem um capítulo sobre como determinar se dois documentos são semelhantes. O código está em Python, mas é limpo e fácil de transportar.
fonte
Graças ao primeiro respondente, acho que existem 2 cálculos de computeEditDistance (s1, s2). Devido ao grande dispêndio de tempo dele, decidiu melhorar a performance do código. Assim:
fonte
Você também pode usar o algoritmo z para encontrar similaridade na string. Clique aqui https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
fonte