2017-06-29 3 views
3

einen Wörterbuch mit folgenden Struktur:Python - get schließen Treffer für mehrere Worte in einem Wörterbuch

{ 
    1: {"names": ["name1_A", "name1_B", ...]}, 
    2: {"names": ["name2_A", "name2_B", ...]}, 
    ... 
} 

wo name1_A und name1_B sind Synonyme/aliases/verschiedene Möglichkeiten, den gleichen Namen zu schreiben, deren ID 1. name2_A und name2_B sind Aliase mit dem gleichen Namen, deren ID 2 ist, und so weiter.

Ich muss eine Funktion schreiben, die eine Benutzereingabe nimmt und die ID des Namens zurückgibt, dessen Alias ​​der Benutzereingabe am ähnlichsten ist.

Ich weiß, es ist nicht sehr intuitiv zu verstehen, was ich meine, also hier ist ein Beispiel. Lassen Sie uns sagen, das ist mein Wörterbuch:

{ 
    1: {"names": ["James", "Jamie"]}, 
    2: {"names": ["Karen", "Karyn"]} 
} 

Der Benutzer tippt im Wort Jimmy. Da die größte Übereinstimmung mit Jimmy aus dem Wörterbuch Jamie ist, hat die Funktion die ID 1.

Wenn der Benutzer tippt auf der Welt Karena, zurückzukehren, da die nächste Übereinstimmung Karen ist, hat die Funktion die ID 2 zurückzukehren.

Ich denke, der beste Weg, um die nächste Mathematik zu bekommen, ist difflib 's get_close_matches(). Diese Funktion nimmt jedoch eine Liste von Möglichkeiten als Argument, und ich kann mir keine Möglichkeit vorstellen, sie in meiner Funktion korrekt zu verwenden. Jede Hilfe wäre willkommen.

+1

Wie definieren Sie "am ähnlichsten"? –

+0

Wenn du sagst, 'Jamie' ist der Schrank zu' Jimmy', du vergleichst die höchste Übereinstimmung jedes Charakters in beiden Strings oder hast eine andere Logik hinter dir? –

+0

Suche nach "dynamic programming spell checker", vielleicht - das ist nur ein Satz von Regeln, und nicht unbedingt der beste. dh. vielleicht wäre es besser, die phonetische Entfernung zu benutzen? – user2864740

Antwort

4

Wenn Sie sich für 3rd-Party-Module interessieren, gibt es ein nettes kleines Modul, das ich gerne für diese Art von Ding namens fuzzywuzzy, für Fuzzy-String-Abgleich in Python verwenden. Dieses Modul verwendet die Metrik Levenshtein Distance zum Berechnen von Entfernungen zwischen zwei Strings. Hier ist ein Beispiel dafür, wie Sie es verwenden:

>>> from fuzzywuzzy import fuzz 
>>> from functools import partial 
>>> data_dict = { 
...  1: {"names": ["James", "Jamie"]}, 
...  2: {"names": ["Karen", "Karyn"]} 
... } 
>>> input_str = 'Karena' 
>>> f = partial(fuzz.partial_ratio, input_str) 
>>> matches = { k : max(data_dict[k]['names'], key=f) for k in data_dict} 
>>> matches 
{1: 'James', 2: 'Karen'} 
>>> { i : (matches[i], f(matches[i])) for i in matches } 
{1: ('James', 40), 2: ('Karen', 100)} 

Jetzt können Sie Karen extrahieren, da es die höchste Punktzahl hat.

Ich musste die Funktion zweimal für den Zweck dieser Demo aufrufen, aber Sie sollten das nur einmal tun können, abhängig davon, wie Sie dieses Beispiel erweitern.

Eine andere Sache zu beachten ist, dass fuzz.partial_ratio mit seinen Übereinstimmungen milder ist. Verwenden Sie für ein strengeres Übereinstimmungsschema die Verwendung fuzz.ratio.

Sie können weitere Beispiele mit Fuzzy-String-Matching here durchlesen.

Verwandte Themen