fuzzywuzzy
fuzzywuzzy copied to clipboard
String fuzzy-matching From R to Python
I am trying to use string fuzzy-matching with both R and Python. I am actually using two packages:
- stringdist from R
- fuzzywuzzy from Python
When I try amatch("PARI", c("HELLO", "WORLD"), maxDist = 2) on R, I get NA as a result, which is intuitive. But when I try the same thing with Python : process.extract("PARI", ["HELLO", "WORLD"], limit = 2), I get [('world', 22), ('HELLO', 0)]
How could I get the same result as in R ?
Thanks in advance
There are a couple of important differences between the two packages:
-
In FuzzyWuzzy limit specifies how many elements you want
extractto return.extractdoes not provide an argument to specify amaxDist. For this purpose you would have to use theextractBestswith thescore_cutoffargument. -
Stringdist appears to use an edit distance, while FuzzyWuzzy only provides normalized string metrics (0-100). So you would have to use e.g.
score_cutoff=90. You can specify the string metric using thescorerargument. -
FuzzWuzzy preprocesses strings by default in the extract function (lowercase + replaces non alphanumeric characters). You can disable this using
processor=None
As an alternative you could use RapidFuzz which allows the usage of edit distances and a score_cutoff parameter in the extract function:
>>> from rapidfuzz import process, string_metric
>>> process.extract("PARI", ["HELLO", "WORLD"], processor=None, scorer=string_metric.levenshtein, score_cutoff=2)
[]
>>> process.extract("HELL", ["HELLO", "WORLD"], processor=None, scorer=string_metric.levenshtein, score_cutoff=2)
[('HELLO', 1, 0)]