Vorlesungsskript 04

Simple Sprachdatenverarbeitung auf der Kommandozeile

Dieses Vorlesungsskript zeigt an drei Beispielen, wie einfachere Analysen von Sprachdaten pur mit Bordmitteln der Unix-Programmierumgebung durchgeführt werden können, ohne selbst ein Programm zu schreiben. Im ersten Beispiel zählen wir die Zeilen, Wörter und Zeichen in einem Roman. Im zweiten Beispiel finden wir heraus, welche Wörter in dem Roman am häufigsten vorkommen. Und im dritten Beispiel schlagen wir Wörter in einer lexikalischen Datenbank nach.

Beispiel 01: Wörter, Zeilen und Zeichen zählen

Hierfür verwenden wir das Programm wc, das uns schon eimal als Beispiel begegnet ist. Außerdem benutzen wir das Programm wget („Web get“), um Daten aus dem World Wide Web herunterzuladen und das Programm mv („move“), mit dem man Dateien umbenennen oder in ein anderes Verzeichnis verschieben kann. Und wir lernen das Konzept der Pipelines kennen, mit denen wir mehrere Programme miteinander kombinieren können.

Um das Beispiel nachzuvollziehen, öffnen Sie ein Terminal und wechseln Sie in ein Verzeichnis, in dem Sie Daten speichern können, etwa auf Ihrem USB-Stick.

Jetzt benutzen Sie das Programm wget. Mit einer Webadresse als Argument lädt es die entsprechende Datei herunter und speichert sie im Arbeitsverzeichnis. So holen wir uns die Romane Pride and Prejudice und Moby Dick, die dank Project Gutenberg als Textdateien im Web zur Verfügung stehen:

$ wget https://www.gutenberg.org/files/1342/1342-0.txt
$ wget https://www.gutenberg.org/files/2701/2701-0.txt

Die Dateinamen sind nicht sehr aussagekräftig, also benennen wir sie um. Dazu verwenden wir das Kommando mv. Das erste Argument ist der alte Dateiname, das zweite der neue:

$ mv 1342-0.txt pride-and-prejudice.txt
$ mv 2701-0.txt moby-dick.txt

Es empfiehlt sich, in Dateinamen keine Leerzeichen zu verwenden, da das Leerzeichen auf der Kommandozeile Argumente voneinander trennt. Argumente können zwar trotzdem Leerzeichen enthalten, aber man muss dann Backslashes davorsetzen (Pride\ and\ Prejudice.txt) oder das ganze Argument in Anführungszeichen setzen ('Pride and Prejudice.txt'), was unhandlich und fehleranfällig ist. Also: nach Möglichkeit Leerzeichen in Dateinamen vermeiden.

Weitere gute Tipps zum Benennen von Dateien in folgendem Foliensatz: Jenny Bryan: Naming Things.

Nun wollen wir mit Hilfe von wc ermitteln, wie viele Zeilen, Wörter und Zeichen jeweils in den beiden Dateien stecken. In einem früheren Beispiel haben wir gesehen, dass wir wc einen Dateinamen als Argument übergeben können, und wc liest dann die Datei. Dass wc seinen Input aus einer Datei lesen kann, ist manchmal komfortabel, aber eigentlich überflüssig, denn es gibt ja schon das Kommando cat, das Dateien liest und deren Inhalt ausgibt. Wir brauchen also eigentlich nur einen Weg, den Output von cat direkt als Input von wc zu verwenden, um denselben Effekt zu erzielen. Genau das leisten Pipelines. Das sieht dann so aus:

$ cat pride-and-prejudice.txt | wc
  13427  124592  726223

Eine Pipeline ist eine Folge von zwei oder mehr Kommandos auf derselben Zeile, getrennt durch senkrechte Striche (|, auch „Pipe“ genannt). Hierbei wird der Output des ersten Kommandos nicht ausgegeben, sondern als Input des zweiten Kommandos verwendet, und so weiter. Der Output des letzten Kommandos wird schließlich ausgegeben – im Beispiel der Output von wc, bestehend aus den Anzahlen der Zeilen, Wörter und Zeichen.

