RapidFuzz é uma biblioteca de correspondência rápida de strings para Python e C++, que usa cálculos de similaridade de strings do FuzzyWuzzy. No entanto, existem alguns aspectos que diferenciam o RapidFuzz do FuzzyWuzzy:
É licenciado pelo MIT, portanto pode ser usado qualquer licença que você queira escolher para o seu projeto, enquanto você é forçado a adotar a licença GPL ao usar o FuzzyWuzzy
Ele fornece muitos string_metrics como hamming ou jaro_winkler, que não estão incluídos no FuzzyWuzzy
Ele é escrito principalmente em C++ e, além disso, vem com muitas melhorias algorítmicas para tornar a correspondência de strings ainda mais rápida, ao mesmo tempo que fornece os mesmos resultados. Para benchmarks detalhados, verifique a documentação
Corrige vários bugs na implementação partial_ratio
Ele pode ser amplamente usado como um substituto para fuzzywuzzy
. No entanto, existem algumas diferenças de API descritas aqui
Python 3.9 ou posterior
No Windows, o redistribuível Visual C++ 2019 é necessário
Existem várias maneiras de instalar o RapidFuzz, os métodos recomendados são usar pip
(o gerenciador de pacotes Python) ou conda
(um gerenciador de pacotes de código aberto e plataforma cruzada)
RapidFuzz pode ser instalado com pip
da seguinte maneira:
pip instalar rapidfuzz
Existem binários (rodas) pré-construídos do RapidFuzz para MacOS (10.9 e posterior), Linux x86_64 e Windows. Rodas para armv6l (Raspberry Pi Zero) e armv7l (Raspberry Pi) estão disponíveis em piwheels.
✖️ falha "ImportError: falha no carregamento da DLL"
Se você encontrar esse erro no Windows, o motivo mais provável é que o Visual C++ 2019 redistribuível não esteja instalado, o que é necessário para localizar bibliotecas C++ (a versão C++ 2019 inclui as versões 2015, 2017 e 2019).
RapidFuzz pode ser instalado com conda
:
conda install -c conda-forge rapidfuzz
O RapidFuzz pode ser instalado diretamente da distribuição fonte, clonando o repositório. Isso requer um compilador compatível com C++17.
clone git --recursivo https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz instalação do pip.
Algumas funções simples são mostradas abaixo. Uma documentação completa de todas as funções pode ser encontrada aqui.
Observe que no RapidFuzz 3.0.0, as strings não são pré-processadas (removendo todos os caracteres não alfanuméricos, cortando espaços em branco, convertendo todos os caracteres em letras minúsculas) por padrão. O que significa que ao comparar duas strings que possuem os mesmos caracteres, mas casos diferentes ("isto é uma palavra", "ISTO É UMA PALAVRA") o valor da pontuação de similaridade pode ser diferente, portanto, ao comparar essas strings, você poderá ver uma diferença na pontuação valor em comparação com versões anteriores. Alguns exemplos de correspondência de strings com pré-processamento podem ser encontrados aqui.
Os marcadores no RapidFuzz podem ser encontrados nos módulos fuzz
e distance
.
> from rapidfuzz import fuzz> fuzz.ratio("isto é um teste", "este é um teste!")96.55172413793103
> from rapidfuzz import fuzz> fuzz.partial_ratio("isto é um teste", "este é um teste!")100.0
> from rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy era um urso", "wuzzy fuzzy era um urso")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy era um urso", "wuzzy fuzzy era um urso")100,0
> from rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy era um urso", "fuzzy fuzzy era um urso")84.21052631578947> fuzz.token_set_ratio("fuzzy era um urso", "fuzzy fuzzy era um urso")100,0# Retorna 100,0 se uma string for um subconjunto da outra, independentemente do conteúdo extra na string mais longa> fuzz.token_set_ratio("fuzzy era um urso, mas não um cachorro", "fuzzy era um urso")100.0# A pontuação é reduzida apenas quando há discordância explícita nas duas strings> fuzz.token_set_ratio("fuzzy era um urso, mas não um cachorro", "Fuzzy era um urso, mas não um gato")92.3076923076923
> from rapidfuzz import fuzz> fuzz.WRatio("este é um teste", "este é um novo teste!!!")85.5> from rapidfuzz import fuzz, utils> # Removendo caracteres não alfanuméricos("!") do string> fuzz.WRatio("este é um teste", "este é um novo teste!!!", processador=utils.default_process) # aqui "este é um novo teste!!!" é convertido para "este é um novo teste"95.0> fuzz.WRatio("este é um teste", "este é um novo teste")95.0> # Convertendo string para minúsculas> fuzz.WRatio("isto é uma palavra" , "ESTA É UMA PALAVRA")21.42857142857143> fuzz.WRatio("isto é uma palavra", "ESTA É UMA PALAVRA", processador=utils.default_process) # aqui "THIS IS A WORD" é convertido para "this is a Word"100.0
> from rapidfuzz import fuzz> fuzz.QRatio("este é um teste", "este é um novo teste!!!")80.0> from rapidfuzz import fuzz, utils> # Removendo caracteres não alfanuméricos("!") do string> fuzz.QRatio("este é um teste", "este é um novo teste!!!", processador=utils.default_process)87.5> fuzz.QRatio("este é um teste", "este é um novo teste")87.5> # Convertendo string para minúsculas> fuzz.QRatio("isto é uma palavra", "ESTE É UMA PALAVRA")21.42857142857143> fuzz.QRatio("isto é uma palavra", "ESTE É UMA PALAVRA ", processador=utils.default_process)100.0
O módulo de processo compara strings com listas de strings. Geralmente, isso tem melhor desempenho do que usar os marcadores diretamente do Python. Aqui estão alguns exemplos de uso de processadores no RapidFuzz:
> do processo de importação do rapidfuzz, fuzz> escolhas = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]> process.extract("new york jets", escolhas, scorer=fuzz. WRatio, limite=2)[('New York Jets', 76.92307692307692, 1), ('New York Giants', 64.28571428571428, 2)]> process.extractOne("cowboys", escolhas, scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # Com pré-processamento> do processo de importação do rapidfuzz, fuzz, utils> process.extract( "jatos de Nova York", escolhas, scorer=fuzz.WRatio, limite=2, processador=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> process.extractOne("cowboys", escolhas, marcador=fuzz.WRatio, processador=utils.default_process)('Dallas Cowboys, 90,0, 3)
A documentação completa dos processadores pode ser encontrada aqui
O benchmark a seguir fornece uma rápida comparação de desempenho entre RapidFuzz e FuzzyWuzzy. Benchmarks mais detalhados para as métricas de string podem ser encontrados na documentação. Para esta comparação simples gerei uma lista de 10.000 strings com comprimento 10, que é comparada com uma amostra de 100 elementos desta lista:
palavras = ["".join(random.choice(string.ascii_letters + string.digits) para _ no intervalo(10))para _ no intervalo(10_000) ]amostras = palavras[:: len(palavras) // 100]
O primeiro benchmark compara o desempenho dos marcadores em FuzzyWuzzy e RapidFuzz quando usados diretamente do Python da seguinte maneira:
para amostra em amostras:para palavra em palavras:pontuador(amostra, palavra)
O gráfico a seguir mostra quantos elementos são processados por segundo com cada um dos marcadores. Existem grandes diferenças de desempenho entre os diferentes marcadores. Porém cada um dos artilheiros é mais rápido no RapidFuzz
O segundo benchmark compara o desempenho quando os marcadores são usados em combinação com cdist da seguinte maneira:
cdist(amostras, palavras, marcador=pontuador)
O gráfico a seguir mostra quantos elementos são processados por segundo com cada um dos marcadores. No RapidFuzz o uso de marcadores através de processadores como cdist
é muito mais rápido do que diretamente. É por isso que devem ser usados sempre que possível.
Se você estiver usando o RapidFuzz para o seu trabalho e quiser retribuir um pouco do seu próprio benefício para apoiar o projeto, considere nos enviar dinheiro através dos patrocinadores do GitHub ou PayPal que podemos usar para ganhar tempo livre para a manutenção desta grande biblioteca, para corrigir bugs no software, revisar e integrar contribuições de código, para melhorar seus recursos e documentação, ou apenas respirar fundo e tomar uma xícara de chá de vez em quando. Obrigado pelo seu apoio.
Apoie o projeto através dos patrocinadores do GitHub ou via PayPal:
RapidFuzz é licenciado sob a licença MIT, pois acredito que todos deveriam poder usá-lo sem serem forçados a adotar a licença GPL. É por isso que a biblioteca é baseada em uma versão mais antiga do fuzzywuzzy que também foi licenciada pelo MIT. Esta versão antiga do fuzzywuzzy pode ser encontrada aqui.