Daten aufbereiten und verwalten

Hat man aus irgendwelchen Quellen Material zusammengetragen, muss es anschliessend in ein einheitlich formatiertes Korpus überführt werden. Die Probleme, die dabei enstehen, haben wir bereits besprochen.

Wie müssen unsere Daten formatiert sein, damit sie gut als Korpus nutzbar sind? Folgende Anforderungen müssen an sie im Idealfall gestellt werden:

  1. Die Daten müssen strukturiert sein, so dass ich z.B. weiss, wo ein Text beginnt und endet, was der Titel ist oder, besonders bei Zeitungsartikeln, was das Datum ist.
  2. Ohne viel Aufwand möchte ich eine Teilauswahl aus den Texten treffen können, also z.B. nur alle Artikel angezeigt haben, die in einem bestimmten Zeitraum erschienen sind.
  3. Das Textformat muss so sein, dass es von möglichst aller Analysesoftware problemlos gelesen werden kann. Viele Programme lesen einfache Textdaten im sog. "Text", "txt" oder "Nur Text"-Format. Dabei können zwar Formatierungen wie Kursiv- und Fettdruck nicht mitgespeichert werden, die sind für linguistische Analysen aber meist nicht von Bedeutung und sollten wenn schon sowieso in XML oder HTML codiert sein. XML ist dann auch das professionelle Format zur Codierung von Textkorpora. Software wie die Open Corpus Workbench liest beispielsweise Korpora in diesem Format ein.
In der Praxis können die Texte nun nach der Beschaffung für ein eigenes Korpus in verschiedenen Formaten vorliegen:

Meine Empfehlung ist es, wenn immer möglich Textdaten in einem XML-Format anzulegen. Im Folgenden werde ich deswegen in aller Kürze in XML einführen und zeigen, wie man Textdaten in XML codiert. So codierte Dateien könnten danach direkt in die Open Corpus Workbench importiert werden, deren Verwendung ich ebenfalls empfehle.

Wer vor XML zurück schreckt oder nur ein kleines Korpus anlegt, ist vielleicht mit meiner "simpel-und-trotzdem-brauchbar"-Lösung glücklicher, die ich hier vorstelle.

Wer viele Texte verwalten muss und daraus immer wieder neue Korpora durch die Selektion von Texten nach bestimmten Kriterien erstellen möchte, könnte sinnvollerweise eine Datenbank einsetzen wollen.

XML-Codierung von Textdateien

Was ist XML?

XML heisst Extensible Markup Language und ist eine sog. Auszeichnungssprache. Sie dient dazu, beliebige Passagen in einem Text mit bestimmten "Tags" auszuzeichnen, um etwas darüber auszusagen, also z.B.:

  1. Der ganze Text, den ich habe, ist ein Korpus, für das ich den Tag corpus definiere.
  2. Eine bestimmte Menge an Text ist ein Artikel, wofür ich z.B. den Tag article definieren kann.
  3. Ein Artikel besteht aus Metadaten über den Text und dem eigentlichen Text. Die Metadaten zeichne ich z.B. mit header, den eigentlichen Text mit body aus.
  4. Innerhalb der Metadaten unterscheide ich einen Titel (title), den Autor (author) und das Datum (date).
  5. Im Artikeltext gibt es Überschriften (h1 und h2) sowie Absätze (p).

Wenn etwas wie h1 oder body bekannt vorkommt, dann mit Recht: HTML-Dokumente weisen solche Tags ebenso aus. Im Prinzip ist HTML eine Art XML-Dialekt.

DTD oder Schema: Die Regeln der XML-Datei

Oben haben wir mit den Punkten 1-4 bereits Regeln definiert, welche Elemente mein XML-Dokument aufweist und in welcher Hierarchie diese auftreten. Normalerweise definiert man diese Regeln ganz explizit in einer "Document Type Definition" (DTD) oder ein XML-Schema, also einer Art Grammatik für die Erstellung von XML-Dokumenten.

Die oben definierten Regeln würden in einer DTD wie folgt niedergeschrieben:

<!ELEMENT corpus (article)+>

<!ELEMENT article (header, body)>

<!ELEMENT header (title, author, date)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT date (#PCDATA)>

<!ELEMENT body (p | h1 | h2)*>
<!ELEMENT p (#PCDATA)>
<!ELEMENT h1 (#PCDATA)>
<!ELEMENT h2 (#PCDATA)>

Es werden in der DTD also Elemente definiert, indem ihnen ein Name gegeben wird und dahinter in Klammer vermerkt ist, welche anderen Elemente unterhalb (als "Kind-Element") dieser Ebene vorkommen dürfen. Ein + bedeutet, dass das Kindelement (oder alle Kindelemente in der Klammer) mindestens einmal vorkommen müssen. Ein * bedeutet, dass das Kindelement überhaupt nicht, einmal oder mehrfach vorkommen darf. Zudem können die Kindelemente durch Komma oder | voneinander getrennt werden: Bei Komma müssen die Kindelemente genau in dieser Reihenfolge vorkommen, bei | ist ihre Reihenfolge frei. #PCDATA steht für Text.

Eine komplette XML-Datei

Und wie sieht nun die eigentliche XML-Datei aus? Dazu müssen wir nun nur noch wissen, dass XML-Tags in spitzen Klammern notiert werden und immer aus einem öffnenden und einem schliessenden Tag bestehen: <title>Das ist der Titel</title>.

Das komplette Beispiel sieht dann so aus:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE corpus SYSTEM "corpus.dtd">
<corpus>
	<article>
		<header>
			<title>Der Titel dieses Artikels</title>
			<author>Hansjakob Babettli</author>
			<date>2014-03-21</date>
		</header>
		<body>
			<h1>Überschrift des Artikels</h1>
			<p>Hier kommt beliebiger Text. Und immer weiter.</p>
			<h2>Zwischenüberschrift</h2>
			<p>Und so geht es weiter.</p>
			<p>Und immer weiter.</p>
		</body>
	</article>
	
	<article>
		<header>
			<title>Der Titel des zweiten Artikels</title>
			<author>Hansjakob Babettli</author>
			<date>2014-03-22</date>
		</header>
		<body>
			<h1>Überschrift des zweiten Artikels</h1>
			<p>Hier kommt beliebiger Text. Und immer weiter.</p>
			<h2>Zwischenüberschrift</h2>
			<p>Und so geht es weiter.</p>
			<p>Und immer weiter.</p>
		</body>
	</article>
</corpus>


Neu sind nur die erste und zweite Zeile. Die erste Zeile sagt, dass es sich um XML der Version 1.0 handelt und das Text-Encoding UTF-8 ist. Die zweite Zeile verweist auf die DTD, also die Regel, nach der die XML-Datei strickt ist. Dieser Verweis auf die DTD ist optional. Die Einrückungen zu Beginn der Zeilen sind ebenfalls optional. Sie verdeutlichen nur die Hierarchieebenen sehr gut und machen den Code damit übersichtlicher.

Die Korrektheit einer XML-Datei kann bezüglich zweier Aspekte geprüft werden:

Es ist praktisch, Wohlgeformtheit und wenn möglich auch Validität laufend zu prüfen, wenn man es mit XML-Dokumenten zu tun hat. Dazu dienen XML-Editoren oder z.B. ein Online-Validator wie jener der w3school.

Achtung: Es gibt ein paar kleine Fallstricke, was Sonderzeichen in XML-Dokumenten betrifft. Ausserhalb von Tags sind spitze Klammern (< und >) verboten, bzw. müssen mit &lt; und &gt; umschrieben werden. Gleiches gilt für &, das mit &amp; umschrieben werden muss.

Eine flachere Hierarchie mit Attributen

Die oben dargestellte XML-Struktur ist zwar sehr übersichtlich, aber nicht sehr kompakt. Im Hinblick auf die weitere Verarbeitung mit Tools maschineller Sprachverarbeitung, z.B. einem automatischen Wortarten-Tagger, oder auch den Import in die Open Corpus Workbench, ist ein flacheres XML-Format ratsam.

Dies kann durch die Benutzung von Attributen erreicht werden:

<article title="Das ist der Titel" author="Hansjakob Babettli" date="2014-03-21">
...
</article>

Damit wird das Beispiel von oben deutlich schlanker:

<?xml version="1.0" encoding="UTF-8"?>
<corpus>
	<article title="Der Titel dieses Artikels" author="Hansjakob Babettli" date="2014-03-21">
		<h1>Überschrift des Artikels</h1>
		<p>Hier kommt beliebiger Text. Und immer weiter.</p>
		<h2>Zwischenüberschrift</h2>
		<p>Und so geht es weiter.</p>
		<p>Und immer weiter.</p>
	</article>
	<article title="Der Titel des zweiten Artikels" author="Hansjakob Babettli" date="2014-03-22">
		<h1>Überschrift des zweiten Artikels</h1>
		<p>Hier kommt beliebiger Text. Und immer weiter.</p>
		<h2>Zwischenüberschrift</h2>
		<p>Und so geht es weiter.</p>
		<p>Und immer weiter.</p>
	</article>
</corpus>

Der Vorteil dieser Darstellung ist, dass so strukturierte Dateien direkt vom Wortarten-Tagger TreeTagger verarbeitet werden können. Dieser gibt dann folgende Datei aus:

<?xml version="1.0" encoding="UTF-8"?>
<corpus>
<article title="Der Titel dieses Artikels" author="Hansjakob Babettli" date="2014-03-21">
<h1>
Überschrift	NN	Überschrift
des	ART	d
Artikels	NN	Artikel
</h1>
<p>
Hier	ADV	hier
kommt	VVFIN	kommen
beliebiger	ADJA	beliebig
Text.	NN	Text.
Und	KON	und
immer	ADV	immer
weiter	PTKVZ	weiter
.	$.	.
</p>
<h2>
Zwischenüberschrift	NN	Zwischenüberschrift
</h2>
<p>
Und	KON	und
so	ADV	so
geht	VVFIN	gehen
es	PPER	es
weiter	PTKVZ	weiter
.	$.	.
</p>
<p>
Und	KON	und
immer	ADV	immer
weiter	ADV	weiter
.	$.	.
</p>
</article>
<article title="Der Titel des zweiten Artikels" author="Hansjakob Babettli" date="2014-03-22">
<h1>
Überschrift	NN	Überschrift
des	ART	d
zweiten	ADJA	zweit
Artikels	NN	Artikel
</h1>
<p>
Hier	ADV	hier
kommt	VVFIN	kommen
beliebiger	ADJA	beliebig
Text.	NN	Text.
Und	KON	und
immer	ADV	immer
weiter	PTKVZ	weiter
.	$.	.
</p>
<h2>
Zwischenüberschrift	NN	Zwischenüberschrift
</h2>
<p>
Und	KON	und
so	ADV	so
geht	VVFIN	gehen
es	PPER	es
weiter	PTKVZ	weiter
.	$.	.
</p>
<p>
Und	KON	und
immer	ADV	immer
weiter	ADV	weiter
.	$.	.
</p>
</article>
</corpus>

Der Tokenizer (= Identifizierer der einzelnen Wörter) des TreeTaggers setzte jedes Wort auf eine eigene Zeile. XML-Tags werden dabei als solche erkannt und als Einheit belassen und auch nicht mit Wortarten annotiert. In der zweiten Spalte wurden die Wortartklassen gemäss Stuttgart-Tübingen-Tagset (STTS) hinzugefügt, in der dritten Spalte stehen die Grundformen (Lemmata).

Jedem sein eigenes XML?

Die Ausführungen oben zeigen, dass im Prinzip jeder und jede für den eigenen Bedarf eine beliebige XML-Grammatik mit eigenen Tagnamen erstellen kann, so lange die Tags konsistent verwendet werden, also wohlgeformt und bezüglich einer DTD oder einem XML-Schema valide sind. Der Vorteil von XML ist zudem, dass mittels einer eigenen Sprache, XSLT, relativ einfach XML-Dokumente in eine andere XML-Struktur, die einer anderen Grammatik folgen, übersetzt werden können.

Sobald man mit anderen Menschen kooperiert und/oder die eigenen Daten nachhaltig archivieren möchte, ist es natürlich sinnvoll, sich an Standards zu orientieren. Diese Standards geben zudem sinnvolle Lösungen vor, wie beispielsweise Metadaten strukturiert werden sollen.

In der Korpuslinguistik und den Digital Humanities hat die Text Encoding Initiative wichtige Standards definiert. TEI, inzwischen in der Version P5, ist ein Set an XML-Regeln, um (relativ) beliebige Texte (historisch, gegenwartssprachlich, alle Gattungen etc.) einheitlich zu codieren.

Die Dublin Core Metadata Initiative definiert Standards zur Erfassung von Metadaten beliebiger Objekte im Internet. Hilfreich ist in diesem Zusammenhang zudem der CLARIN-D User Guide, in dem verschiedene Standards der Dokumentenannotation in der Korpuslinguistik vorgestellt werden.

Trotz all dieser Standards ist es auch immer wieder sinnvoll, mit einer eigenen XML-Grammatik zu arbeiten, insbesondere, wenn man sie für das eigene Projekt sehr einfach halten kann. Wichtig ist jedoch insbesondere:

XML erzeugen: Tools und Methoden

XML-Dokumente können mit jedem beliebigen Text-Editor erstellt werden, etwa SimpleText (Mac), Textpad, Notepad (Windows) etc. Office-Programme sollten dafür jedoch nicht verwendet werden. Viele Text-Editoren bieten zudem für XML angenehme Funktionen, wie z.B. sog. "Syntax Highlighting", also das farbliche Hervorheben der Tags, oder die automatische Tag-Ergänzung. Empfehlenswerte Programme dieser Kategorie sind:

Daneben gibt es richtige XML-Editoren (meistens kommerziell), die noch komfortabler in der Bedienung sind und alle auch XML-Dokumente validieren können, zudem auch XSL-Transormationen, XPath-Abfragen etc. anbieten. Zu den bekanntesten gehören:

Unter Unix-Systemen (und Mac) kann zudem mit dem Kommandozeilenprogramm xmllint sehr einfach die Wohlgeformtheit und Validität eines XML-Dokuments geprüft werden:

xmllint --noout <XML-Datei>

Zum Weiterlesen zu XML und XSLT empfiehlt sich zudem SELFHTML.