Die Anzahl der Zeilen ist nicht besonders interessant, da in dieser Textdatei Zeilen willkürlich nach 80 Zeichen umgebrochen werden. Am interessantesten für linguistische Analysen ist die Zahl der Wörter. Oft werden wir daher wc die Option -w mitgeben, wodurch es nur die Zahl der Wörter ausgibt. (Entsprechende Optionen gibt es auch für Zeilen (-l) und Zeichen (-c).) Unser Beispielkommando samt Output sieht dann so aus:

$ cat pride-and-prejudice.txt | wc -w
124592

Und für Moby Dick (anscheinend der längere Roman):

$ cat moby-dick.txt | wc -w
215823

Pipelines ermöglichen es, mit einfachen Programmen Daten Schritt für Schritt weiterzuverarbeiten und so mehrere einfache Kommandos zu einem komplexen Kommando zu kombinieren. Das werden wir im nächsten Beispiel sehen.

Beispiel 02: Wortfrequenzlisten

In diesem Beispiel bauen wir in mehreren Schritten eine längere Pipeline, die, ausgehend von einer Textdatei, eine Wortfrequenzliste erstellt. Eine Wortfrequenzliste gibt für jedes Wort an, wie häufig es in einem Text vorkommt.

In jedem Zwischenschritt beenden wir die Pipeline mit | tail. Das Programm tail gibt als Output die letzten zehn Zeilen seines Inputs zurück. Das ist nützlich, da der Output unserer Pipeline ansonsten ziemlich lang werden könnte, und wir wollen nicht jedes Mal die ganze Ausgabe in unserem Terminal haben. Die letzten zehn Zeilen sind hier genug, um die einzelnen Schritte zu testen und zu erklären.

Als ersten Schritt eine ganz kurze Pipeline, die nur cat und tail benutzt. Wir sehen das Ende der Textdatei – nichts aus der Feder von Jane Austen, sondern nur Hinweise die von Project Gutenberg hinzugefügt wurden:

$ cat pride-and-prejudice.txt | tail


Most people start at our Web site which has the main PG search facility:

     http://www.gutenberg.org

This Web site includes information about Project Gutenberg-tm,
including how to make donations to the Project Gutenberg Literary
Archive Foundation, how to help produce our new eBooks, and how to
subscribe to our email newsletter to hear about new eBooks.

Nun interessieren wir uns für die Wörter in dem Text. Da wir es mit englischem Text ohne Sonderzeichen zu tun haben, nehmen wir einmal an, dass Wörter nur aus Groß- und Kleinbuchstaben von A bis Z bestehen. Alle anderen Zeichen interessieren uns nicht. Wir benutzen das Programm tr, um sie wegzuwerfen, genauer gesagt: um sie durch Newline-Zeichen zu ersetzen. Das Newline-Zeichen ist ein spezielles unsichtbares Zeichen, das das Ende einer Zeile signalisiert. Auf diese Weise bleiben nur die Wörter stehen, und zwar jedes für sich auf einer Zeile.

Warum wollen wir jedes Wort auf einer eigenen Zeile stehen haben? Der Grund ist, dass viele Unix-Standardprogramme Zeilen als Datensätze betrachten, also als Einheiten, die sie unabhängig voneinander bearbeiten können. Und die Einheiten, die wir verarbeiten wollen, sind ja Wörter, nicht die willkürlich umgebrochenen Zeilen in der Textdatei. Jedes Wort auf eine eigene Zeile zu bringen, hilft uns daher gleich, wenn wir die Wörter mit weiteren Standardprogrammen weiterverarbeiten.

Mit dem tr-Kommando sehen unsere Pipeline und ihr Output nun so aus:

$ cat pride-and-prejudice.txt | tr -c 'A-Za-z' '\n' | tail
our
email
newsletter
to
hear
about
new
eBooks


