Vergleich von Multiword Strings, unabhängig der Reihenfolge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
klingeling
User
Beiträge: 2
Registriert: Dienstag 8. Dezember 2015, 11:32

Servus,

ich habe das folgende Problem:

Ich habe eine Namensliste, welche mit einem Textfile abgeglichen wird. Das Problem ist, dass der Name aber 1zu1 in der Liste auftauchen muss. Sind Vorname und Nachname vertrauscht, meldet das Programm keinen Treffer.

Bsp.:
Textdatei --> Max Mustermann
Namensliste --> Mustermann Max

Die Namensliste enthält pro Namen(Vor+Nach) eine Zeile.

Natürlich könnte ich jetzt die Liste ergänzen und alle vorhandenen Namen umdrehen und in der Liste hinterlegen. Da dies jedoch aber nicht wirklich zielführend ist, wollte ich fragen, ob mir jemand einen Tipp geben könnte.

Mein bisheriger Code:

Code: Alles auswählen

def namensfindung(namensliste, textdatei, lev):
    name_dict = {}
    for txt in textdatei:
        dateiname = os.path.basename(txt)
        with open(namensliste) as v, open(
                txt) as test:

            worte = set(line.strip().lower() for line in v)

            wort_test = [line.strip().lower() for line in test]

            for namePdf in wort_test:
                for nameListe in worte:
                    distanz = lv.minimum_distanz(nameListe, namePdf, lev)
                    if distanz is not None:
                        if any(w in namePdf for w in worte):
                            name_dict.setdefault(namePdf, []).append(dateiname)
    return name_dict
Desweiteren ist die Performance relativ schwach. Auch hier würde ich mich über einen Verbesserungsvorschlag freuen. :)

Info: lv.minimum_distanz ist eine Funktion welche den Levenshtein-Algorithmus beinhaltet.

Mit freundlichen Grüßen
klingeling
Zuletzt geändert von Anonymous am Dienstag 22. Dezember 2015, 15:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@klingeling: Also ich bin da gedanklich wegen der Namen ausgestiegen. `texdatei` ist keine Textdatei (oder doch?) `txt` ist kein Text sondern der Name einer Textdatei und kommt aus `textdatei`, `v` und `test` sind Namen für Dateien, `wort_test` ist eine Liste mit Worten, `nameListe` ist *keine* Liste, sondern eine Zeichenkette — das ist mir alles ein wenig zu wirr. Ausserdem macht die Funktion deutlich zu viel.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

vielleicht verstehe ich das Problem in seiner Gesamtkomplexität ja nicht, aber eigentlich geht das doch mit Bordmitteln:

Datei:

Code: Alles auswählen

Rainer, Titan
Sorglos, Susi
Max Mustermann
Reich Frank
Code:

Code: Alles auswählen

>>> namen = [{'Frank', 'Reich'}, {'Rainer', 'Titan'}, {'Max', 'Mustermann'}]
>>> with open('liste.txt', 'r') as f:
...     for line in f.readlines():
...         if set(line.strip().replace(',', '').split(' ')) in name:
...             print('match: {}'.format(line))
... 
match: Rainer, Titan
match: Max Mustermann
match: Reich Frank
>>>
Gruß, noisefloor
Antworten