RapidFuzz es una biblioteca de coincidencia rápida de cadenas para Python y C++, que utiliza los cálculos de similitud de cadenas de FuzzyWuzzy. Sin embargo, hay un par de aspectos que diferencian a RapidFuzz de FuzzyWuzzy:
Tiene licencia MIT, por lo que puede usarse con cualquier licencia que desee elegir para su proyecto, mientras que se ve obligado a adoptar la licencia GPL cuando usa FuzzyWuzzy.
Proporciona muchas string_metrics como hamming o jaro_winkler, que no están incluidas en FuzzyWuzzy
Está escrito principalmente en C++ y además viene con muchas mejoras algorítmicas para hacer que la coincidencia de cadenas sea aún más rápida, sin dejar de proporcionar los mismos resultados. Para obtener puntos de referencia detallados, consulte la documentación.
Corrige múltiples errores en la implementación partial_ratio
Se puede utilizar en gran medida como sustituto directo de fuzzywuzzy
. Sin embargo, hay un par de diferencias de API que se describen aquí.
Python 3.9 o posterior
En Windows se requiere el redistribuible Visual C++ 2019
Hay varias formas de instalar RapidFuzz, los métodos recomendados son usar pip
(el administrador de paquetes de Python) o conda
(un administrador de paquetes multiplataforma de código abierto)
RapidFuzz se puede instalar con pip
de la siguiente manera:
instalación de pip rapidfuzz
Hay binarios (ruedas) prediseñados de RapidFuzz para MacOS (10.9 y posteriores), Linux x86_64 y Windows. Las ruedas para armv6l (Raspberry Pi Zero) y armv7l (Raspberry Pi) están disponibles en piwheels.
✖️ error "ImportError: error al cargar la DLL"
Si se encuentra con este error en Windows, lo más probable es que el redistribuible de Visual C++ 2019 no esté instalado, que es necesario para encontrar bibliotecas de C++ (la versión de C++ 2019 incluye las versiones 2015, 2017 y 2019).
RapidFuzz se puede instalar con conda
:
instalación de conda -c conda-forge rapidfuzz
RapidFuzz se puede instalar directamente desde la distribución fuente clonando el repositorio. Esto requiere un compilador compatible con C++17.
clon de git --recursivo https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz instalación de pipas.
Algunas funciones simples se muestran a continuación. Puede encontrar una documentación completa de todas las funciones aquí.
Tenga en cuenta que a partir de RapidFuzz 3.0.0, las cadenas no se preprocesan (eliminando todos los caracteres no alfanuméricos, recortando espacios en blanco, convirtiendo todos los caracteres a minúsculas) de forma predeterminada. Lo que significa que al comparar dos cadenas que tienen los mismos caracteres pero en diferentes casos ("esta es una palabra", "ESTA ES UNA PALABRA") su valor de puntuación de similitud puede ser diferente, por lo que al comparar dichas cadenas es posible que vea una diferencia en la puntuación. valor en comparación con versiones anteriores. Aquí se pueden encontrar algunos ejemplos de coincidencia de cadenas con preprocesamiento.
Los anotadores en RapidFuzz se pueden encontrar en los módulos fuzz
y distance
.
> de rapidfuzz import fuzz> fuzz.ratio("esto es una prueba", "¡esto es una prueba!")96.55172413793103
> de rapidfuzz import fuzz> fuzz.partial_ratio("esto es una prueba", "¡esto es una prueba!")100.0
> de rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy era un oso", "wuzzy fuzzy era un oso")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy era un oso", "wuzzy fuzzy era un oso")100.0
> de rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy era un oso", "fuzzy fuzzy era un oso")84.21052631578947> fuzz.token_set_ratio("fuzzy era un oso", "fuzzy fuzzy era un oso")100.0# Devuelve 100.0 si una cadena es un subconjunto de la otra, independientemente del contenido adicional en la cadena más larga> fuzz.token_set_ratio("fuzzy era un oso pero no un perro", "fuzzy era un oso")100.0# La puntuación se reduce solo cuando hay un desacuerdo explícito en las dos cadenas> fuzz.token_set_ratio("fuzzy era un oso pero no un perro", "peludo era un oso pero no un gato")92.3076923076923
> de rapidfuzz import fuzz> fuzz.WRatio("¡¡¡esta es una prueba", "¡¡¡esta es una nueva prueba!!!")85.5> de rapidfuzz import fuzz, utils> # Eliminando caracteres no alfanuméricos ("!") del cadena> fuzz.WRatio("esta es una prueba", "¡¡¡esta es una nueva prueba!!!", procesador=utils.default_process) # aquí "¡¡¡esta es una nueva prueba!!!" se convierte a "esta es una nueva prueba"95.0> fuzz.WRatio("esta es una prueba", "esta es una nueva prueba")95.0> # Conversión de cadena a minúsculas> fuzz.WRatio("esta es una palabra" , "ESTA ES UNA PALABRA")21.42857142857143> fuzz.WRatio("esta es una palabra", "ESTA ES UNA PALABRA", procesador=utils.default_process) # aquí "ESTA ES UNA PALABRA" se convierte en "esta es una palabra"100.0
> de rapidfuzz import fuzz> fuzz.QRatio("¡¡¡esta es una prueba", "¡¡¡esta es una nueva prueba!!!")80.0> de rapidfuzz import fuzz, utils> # Eliminando caracteres no alfanuméricos ("!") del string> fuzz.QRatio("esto es una prueba", "¡¡¡esta es una nueva prueba!!!", procesador=utils.default_process)87.5> fuzz.QRatio("esto es una prueba", "esto es una nueva prueba")87.5> # Convirtiendo cadena a minúsculas> fuzz.QRatio("esta es una palabra", "ESTA ES UNA PALABRA")21.42857142857143> fuzz.QRatio("esta es una palabra", "ESTA ES UNA PALABRA" ", procesador=utils.default_process)100.0
El módulo de proceso le permite comparar cadenas con listas de cadenas. Generalmente, esto tiene más rendimiento que usar los puntuadores directamente desde Python. A continuación se muestran algunos ejemplos sobre el uso de procesadores en RapidFuzz:
> del proceso de importación de rapidfuzz, fuzz> elecciones = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]> proceso.extract("new york jets", elecciones, goleador=fuzz. WRatio, límite=2)[('New York Jets', 76.92307692307692, 1), ('New York Giants', 64.28571428571428, 2)]> process.extractOne("cowboys", elecciones, goleador=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # Con preprocesamiento> del proceso de importación rapidfuzz, fuzz, utils> process.extract( "jets de nueva york", opciones, goleador=fuzz.WRatio, límite=2, procesador=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> proceso.extractOne("vaqueros", opciones, goleador=fuzz.WRatio, procesador=utils.default_process)('Dallas Vaqueros', 90.0, 3)
La documentación completa de los procesadores se puede encontrar aquí.
El siguiente punto de referencia ofrece una rápida comparación de rendimiento entre RapidFuzz y FuzzyWuzzy. En la documentación se pueden encontrar puntos de referencia más detallados para las métricas de cadenas. Para esta simple comparación generé una lista de 10.000 cadenas con longitud 10, que se compara con una muestra de 100 elementos de esta lista:
palabras = ["".join(random.choice(string.ascii_letters + string.digits) para _ en el rango(10))para _ en el rango(10_000) ]muestras = palabras[:: len(palabras) // 100]
El primer punto de referencia compara el rendimiento de los goleadores en FuzzyWuzzy y RapidFuzz cuando se usan directamente desde Python de la siguiente manera:
para muestra en muestras:para palabra en palabras:puntuador(muestra, palabra)
El siguiente gráfico muestra cuántos elementos se procesan por segundo con cada uno de los goleadores. Hay grandes diferencias de rendimiento entre los distintos goleadores. Sin embargo cada uno de los anotadores es más rápido en RapidFuzz
El segundo punto de referencia compara el rendimiento cuando los goleadores se utilizan en combinación con cdist de la siguiente manera:
cdist(muestras, palabras, anotador=anotador)
El siguiente gráfico muestra cuántos elementos se procesan por segundo con cada uno de los goleadores. En RapidFuzz el uso de goleadores a través de procesadores como cdist
es mucho más rápido que usarlo directamente. Por eso se deben utilizar siempre que sea posible.
Si está utilizando RapidFuzz para su trabajo y desea devolver un poco de su propio beneficio para apoyar el proyecto, considere enviarnos dinero a través de Patrocinadores de GitHub o PayPal que podemos usar para comprar tiempo libre para el mantenimiento de esta gran biblioteca. para corregir errores en el software, revisar e integrar contribuciones de código, mejorar sus características y documentación, o simplemente respirar profundamente y tomar una taza de té de vez en cuando. Gracias por su apoyo.
Apoye el proyecto a través de Patrocinadores de GitHub o vía PayPal:
RapidFuzz tiene la licencia MIT, ya que creo que todos deberían poder usarlo sin verse obligados a adoptar la licencia GPL. Es por eso que la biblioteca se basa en una versión anterior de fuzzywuzzy que también tenía licencia del MIT. Esta versión antigua de fuzzywuzzy se puede encontrar aquí.