Das Argument 'A-Za-z' gibt an, welche Zeichen ersetzt werden sollen: Die Großbuchstaben von A bis Z und die Kleinbuchstaben von a bis z. Die Option -c (für complement) kehrt diese Auswahl um: Es werden alle Zeichen außer denen von A bis Z und von a bis z ersetzt. Das zweite Argument gibt an, wodurch die Nicht-Buchstaben-Zeichen ersetzt werden sollen. \n ist ein spezieller Code, der für das Newline-Zeichen steht.

Es gibt noch ein Problem mit dem Output: Da im Input mehrere Nicht-Buchstaben-Zeichen hintereinander stehen können, haben wir viele leere Zeilen im Output. Das können wir verhindern, indem wir tr anweisen, mehrere ersetzte Zeichen hintereinander zu einem einzigen „zusammenzudrücken“ (engl. squeeze) – mit der Option -s.

Mehrere einbuchstabige Optionen lassen sich bei den meisten Programmen zusammenfassen, sodass wir statt -s -c auch -sc schreiben können. Nun sehen Pipeline und Output so aus:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | tail
subscribe
to
our
email
newsletter
to
hear
about
new
eBooks

Das Ergebnis (bevor wir es mit tail abschneiden) ist jetzt eine lange Liste der Wörter in der Textdatei. Viele Wörter kommen natürlich mehrmals vor, und wir wollen ja letztlich wissen, welche Wörter am häufigsten vorkommen. Wir müssen also jeweils die gleichen Wörter zählen. Dazu müssen wir sie zuerst zusammengruppieren. Hierfür verwenden wir das Programm sort. Es sortiert die Zeilen seines Inputs alphabetisch, sodass gleiche Zeilen direkt hintereinander stehen:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | sort | tail
youth
youth
youth
youth
youth
youth
youth
youth
youths
zip

Jetzt sind wir fast schon kurz davor, eine Wortfrequenzliste zu erstellen. Wir müssen aber verhindern, dass z.B. The und the als verschiedene Wörter gezählt werden – schließlich ist es immer dasselbe Wort, ob es nun am Satzanfang steht und daher groß geschrieben wird oder nicht. Daher ersetzen wir einfach alle Großbuchstaben durch die entsprechenden Kleinbuchstaben. Auch das können wir mit tr machen. Diesmal weisen wir es an, jedes Zeichen zwischen A und Z durch das entsprechende zwischen a und z zu ersetzen.

Wir fügen dieses zweite tr-Kommando vor dem sort-Kommando ein, um ganz sicherzugehen, dass auch Wörter, die erst durch die Ersetzung gleich werden, hinterher zusammenstehen:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | sort | tail
youth
youth
youth
youth
youth
youth
youth
youth
youths
zip

Das letzte Programm, das wir in diesem Beispiel kennenlernen, heißt uniq. uniq fasst gleiche Zeilen, die direkt hintereinander stehen, zu einer einzigen zusammen – ähnlich wie tr mit der -s-Option wiederholte ersetzte Zeichen zusammenfasst. Bei sortiertem Input entfernt uniq also alle Duplikate. Zu unserer Pipeline hinzugefügt sieht das so aus:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | sort | uniq | tail
younge
younger
youngest
your
yours
yourself
yourselves
youth
youths
zip

Wir haben jetzt eine Liste der Typen von Wörtern, die in Pride and Prejudice vorkommen – statt wie vorher eine Liste der Vorkommnisse von Wörtern. Diese Unterscheidung zwischen Typ (engl. type) und Vorkommnis (engl. token) ist in der Linguistik zentral (s.a. Wikipedia hierzu).

Leider enthält die Typliste die Information, die uns interessiert, nicht mehr: Wir wollten ja wissen, wie oft jedes Wort vorkommt. Zum Glück hat uniq die Option -c. Damit entfernt es zwar immer noch Duplikate, zählt aber auch, wie oft jedes Wort im Input vorkommt, und stellt die Anzahl jeder Zeile voran, gefolgt von einem Leerzeichen und dann der ursprünglichen Zeile:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | sort | uniq -c | tail
      4 younge
     30 younger
     13 youngest
    465 your
     23 yours
     50 yourself
      2 yourselves
      9 youth
      1 youths
      1 zip

Dieser Output ist in einem mehrspaltigen Format: jeder Datensatz (jede Zeile) hat mehrere Felder, in unserem Beispiel eins für die Anzahl und eins für das Wort. Manche Standardprogramme können mehrspaltigen Input verarbeiten und dabei individuelle Felder betrachten. Zu diesen Programmen gehört auch sort, und das ist ein Glück, denn so können wir nun einfach unsere Wortfrequenzliste nach Häufigkeit sortieren. Hierzu geben wir sort zwei Optionen: -k mit dem Argument 1, sodass nach der ersten Spalte sortiert wird, und -n, sodass nicht alphabetisch, sondern numerisch sortiert wird:

$ cat pride-and-prejudice.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nk 1 | tail
   1710 she
   1847 was
   1937 in
   2012 a
   2070 i
   2225 her
   3658 and
   3730 of
   4243 to
   4507 the

Wenig überraschend ist the das häufigste Wort in Pride and Prejudice, gefolgt von anderen Funktionswörtern. Bei Moby Dick sieht es ähnlich aus:

$ cat moby-dick.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nk 1 | tail
   2127 i
   2532 his
   2536 it
   3100 that
   4242 in
   4707 to
   4807 a
   6518 and
   6743 of
  14718 the

Beispiel 03: Suche in einer lexikalischen Datenbank

In diesem Beispiel extrahieren wir Informationen aus einer einfachen lexikalischen Datenbank, nämlich einer „Wortform+Lemma+POS-Frequenzliste“, die das Institut für Deutsche Sprache auf seiner Website bereitstellt. Wir laden hier die Datei DeReKo-2014-II-MainArchive-STT.100000.freq.7z herunter und entpacken sie. Das geht mit den folgenden Kommandos:

$ wget http://www1.ids-mannheim.de/fileadmin/kl/derewo/DeReKo-2014-II-MainArchive-STT.100000.freq.7z
$ 7z e DeReKo-2014-II-MainArchive-STT.100000.freq.7z

Alternative, da 7z auf den Pool-Rechnern nicht zur Verfügung steht:

$ wget https://kilian.evang.name/python/DeReKo-2014-II-MainArchive-STT.100000.freq

Eine „Wortform+Lemma+POS-Frequenzliste“ ist so etwas Ähnliches wie eine Wortfrequenzliste. Wortfrequenzlisten haben allerdings das Problem, dass sie nicht zwischen zufällig gleichen Wortformen mit unterschiedlichen Wortarten unterscheiden. Z.B. würden der Infinitiv sein wie in reich sein und der Possessivbegleiter sein wie in sein Reich als dasselbe Wort gezählt. Eine „Wortform+Lemma+POS-Frequenzliste“ gibt dagegen zu jeder Wortform auch noch die Grundform (Lemma) und die Wortart (engl. part of speech, POS) an und zählt entsprechend Wörter mit derselben Form, aber anderer Wortart, getrennt.

Im Gegensatz zu den in dem vorherigen Beispiel erstellten Wortfrequenzlisten basiert die Liste des IDS nicht auf einem einzigen Text, sondern auf einem großen Textkorpus (Sammlung von Texten) mit Milliarden von Wortvorkommnissen. Nur die häufigsten 10 000 Wort-Lemma-POS-Kombinationen wurden in die Liste aufgenommen.

