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!