Part-of-Speech-Tagging mit dem TreeTagger

Die automatische Zuweisung von Wortartklassen gehört zu den üblichen Aufbereitungsschritten von Korpusdaten. Damit verbunden ist oft auch eine Lemmatisierung oder ein Stemming, also die Rückführung der Wortformen auf Grund- oder Stammformen. Hier ein Ausschnitt aus einem so verarbeiteten Korpus unter Verwendung des TreeTaggers:

In der ersten Spalte sind die ursprünglichen Wortformen aufgeführt. In der zweiten Spalte die Wortartklassen, die hier nach dem Stuttgart-Tübingen-Tagset (STTS) klassifiziert worden sind. In der dritten Spalte sind die lemmatisierten Formen sichtbar, teilweise mit Optionen (Sie|sie) und Abkürzungen (d steht für einen definiten Artikel). Der Tagger arbeitet auf der Basis eines statistischen Modells der Wortartenverteilung, das anhand eines manuell annotierten Korpus trainiert worden ist.

Wir wollen uns hier jetzt nicht mit den Details der unterschiedlichen POS-Tagging-Verfahren auseinandersetzen, sondern lernen, wie eine XML-Datei mit dem TreeTagger getaggt werden kann. Der TreeTagger gehört zumindest im deutschsprachigen Raum zu den verbreitensten POS-Taggern. Er wurde bereits für eine Reihe von Sprachen trainiert und lässt sich auf der Basis eines eigenen manuell annotierten Trainingskorpus auch selber trainieren. Neben dem TreeTagger gibt es aber weitere POS-Tagger, die teilweise andere Methoden einsetzen und/oder eine feinere Wortartenklassifikation anbieten.

Installation des TreeTaggers

Der TreeTagger ist für Unix/Linux-, Mac- und Windowssysteme nutzbar. Für Windows existiert eine grafische Benutzeroberfläche. Der TreeTagger lässt sich aber auch ohne diese Oberfläche leicht bedienen und kann dann noch flexibler eingesetzt werden. Wir orientieren uns im Folgenden hauptsächlich auf die Benutzung des Taggers auf Unix/Linux- und Macsystemen.

Mac, Unix/Linux-Systeme: Installieren Sie zunächst den TreeTagger gemäß Anleitungen auf der TreeTagger-Seite. Ob die Installation geklappt hat, können Sie einfach testen, indem Sie in die Shell eingeben (Hilfe zur Bedienung der Shell hier!):

echo "Das ist ein kleiner Test." | cmd/tree-tagger-german

Damit sollte der Beispieltext "Das ist ein kleiner Test." in getaggter Form ausgegeben werden. (Man muss sich dafür im Verzeichnis der TreeTagger-Installation befinden.)

Windows: Verwenden Sie die grafische Benutzeroberfläche des TreeTaggers (Installationsanleitung und Hilfe dort), um die Dateien zu taggen.

Tokenisierung und Tagging

Das Tokenisieren, also die Unterteilung des Textes in einzelne Wörter, ist ein Schritt, der vor dem eigentlichen Taggen vorgenommen werden muss. Im Beispiel oben wurden durch Aufruf des Scriptes cmd/tree-tagger-german die beiden Schritte Tokenisieren und Taggen zusammengefasst: Das Script tokenisiert die Eingabedatei zunächst und schickt sie dann an den Tagger. Fürs Tokenisieren wird das mit dem TreeTagger mitgelieferte Script cmd/utf8-tokenize.perl verwendet.

Manchmal möchte man die Tokenisierung selber erledigen. Dafür kann man das Tokenisierungs-Script cmd/utf8-tokenize.perl anpassen oder aber die tokenisierte Datei anderweitig erstellen. Dann kann der TreeTagger direkt aufgerufen und eine vertikalisierte Datei übergeben werden, bei der jedes Wort auf einer eigenen Zeile steht.

Mit tree-tagger -h wird die Hilfe zur Bedienung des TreeTagger aufgerufen.

Tagging einer XML-Datei

Vorbereitung der XML-Datei

Der TreeTagger taggt beim Standardaufruf jede Zeile der Inputdatei. In einer XML-Datei haben wir aber XML-Elemente stehen, die wir nicht taggen wollen. Dafür existiert beim Aufruf des TreeTaggers die Option -sgml, mit der dem Tagger mitgeteilt wird, dass in den Daten SGML-Elemente (= auch XML-Elemente) vorhanden sind, die nicht getaggt werden sollen.

Trotzdem stellt sich bei einer XML-Datei nach dem folgenden Muster ein Problem:

Im Beispiel oben würde der TreeTagger mit der Option -sgml zwar die XML-Elemente intakt lassen, aber auch die Informationen im Header, also den Titel und das Datum annotieren. Dies ist insbesondere dann nicht gewünscht, wenn die Daten in die Corpus Workbench importiert werden sollen, denn dort sollen diese Informationen als nicht-annotierte Metadaten abgelegt werden.

Um steuern zu können, welche Informationen getaggt und welche so belassen werden sollen, behilft man sich am besten damit, die nicht zu taggenden Informationen als XML-Attribute anzulegen (vgl. dazu die Erläuterungen hier).

Die XML-Struktur wird damit flacher. Wenn ein XML-Dokument noch nicht diese Struktur aufweist, kann die Struktur mittels XSL-Transformation in eine flache Struktur überführt werden, wie in diesem Kapitel am Beispiel der Transformation von XHTML zu XML erklärt wird. Das dafür notwendige XSLT-Stylesheet ist in den meisten Fällen allerdings einfacher:

Mit dem XSLT-Stylesheet oben kann die Beispiel-XML-Datei weiter oben in eine flache Struktur überführt werden, wobei gerade noch eine eindeutige ID pro Text erzeugt wird:

Der dafür nötige Befehl zur Transformation lautet z.B. mit xsltproc (aus Mac OS und Unix-Systemen meist standardmäßig vorinstalliert):

xsltproc stylesheet.xslt datei.xml > datei.transformiert.xml

Weitere Informationen zu XSLT-Parsern finden sich in diesem Kapitel.

Taggen der XML-Dateien

Nun wechseln wir zuerst in das Verzeichnis, in dem die zu taggenden XML-Dateien liegen:

cd pfad/zum/verzeichnis/eingeben

Nun können wir zunächst mal eine einzelne XML-Datei taggen. Wir verwenden dafür das Script "tree-tagger-german" im cmd/-Verzeichnis des TreeTaggers, das die Datei zuerst tokenisiert und dann an den Tagger schickt:

tree-tagger-german dateiname.xml

Wenn alles korrekt funktioniert, sollte so der Tagger gestartet und die XML-Datei in getaggter Form direkt ausgegeben werden. Wenn das funktioniert, machen wir das nochmals und leiten die Ausgabe aber in eine neue Datei um:

tree-tagger-german dateiname.xml > dateiname.xml.vrt

Achtung: Die neue Datei muss natürlich anders heißen als die Quelldatei. Eine Möglichkeit ist, einfach die Endung "vrt" hinzuzufügen, was für "vertikalisierter Text" steht und das Format umschreibt, das nach dem Taggen rauskommt.

Jetzt sollte sich die Datei "dateiname.xml.vrt" öffnen lassen und die getaggte Version der XML-Datei sehen.

Nun wollen wir das für alle XML-Dateien machen. Das geht am einfachsten mit einem kleinen Shell-Script, das genau so eingeben werden kann (Pfade anpassen!):

for file in *.xml; do tree-tagger-german $file > $file.vrt; done

Das Script macht Folgendes: mit "for file in *.xml" gehen wir im aktuellen Verzeichnis alle Dateien durch, die auf ".xml" enden. Der Dateiname ist jeweils in der Variable "$file" gespeichert.

Danach folgt für jede Datei der Aufruf des TreeTagger-Scripts, wobei wir für die Ausgabe einfach ".vrt" an den Dateinamen (der in "$file" gespeichert ist) anhängen. Das "done" schließt die "for"-Schlaufe.

Jetzt sollten im Verzeichnis der Korpusdateien neben den xml-Dateien auch die ".xml.vrt"-Dateien liegen. Diese können einfach in ein neues Verzeichnis geschoben werden mit folgenden Befehlen:

Zuerst machen wir ein neues Verzeichnis "vrt" außerhalb des xml-Verzeichnisses:

mkdir ../vrt/

Dann verschieben wir alle Dateien, die auf ".vrt" enden, in dieses Verzeichnis:

mv *.vrt ../vrt/

Fertig! Diese Dateien können dann in die Corpus Workbench importiert werden.