Hay muchos métodos para comparar strings en python. Algunos de los principales métodos son:
- Usando expresiones regulares
- comparación sencilla
- Usando difflib
Pero uno de los métodos más fáciles es usar la biblioteca fuzzywuzzy donde podemos tener una puntuación de 100, que indica que dos strings son iguales al proporcionar un índice de similitud. Este artículo habla sobre cómo comenzamos a usar la biblioteca fuzzywuzzy.
FuzzyWuzzy es una biblioteca de Python que se utiliza para la coincidencia de strings. La coincidencia de strings aproximadas es el proceso de encontrar strings que coincidan con un patrón determinado. Básicamente utiliza la distancia de Levenshtein para calcular las diferencias entre secuencias.
FuzzyWuzzy ha sido desarrollado y de código abierto por SeatGeek, un servicio para encontrar entradas para eventos deportivos y conciertos. Su caso de uso original, como se discute en su blog.
- Requisitos de fuzzywuzzy
- Python 2.4 o superior
- python-Levenshtein
Instalar a través de pip:
pip install fuzzywuzzy pip install python-Levenshtein
¿Cómo utilizar esta biblioteca?
Primero de importar estos módulos,
from fuzzywuzzy import fuzz from fuzzywuzzy import process
Uso de proporción simple:
fuzz.ratio('geeksforgeeks', 'geeksgeeks') 87 # Exact match fuzz.ratio('GeeksforGeeks', 'GeeksforGeeks') 100 fuzz.ratio('geeks for geeks', 'Geeks For Geeks ') 80
fuzz.partial_ratio("geeks for geeks", "geeks for geeks!") 100 # Exclamation mark in second string, but still partially words are same so score comes 100 fuzz.partial_ratio("geeks for geeks", "geeks geeks") 64 # score is less because there is a extra token in the middle middle of the string.
Ahora, relación de conjunto de fichas y relación de clasificación de fichas:
# Token Sort Ratio fuzz.token_sort_ratio("geeks for geeks", "for geeks geeks") 100 # This gives 100 as every word is same, irrespective of the position # Token Set Ratio fuzz.token_sort_ratio("geeks for geeks", "geeks for for geeks") 88 fuzz.token_set_ratio("geeks for geeks", "geeks for for geeks") 100 # Score comes 100 in second case because token_set_ratio considers duplicate words as a single word.
Ahora supongamos que tenemos una lista de opciones y queremos encontrar la(s) coincidencia(s) más cercana(s), podemos usar el módulo de proceso
query = 'geeks for geeks' choices = ['geek for geek', 'geek geek', 'g. for geeks'] # Get a list of matches ordered by score, default limit to 5 process.extract(query, choices) [('geeks geeks', 95), ('g. for geeks', 95), ('geek for geek', 93)] # If we want only the top one process.extractOne(query, choices) ('geeks geeks', 95)
También hay una relación más que se usa a menudo llamada WRatio , a veces es mejor usar WRatio en lugar de una relación simple, ya que WRatio maneja mayúsculas y minúsculas y también algunos otros parámetros.
fuzz.WRatio('geeks for geeks', 'Geeks For Geeks') 100 fuzz.WRatio('geeks for geeks!!!','geeks for geeks') 100 # whereas simple ratio will give for above case fuzz.ratio('geeks for geeks!!!','geeks for geeks') 91
Código completo
# Python code showing all the ratios together, # make sure you have installed fuzzywuzzy module from fuzzywuzzy import fuzz from fuzzywuzzy import process s1 = "I love GeeksforGeeks" s2 = "I am loving GeeksforGeeks" print "FuzzyWuzzy Ratio: ", fuzz.ratio(s1, s2) print "FuzzyWuzzy PartialRatio: ", fuzz.partial_ratio(s1, s2) print "FuzzyWuzzy TokenSortRatio: ", fuzz.token_sort_ratio(s1, s2) print "FuzzyWuzzy TokenSetRatio: ", fuzz.token_set_ratio(s1, s2) print "FuzzyWuzzy WRatio: ", fuzz.WRatio(s1, s2),'\n\n' # for process library, query = 'geeks for geeks' choices = ['geek for geek', 'geek geek', 'g. for geeks'] print "List of ratios: " print process.extract(query, choices), '\n' print "Best among the above list: ",process.extractOne(query, choices)
Producción:
FuzzyWuzzy Ratio: 84 FuzzyWuzzy PartialRatio: 85 FuzzyWuzzy TokenSortRatio: 84 FuzzyWuzzy TokenSetRatio: 86 FuzzyWuzzy WRatio: 84 List of ratios: [('g. for geeks', 95), ('geek for geek', 93), ('geek geek', 86)] Best among the above list: ('g. for geeks', 95)
La biblioteca FuzzyWuzzy está construida sobre la biblioteca difflib, python-Levenshtein se usa para la velocidad. Por lo tanto, es una de las mejores formas de hacer coincidir strings en python.
Publicación traducida automáticamente
Artículo escrito por Shantanu Sharma. y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA