Text mit einem Synonymlexikon vergleichen

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
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo!
Ich habe einen großen Textkorpus.
Manuell habe ich ein Lexikon erstellt, welches Synonyme umfasst.

Code: Alles auswählen

lexicon={"pause":("pause","break","paeuschen", "intermezzo", "ruhephase"),

"arbeiten":("arbeiten","taetig", "malochen", "lernen")}
# die übereinstimmung der Synonyme sei nun einmal dahingestellt.
ich habe nun bspw. eine Text wie:

Code: Alles auswählen

text= "ich muss ertmal eine kleine ruhepause machen. ich war den ganzen tag arbeiten und lernen, ein kleines paeuschen tut da schon gut, ich hatte naemlich heute gar keine pause, ich war nur arbeiten."
Nun möchte ich gerne prüfen, welche Wörter fürr "arbeiten" und "pause" noch in dem Text verwendet werden.
Und dazu, wie oft diese Synonyme verwendet werden.

Er strebe also ein Ausgabe in folgender Form an:
ruhepause , von Pause
arbeiten, von arbeiten
lernen, von arbeiten
paeuschen, von pause
pause, von pause
arbeiten, arbeiten

oder zusammengefasst am besten:
ruhepause , von Pause, 1
arbeiten, von arbeiten,2
.
.
.

ich habe versucht das auf folgende weise zu lösen:

Code: Alles auswählen

wort=re.findall(r'(\w+)',str(text))
syn=[]
for teil in lexicon.values():

    for t in teil: 

        if t in wort:
                syn.append(t)

        
print(syn)

Nun habe ich aber lediglich eine liste, in der die Vorkommen ausgegeben werden. Wörter wie "arbeiten", welches 2 mal vorkommt ist jedoch nur einmal aufgeführt....Und es fehlt eben die Angabe, zu welchem Wert aus den keys dieses Wort gehört, ich habe dies versucht mit lexicon[t] der Liste syn zuzufügen, dies klappt aber nicht...

Wisst ihr eine Lösung?

Danke schon mal!
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

okay, erstes Problem habe ich nun wie folgt gelöst:

Code: Alles auswählen

wort=re.findall(r'(\w+)',str(text))
#print(wort)
syn=[]
for teil in lexicon.values():

    for t in teil:
        for element in wort:

            if element == t:

                syn.append(t)

print(syn)
Jetzt bleibt allerdings noch das Problem, wie ich den Zusammenhang zu dem Dictionarykey herstellen kann. Also dass da steht, das "Pauschen" zu dem eigentlichen Wort "Pause" gehört....vllt ist das echt eine blöse frage, aber ich probeier schon die ganze Zeit ^^ :/
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hat hier niemand eine Idee? Mir fehlt nur noch die Refernz zu dem Dictionarykey aus "lexicon"...ich stelle mich wahrscheinlich dumm an, aber es will einfach nicht funktionieren....:/
marena
User
Beiträge: 15
Registriert: Dienstag 22. März 2016, 10:35

Huhu! Wenn ich ehrlich bin würde mich das auch interessieren^^....Habe glaube ich ein ähnliches Problem ;(...
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Noranora hat geschrieben:Hat hier niemand eine Idee? Mir fehlt nur noch die Refernz zu dem Dictionarykey aus "lexicon"...ich stelle mich wahrscheinlich dumm an, aber es will einfach nicht funktionieren....:/
Mal ein paar Hinweise:
* Außer 'values' kennen Dictionaries auch 'items'
* Ob ein Element Teil einer Menge, Liste oder eines Tupels ist, prüft man mit 'in'
* Zählmechanismen kann man (wie schon öfter gesagt) leicht mit collections.Counter oder collections.defaultdict implementieren
* In der Bedeutung die du meinst, ist Korpus ist Neutrum :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die ursprüngliche Datenstruktur ist für die Lösung des Problems suboptimal! Invertiere sie einfach, d.h. mach aus den Werten Schlüssel, mit dem ehemaligen Schlüssel als Wert.

Code: Alles auswählen

synonyms = {"break": "pause", "päuschen": "pause", "intermezzo": "pause", ...}
Auf diese Art und Weise kannst Du nun den Text durchgehen, und jedes Wort direkt über den Schlüssel finden! Für die Zieldatenstruktur musst Du Dir noch etwas überlegen, da Du ja sowohl das Synonym, als auch das ursprüngliche Wort und dessen Anzahl wissen möchtest. Dafür gibt es mehrere Optionen; von einer simplen Klasse, über ein Dictionary von Dictionaries, bis hin zu einer impliziten Lösung, bei der Du Dir nur die Anzahl der aufgetretenen Wörter merkst (ginge einfach über den Einsatz von ``collection.Counter``!). Ich würde wohl mit letzterem Ansatz beginnen... also Counter über den Eingabetext, dann Schlüssel heraus filtern, die auch im Synonyme-Lexikon vorkommen, fertig.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten