String-Vergleiche#
In diesem Notebook verwenden wir die beliebte Bibliothek für String-Vergleiche fuzzywuzzy. Sie basiert auf der eingabauten Python-Bibliothek difflib. Weitere Informationen zu den verschiedenen verfügbaren Methoden und ihren Unterschieden findet ihr im Blogbeitrag FuzzyWuzzy: Fuzzy String Matching in Python.
Siehe auch:
1. Installation#
Mit Spack könnt ihr fuzzywuzzy
und die optionale python-levenshtein
-Bibliothek in eurem Kernel bereitstellen:
$ spack env activate python-38
$ spack install py-fuzzywuzzy@0.18.0%gcc@11.2.0+speedup
Alternativ könnt ihr die beiden Bibliotheken auch mit anderen Paketmanagern installieren, z.B.
$ pipenv install fuzzywuzzy[speedup]
2. Imort#
[1]:
from fuzzywuzzy import fuzz, process
3. Beispiel#
[2]:
berlin = ['Berlin, Germany',
'Berlin, Deutschland',
'Berlin',
'Berlin, DE']
String-Ähnlichkeit#
Die Übereinstimmung der erstem beiden Strings 'Berlin, Germany'
und 'Berlin, Deutschland'
scheint gering:
[3]:
fuzz.ratio(berlin[0], berlin[1])
[3]:
65
Partielle String-Ähnlichkeit#
Inkonsistente Teilzeichenfolgen sind ein häufiges Problem. Um dies zu umgehen, verwendet fuzzywuzzy eine Heuristik, die als best partial bezeichnet wird.
[4]:
fuzz.partial_ratio(berlin[0], berlin[1])
[4]:
60
Token-Sortierung#
Bei der Token-Sortierung wird die betreffende Zeichenfolge mit einem Token versehen, die Token alphabetisch sortiert und anschließend wieder zu einer Zeichenfolge zusammengefügt, beispielsweise:
[5]:
fuzz.ratio(berlin[1], berlin[2])
[5]:
48
[6]:
fuzz.token_set_ratio(berlin[1], berlin[2])
[6]:
100
Weitere Informationen#
[7]:
fuzz.ratio?
Extrahieren aus einer Liste#
[8]:
choices = ['Germany',
'Deutschland',
'France',
'United Kingdom',
'Great Britain',
'United States']
[9]:
process.extract('DE', choices, limit=2)
[9]:
[('Deutschland', 90), ('Germany', 45)]
[10]:
process.extract('Vereinigtes Königreich', choices)
[10]:
[('United Kingdom', 51),
('United States', 41),
('Germany', 39),
('Great Britain', 35),
('Deutschland', 31)]
[11]:
process.extractOne('frankreich', choices)
[11]:
('France', 62)
[12]:
process.extractOne('U.S.', choices)
[12]:
('United States', 86)
Bekannte Ports#
FuzzyWuzzy wird auch in andere Sprachen portiert! Hier einige bekannte Ports:
Java: xpresso
Java: xdrop fuzzywuzzy
Rust: fuzzyrusty
JavaScript: fuzzball.js
C++: tmplt fuzzywuzzy
C#: FuzzySharp
Go: go-fuzzywuzzy
Pascal: FuzzyWuzzy.pas
Kotlin: FuzzyWuzzy-Kotlin
R: fuzzywuzzyR