Como obtenho a probabilidade de uma string ser semelhante a outra no Python?
Eu quero obter um valor decimal como 0,9 (significando 90%) etc. De preferência com Python e biblioteca padrão.
por exemplo
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
python
probability
similarity
metric
tenstar
fonte
fonte
Respostas:
Há um construído em.
Usando isso:
fonte
SequenceMatcher
vspython-Levenshtein
módulo. stackoverflow.com/questions/6690739/…get_close_matches
construído em, embora eu acheisorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
mais confiável, com personalizadossorted(... .get_matching_blocks())[-1] > min_match
chequesget_closest_matches
). É uma função de conveniência que pode ser o que você está procurando, leia também a documentação! No meu aplicativo em particular, eu estava executando algumas verificações / relatórios básicos de erros ao usuário, fornecendo informações incorretas, e essa resposta me permite relatar a eles as possíveis correspondências e qual a "semelhança". Se você não precisa exibir a semelhança, no entanto, definitivamente verifiqueget_closest_matches
Acho que talvez você esteja procurando um algoritmo descrevendo a distância entre as strings. Aqui estão alguns que você pode consultar:
fonte
Solução 1: Python embutido
use SequenceMatcher do difflib
prós : biblioteca python nativa, sem necessidade de pacote extra.
exemplo :contras : muito limitado, existem muitos outros bons algoritmos para a similaridade de strings por aí.
Solução # 2: biblioteca de medusas
é uma biblioteca muito boa, com boa cobertura e poucos problemas. Ele suporta:
- Distância Levenshtein - Distância
Damerau-Levenshtein
- Distância
Jaro - Distância Jaro-Winkler
- Comparação da abordagem de classificação por correspondência
- Distância Hamming
prós : fácil de usar, gama de algoritmos suportados, testado.
contras : biblioteca não nativa.
exemplo :
fonte
Fuzzy Wuzzy
é um pacote que implementa a distância de Levenshtein em python, com algumas funções auxiliares para ajudar em determinadas situações em que você pode querer que duas seqüências distintas sejam consideradas idênticas. Por exemplo:fonte
Você pode criar uma função como:
fonte
if self.similar(search_string, item.text()) > 0.80:
funciona por enquanto. Obrigado,A distância do pacote inclui a distância de Levenshtein:
fonte
O builtin
SequenceMatcher
é muito lento em entradas grandes, eis como isso pode ser feito com o diff-match-patch :fonte
Observe que
difflib.SequenceMatcher
somente encontra a subsequência de correspondência contígua mais longa; isso geralmente não é o desejado, por exemplo:Encontrar a semelhança entre duas seqüências está intimamente relacionado ao conceito de alinhamento de sequência por pares em bioinformática. Existem muitas bibliotecas dedicadas para isso, incluindo o biopython . Este exemplo implementa o algoritmo Needleman Wunsch :
O uso de biopython ou outro pacote de bioinformática é mais flexível do que qualquer parte da biblioteca padrão do python, pois muitos esquemas e algoritmos de pontuação diferentes estão disponíveis. Além disso, você pode obter as seqüências correspondentes para visualizar o que está acontecendo:
fonte
Você pode encontrar a maioria dos métodos de similaridade de texto e como eles são calculados neste link: https://github.com/luozhouyang/python-string-similarity#python-string-similarity Aqui estão alguns exemplos;
Normalizado, métrico, similaridade e distância
Semelhança e distância (normalizada)
Distâncias métricas
fonte