Kompositaanalyse

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
Myra2907
User
Beiträge: 5
Registriert: Samstag 16. Juni 2012, 14:09

Hallo. Hallo. Hallo.

Ich bin neu in diesem Forum und brauche direkt mal eure Hilfe.
Ich möchte ein Programm schreiben, welches Komposita in verschiedenen Korpora erkennt und analysiert.
Mein Ansatz ist dabei in den Korpora selbst schon nach möglichen Bestandteilen vom Kompositum zu suchen.
Allerdings würde ich dann hierbei nicht alle Komposita aller Korpora berücksichtigen können.
Gäbe es da noch eine andere Möglichkeit, die idealerweise simpler und effektiver ist?
Wörter und Satzzeichen sollen erstmal voneiander getrennt werden, aber wie kann ich bei der Tokenisierung Abkürzungen ausklammern?
Und wie kann ich die verschiedenen Fugenelemente unterbringen?
Ein Kompositum soll auch gefunden werden, wenn die Glieder und das Kompositum selbst in verschiedenen Korpora untergebracht sind.
Auch sollte das Programm resistent gegen unerwartete Formate (wie "***") sein und ein Token pro Zeile auswerfen.

Vielen Dank schonmal für Eure Unterstützung!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wir sind hier keine Linguisten - oder geht es gar nicht um Sprachanalyse? Deine Frage hat ja weniger mit Python zu tun, als viel mehr mit fachlich speziellen Dingen. Zudem wissen wir nichts über das Datenformat usw.

Da fehlt es hier definitiv an Angaben!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Myra2907
User
Beiträge: 5
Registriert: Samstag 16. Juni 2012, 14:09

Es geht ja hauptsächlich um die Programmierarbeit. Also z.B. die Tokenisierung.
Das Programm soll einen Textkorpus einlesen (korpus = codecs.open('finn.txt','Ur','utf-8').read()) und darin
zusammengesetzte Wörter erkennen und analysieren. Die Ausgabe soll in einer eigenen Datei erfolgen
und zwar so, dass ein Token pro Zeile ausgegeben wird.
Der linguistische Aspekt ist ja "nur" der, worauf das Programm angewendet werden soll.
Was genau meinst du mit Datenformat?
BlackJack

@Myra2907: Es geht nicht hauptsächlich um die Programmierarbeit, denn beim Tokenisieren und Komposita suchen kommt es doch ganz entscheident darauf an was für Dich Token sind und was Komposita und wie man die erkennen kann. Also alles sehr fachspezifisch.

Mit Format ist war gemeint welches Format die Eingabe hat. Anscheinend gar keins, also einfach beliebiger, irgend wie formatierter Text‽
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Myra2907 hat geschrieben:... und darin zusammengesetzte Wörter erkennen und analysieren.
Ja und wie geht das algorithmisch? Das ist doch *fachlich* und nichts Python spezifisches!

Du musst uns doch mitteilen, welchen Algorithmus Du da umsetzen willst...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Myra2907
User
Beiträge: 5
Registriert: Samstag 16. Juni 2012, 14:09

Da habt ihr allerdings recht. Entschuldigt. Dann versuche ich das ein wenig spezifischer zu erläutern.

Ein Kompositum ist das Ergebnis der Zusammensetzung aus mindestens zwei verschiedenen Morphemen. Ein Verknüpfungsglied dieser Morpheme nennt man Fugenelement. Im Deutschen ist das häufigste Fugenelement das –s, also zum Beispiel Urheber + Recht + s + Novelle.

Also beim Tokenisieren sollen die Wörter (Token) und Satzzeichen aus einem eingelesen Text (Textkopus bzw. Textdatei (txt)) in Listenform (Ein Wort/Zeichen pro Zeile) getrennt werden.
Der Benutzter soll immer weitere Textdateien angeben können, die dann tokenisiert und dann auf alle zusammengesetzten Wörter hin untersucht werden
und das Programm soll diese Wörter auch noch analysieren, also ausgeben ob es zB aus zwei Nomen zusammengesetzt ist.

Mein Problem ist jetzt die Herangehensweise an den Algorithmus mit regulären Ausdrücken.

Ich hab jetzt mit dem tokenisieren angefangen, allerdings habe ich noch keinen Ansatz gefunden, bei dem die Satzzeichen nicht rausgelöscht, sondern als
einzelnes Token wahrgenommen werden.

Code: Alles auswählen


# coding=utf8

from __future__ import division
import codecs
import re

korpus = codecs.open('finn.txt','Ur','utf-8').read()
outfile = open("finn.tokenisiert.txt", "a")

re.split(r'\W+', korpus)

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dateien solltest Du immer mittels ``with`` öffnen:

Code: Alles auswählen

with open(...) as handler:
    # handler ist hier das File object
    # die Datei wird automatisch geschlossen
Wieso willst Du den Text splitten? Wieso suchst Du nicht einfach nach allen Wörter und Satzzeichen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Myra2907
User
Beiträge: 5
Registriert: Samstag 16. Juni 2012, 14:09

Danke schonmal dafür!

Ich muss den Text splitten, weil ich auch zusammengesetzte Wörter suchen muss, die aus Teilwörtern bestehen hinter denen in der Textdatei ein Komma oder ein Punkt ist.

Ich weiß nicht, ob das jetzt doof ist oder so... :oops: :K

Wie genau meinst du denn das mit dem Suchen? Dann müsste ich doch im Prinzip die ganze Datei suchen?!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Myra2907 hat geschrieben: Ich muss den Text splitten, weil ich auch zusammengesetzte Wörter suchen muss, die aus Teilwörtern bestehen hinter denen in der Textdatei ein Komma oder ein Punkt ist.
Ja, aber wieso muss es da `re.split` sein? Mittels `re.finditer` / `re.findall` suchst Du Dir eben die passenden Sachen zusammen. Als Ergebnis erhältst Du die Suchergebnisse doch auch "separiert".

Hier mal ein Beispiel (in Python 3) mit Deinem Ersten Posting als Eingabe (`text`):

Code: Alles auswählen

for token in re.finditer(r"\w+|[\.\?,;!]", text):
    print(token.group(), end="|")

>>> Hallo|.|Hallo|.|Hallo|.|Ich|bin|neu|in|diesem|Forum|
und|brauche|direkt|mal|eure|Hilfe|.| # usw
Der RegExp ist ja recht simpel: Ich suche eben nach allen zusammengesetzten Buchstaben *oder* jeweils einem Zeichen aus der Menge der Satztrenn- / -endezeichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Myra2907
User
Beiträge: 5
Registriert: Samstag 16. Juni 2012, 14:09

Ah danke!! Das ist natürlich besser. Da hast du recht!
Antworten