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.
— tenstar
Não acho que "probabilidade" seja o termo certo aqui. De qualquer forma, consulte stackoverflow.com/questions/682367/…
A palavra que você procura é razão, não probabilidade.
Dê uma olhada na distância de Hamming .
— 317 Diana
A frase é 'métrica de similaridade' , mas existem várias métricas de similaridade (Jaccard, Cosine, Hamming, Levenshein etc.) ditas, portanto é necessário especificar qual. Especificamente, você deseja uma métrica de similaridade entre as strings; @hbprotoss listou vários.
Há um construído em.
Veja esta ótima resposta comparando SequenceMatchervs python-Levenshteinmódulo. stackoverflow.com/questions/6690739/…
Artigo e ferramenta interessantes: chairnerd.seatgeek.com/…
Eu recomendo verificar toda a difflib doc docs.python.org/2/library/difflib.html há um get_close_matchesconstruído em, embora eu achei sorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)mais confiável, com personalizados sorted(... .get_matching_blocks())[-1] > min_matchcheques
O @ThorSummoner chama a atenção para uma função muito útil ( get_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
Isso funcionou perfeitamente. Simples e eficaz. Obrigado :)
Acho que talvez você esteja procurando um algoritmo descrevendo a distância entre as strings. Aqui estão alguns que você pode consultar:
Distância Damerau – Levenshtein
Distância Jaro-Winkler
— hbprotoss
Solução 1: Python embutido
use SequenceMatcher do difflib
prós : biblioteca python nativa, sem necessidade de pacote extra.
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
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.
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:
Você pode criar uma função como:
mas similar ('appel', 'apple') é mais alto que similar ('appel', 'ape')
Sua função irá comparar uma determinada string com outras picadas. Eu quero uma maneira de retornar a string com a relação de semelhança maior
@SaulloCastro, if self.similar(search_string, item.text()) > 0.80:funciona por enquanto. Obrigado,
A distância do pacote inclui a distância de Levenshtein:
O builtin SequenceMatcheré muito lento em entradas grandes, eis como isso pode ser feito com o diff-match-patch :
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:
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;