Nach dem Entpacken haben wir zwei Dateien: eine .readme-Datei und die Frequenzliste selbst. Schauen wir uns ihren Aufbau an. Dazu verwenden wir das Programm head. Das ist das Gegenstück zu tail – es gibt den Anfang seines Inputs aus. Mit der Option -n 20 erhöhen wir die Anzahl der ausgegebenen Zeilen von den standardmäßigen 10 auf 20:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | head -n 20
,	,	$,	500367688
.	.	$.	481370234
der	die	ART	241408360.16429
die	die	ART	188943867.569055
und	und	KON	186351587
"	"	$(	156259594
in	in	APPR	140040898
den	die	ART	90221588.7685169
)	)	$(	87781685
(	(	$(	86235023
:	:	$.	85783819
von	von	APPR	78788653.4211233
mit	mit	APPR	66879801.6867092
ist	sein	VAFIN	64833211
im	im	APPRART	62591891
für	für	APPR	56990511
des	die	ART	56555049.7224575
sich	er|es|sie	PRF	55471013
nicht	nicht	PTKNEG	52636895
Die	die	ART	51178010.8418797

Die Frequenzliste liegt in einem vierspaltigen Format vor. In der ersten Spalte erscheinen Wortformen (und Satzzeichen) so, wie sie in Texten erscheinen. In der zweiten werden die zugehörigen Lemmata angegeben. Oft sind Form und Lemma identisch, bei flektierenden Wortarten aber oft nicht; das Lemma zu ist ist z.B. sein. Die Artikel der, die, das und ihre Formen wie z.B. den werden unter dem Lemma die zusammengefasst. Und für das Reflexivpronomen sich, das keinen Nominativ hat, wurde das „Kunstlemma“ er|es|sie erschaffen. In der dritten Spalte wird die Wortart angegeben, nach dem STTS-Standard. Z.B. steht VAFIN für „finites Hilfsverb“, ART für „Artikel“ und PRF für „Reflexivpronomen“. In der vierten Spalte schließlich steht die Häufigkeit jeder Wort-Lemma-POS-Kombination im Referenzkorpus (wenn wir die Nachkommastellen für den Moment ignorieren).

Alle POS-Lemma-Kombinationen zu einer Wortform finden

Schauen wir einmal, wie viele Einträge es auf der Liste für die Wortform sein gibt. So:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^sein\s'
sein	sein	VAINF	8258943.50953017
sein	sein	PPOSAT	4285806.53298996

Wie erwartet finden wir einen Eintrag für das Hilfsverb (im Infinitiv) und einen Eintrag für den Possessivbegleiter.

Verwendet haben wir hier das Programm egrep. Es durchsucht Textdateien nach bestimmten Mustern und gibt nur die Zeilen aus, die dem Muster entsprechen. Muster sind so etwas wie Suchbegriffe, wobei verschiedene Sonderzeichen spezielle Bedeutungen haben. ^ steht zum Beispiel für den Anfang einer Zeile und \s für Whitespace, also z.B. für Leerzeichen oder für die Tab-Zeichen, die in der Liste die Felder einer Zeile voneinander trennen. Das Muster im obigen Beispiel erkennt somit alle Zeilen, bei denen in der ersten Spalte sein steht.

Die Form der kommt mit drei verschiedenen Wortarten vor (Artikel, Relativpronomen und Demonstrativpronomen):

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^der\s'
der	die	ART	241408360.16429
der	die	PRELS	11523468.6889763
der	die	PDS	149080.675365636

Alle Wortformen zu einer Lemma-POS-Kombination

Jetzt interessieren wir uns dafür, welche Formen des bestimmten Artikels vorkommen. Wie wir bereits gesehen haben, wird dessen Lemma mit die angegeben, und die Wortart ist ART. Mit folgendem Kommando zeigen wir alle Zeilen an, wo die in der zweiten und ART in der dritten Spalte steht:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+die\s+ART\s'
der	die	ART	241408360.16429
die	die	ART	188943867.569055
den	die	ART	90221588.7685169
des	die	ART	56555049.7224575
Die	die	ART	51178010.8418797
dem	die	ART	48881102.8527428
das	die	ART	47893921.3883674
Der	die	ART	28005481.9307718
Das	die	ART	12830301.1056614
Den	die	ART	2140011.90371313
Dem	die	ART	721802.244175329
DER	die	ART	168697.779576025
Des	die	ART	135264
DES	die	ART	46472.160295978
DIE	die	ART	41889.2505330014
DAS	die	ART	40360.5101399999

In dem Muster steht \S+ für „Zeichen, die kein Whitespace sind, und davon eins oder mehrere hintereinander. Damit überspringen wir die erste Spalte. \s+ steht entsprechend für „Zeichen, die Whitespace sind, und davon eins oder mehrere hintereinander. Damit übespringen wir die Abstände zwischen den Spalten.

Wenn wir uns nur für die verschiedenen Formen des bestimmten Artikels interessieren, macht es Sinn, nur die erste Spalte auszugeben und die anderen wegzuwerfen. Das leistet das Programm cut – seiner -f-Option übergeben wir die Nummer der Spalte, die wir beibehalten wollen:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+die\s+ART\s' | cut -f 1
der
die
den
des
Die
dem
das
Der
Das
Den
Dem
DER
Des
DES
DIE
DAS

Diese Ausgabe sieht immer noch etwas unordentlich aus, weil die Frequenzliste des IDS groß- und kleingeschriebene Wörter getrennt zählt. Das beheben wir, wie bereits in Beispiel 02 gesehen, indem wir mit tr alles zu Kleinschreibung konvertieren, mit sort sortieren und mit uniq Duplikate entfernen:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+die\s+ART\s' | cut -f 1 | tr 'A-ZÄÖÜ' 'a-zäöü' | sort | uniq
das
dem
den
der
des
die

Obwohl in keiner der Formen Umlaute vorkommen, haben wir hier das tr-Kommando so erweitert, dass auch Umlaute berücksichtigt würden.

Summe der Häufigkeiten pro Wortart

Sind im Referenzkorpus mehr Verben oder mehr Nomen? Um das herauszufinden, zählen wir die Häufigkeiten pro Wortart zusammen.

Dabei hilft uns bc, der „Taschenrechner“ der Kommandozeile. Hier ein kurzes Beispiel, das zeigt, wie man bc benutzt:

$ echo '1+1' | bc
2

Als ersten Schritt geben wir mit egrep alle Verben aus. Verben haben im STTS-Standard je nach Verbtyp und -form unterschiedliche Kürzel (part-of-speech tags, kurz: Tags), die aber alle mit V beginnen, sodass wir sie mit einem Muster leicht erfassen können. Wir schicken den Output wieder durch tail, damit er nicht das ganze Terminal füllt:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+\S+\s+V' | tail
aufmachte	aufmachen	VVFIN	3759
flehte	flehen	VVFIN	3759
verlegen	verlegen	VVFIN	3758.50789999993
widersteht	widerstehen	VVFIN	3758
verheilt	verheilen	VVPP	3756.254224
geschahen	geschehen	VVFIN	3756
addiert	addieren	VVFIN	3755.79638800024
möcht	UNKNOWN	VVFIN	3755.0960949999
mitträgt	mittragen	VVFIN	3755
politisieren	politisieren	VVINF	3754.43720500005

Da wir für das Zusammenzählen nur die Häufigkeitsangaben brauchen, schneiden wir die ersten drei Spalten weg:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+\S+\s+V' | cut -f 4 | tail
3759
3759
3758.50789999993
3758
3756.254224
3756
3755.79638800024
3755.0960949999
3755
3754.43720500005

Aus dieser Zahlenkolonne machen wir einen Input für bc, also einen arithmetischen Term, indem wir alles auf eine Zeile setzen und Pluszeichen dazwischen setzen. Das leistet das Kommando paste -sd '+'. So sieht es aus, wenn wir das nach tail einfügen und somit zunächst einen Term für die Häufigkeiten der zehn letzten Einträge erhalten:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+\S+\s+V' | cut -f 4 | tail | paste -sd '+'
3759+3759+3758.50789999993+3758+3756.254224+3756+3755.79638800024+3755.0960949999+3755+3754.43720500005

Um die Summe der Häufigkeiten aller Verb-Einträge zu erhalten, entfernen wir jetzt tail und fügen am Ende bc hinzu:

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+\S+\s+V' | cut -f 4 | paste -sd '+' | bc
1074801284.42364404178

Nun die entsprechende Pipeline für Nomen (die POS-Tags beginnen hier mit N):

$ cat DeReKo-2014-II-MainArchive-STT.100000.freq | egrep '^\S+\s+\S+\s+N' | cut -f 4 | paste -sd '+' | bc
2193873683.62895669037

Etwa doppelt so viele Nomenvorkommen wie Verbvorkommen im Referenzkorpus also!