• Keine Ergebnisse gefunden

Die Funktionen des CorpusAnalysers

Typetoken_Bedeutung results from db

Der Befehl ./db_query_all_typetoken_lemma.sh bewirkt, dass alle Lemmata, die pro Bedeutungskategorie vorkommen, sortiert und gezählt werden.

Die derartig sortierten Lemmata werden dann ihren Bedeutungskategorien zugeordnet und in CSV-Dateien abgelegt.

Abbildung 5.13: CA: typetoken bedeutung results

5.2.2 02_create_database

Hinter dieser Funktion befinden sich die Skripte create_database.sh sowie db_table_structure.sqlite3. Ersteres erstellt eine SQLite3-Datenbank corpus.db und initialisiert die Tabellen, die im zweiten Skript erläutert sind.

Wenn bereits eine Datenbank exisitiert, wird diese gelöscht und mit der neu erstellten Datenbank überschrieben. Das Skript db_table_structure.sqlite3 enthält die Tabellenstruktur der Datenbank. Im Wesentlichen gehören dazu:

sprecher, aufnahme, textpostags, wavdatei. Abbildung 5.14 zeigt einen Ausschnitt des Skripts zur Erstellung der Untertabelle sprecher. Enthalten sind id (aufnahme-id), name (des kindes), kuerzel (des kindes), geschlecht, sprache, erstsprache, geburtstdatum. Die ID, die auch bei den dazugehörigen Aufnahmen als Fremdschlüssel (FOREIGN KEY) unter der sprecher_id vorkommt, wird dort eingetragen.

Abbildung 5.14: CA: table structure sprecher

Im Teil aufnahme (Abbildung 5.15) sind die Informationen id, sprecher_id und wavdatei_id enthalten. Ferner sind enthalten der esb_name, datum, kommentar und FOREIGN KEYs, die die IDs der entsprechenden sprecher-und wavdatei-Tabellen auf die Informationen sprecher-id und wavdatei-id verlinken. Die ID, welche auch bei der dazugehörigen textpostags-Tabelle als Fremdschlüssel unter der aufnahme-id vorkommt, wird dort eingetragen. Der esb_name ist die entsprechende EXMARaLDA-Datei. Das datum enspricht dem Aufnahmedatum der Audio-Datei.

Abbildung 5.15: CA: table structure aufnahme

Der Unterpunkt textpostags (Abbildung 5.16) enthält alle Informationen zu den einzelnen Wörtern, POS-Tags und Lemmata. Dazu gehören die id, aufnahme_id, wort (bzw. Wort, das geäußert wurde), lemma (das dem Wort entspricht), postag (POS-Tag des jeweiligen Lexems bzw.

Lemmas),unverständlich(einige geäußerte Wörter wurden als unverständlich markiert und werden an dieser Stelle ausgeklammert). Die Punkte tli_start, tli_start_intp, tli_end und tli_end_intp beziehen sich auf die Timeline-Start und -endpunkte, an denen sich wort+postag+lemma+bedeutung in der EXMARaLDA-Datei befinden. tli_start_intp und tli_end_intp stellen dabei interpolierte Start- bzw. Endwerte in den Zeitabschnitten dar. Die Funktion der Interpolierung, also das Schätzen von Zeitwerten, ist mit dem EXMARaLDA Partitur Editor möglich. Bei der Arbeit mit EXMARaLDA kann es zu unbenutzten Spalten oder Lücken in der Zeitskala kommen (z. B., weil ein Wort entfernt wurde). Entstehen in einer Datei mehrerer solcher unbenutzter Punkte, kann dies durch die Interpolierung ausgeglichen werden, indem die leeren Spalten oder Lücken entfernt werden. Jeder Spalte werden dann neue Zeitwerte zugeordnet. Hierbei ist allerdings Vorsicht geboten, wenn die EXMARaLDA-Datei bei der späteren Analyse noch mit der jeweiligen Wave-Datei kooperieren muss (etwa bei phonetischen Analysen). Durch die Interpolierung verändern sich die absoluten Zeitwerte und entsprechen nicht mehr denen der Wave-Datei. Durch die textpostags-vorgaenger_id und die textpostags-nachfolger_id koennen in der Ausgabedatei Vorgänger und Nachfolger zugeordnet und dadurch die geäußerten Wörter angezeigt werden. Insbesondere bei der Analyse von Konnotationen ist dies hilfreich.

Abbildung 5.16: CA: table structure: textpostags

Abbildung 5.17 zeigt den Tabelleneintrag wavdatei. Dieser enthält die Punkte id und name (der jeweiligen Wave-Datei). Jeder Wave-Datei wird ein Name und eine ID in der Datenbank zugeordnet, welche auch bei den entsprechenden Aufnahmen als Fremdschlüssel (FOREIGN KEY) unter der wavdatei-id eingetragen wird.

Abbildung 5.17: CA: table structure wav_datei

5.2.3 03_import_data

Unter der Funktion 03_import_data verbergen sich die Skripte db_import_all.sh und db_import_exb_to_db3.pl. Das Perlskript liest EXMARaLDA-Dateien im exportierten XML-Format aus und zieht die relevanten Daten aus der jeweiligen Datei. Dann schreibt es die so erhaltenen Werte in die SQLite3-Datenbank. Wenn ein Eintrag in der Datenbank bereits existiert, wird der neue Eintrag ignoriert. Zum Erstellen einer aktualisierten Datenbank, muss das Skript create_database.sh reinitialisiert werden.

Das Skript db_import_all.sh wird verwendet, um EXMARaLDA-Dateien in die Datenbank zu importieren. Durch diesen Schritt werden alle EXMARaLDA-Dateien (.exb) aus einem gegebenen Ordner gelesen und der Inhalt der Dateien in die Datenbank geschrieben. Der Inhalt der EXMARaLDA-Dateien wird durch das Unterskriptdb_import_exb_to_db3.plin SQLite3 importiert und exportiert.

5.2.4 04_query_db

Unter 04_query_db finden sich sechs Unterfunktionen mit den jeweiligen Skripten, die im Folgenden genauer beschrieben werden sollen. Die Skripte sind für die Analyse der Daten (Kapitel 6 und 7) essentiell. Durch leichte Änderungen in den Befehlszeilen können beispielweise die gleichen Untersuchungen in anderen Sprachen unternommen werden. Auch das Untersuchen von Morphemen und Phonemen ist mit den Skripten möglich.

Doch dazu später mehr (Abschnitt 5.3). Alle Skripte bzw. deren wesentlichen Teile befinden sich im Folgenden mit der entsprechenden Kennzeichnung in blau unterlegter Schrift. Weiterhin wurden zu Zwecken der Übersichtlichkeit die Kommentare in den Skripten ausgespart.

5.2.4.1 01_tag_count

Hinter dieser Funktion verbergen sich vier Skripte, deren Funktionen im Folgenden näher erläutert werden.

db_query_tag_count.sh: Dieses Skript fragt die POS-Tags zwischen den Zeitstempeln in der Datenbank ab und schreibt die Ergebnisse in eine CSV-Datei. Anhand des nun folgenden Ausschnitts aus dem Skript sollen die relevanten Befehle im Hinblick auf die Zwecke dieser Arbeit erläutert werden:

Skript: db_query_tag_count.sh

DB=../../../02_generated_files/corpus.db

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ ! -d $4 ] ; then echo "usage $0 daymin daymax postag outputdir"

exit fi

DAYMIN=$1 DAYMAX=$2 POSTAG="$3"

OUTPUTDIR=$4

echo -n ’SELECT sprecher.name, sprecher.geburtsdatum, ’ > query.sql echo -n ’aufnahme.datum, julianday(aufnahme.datum) ’ >> query.sql echo -n ’-julianday(sprecher.geburtsdatum), ’ >> query.sql

echo -n ’aufnahme.esb_name, textpostags.wort, ’ >> query.sql echo -n ’textpostags.postag, textpostags.id ’ >> query.sql echo -n ’FROM sprecher,aufnahme,textpostags ’ >> query.sql echo -n ’WHERE julianday(aufnahme.datum) - ’ >> query.sql echo -n ’julianday(sprecher.geburtsdatum) > ’ >> query.sql echo -n $DAYMIN >> query.sql

echo -n ’ AND julianday(aufnahme.datum) ’ >> query.sql echo -n ’- julianday(sprecher.geburtsdatum) < ’ >> query.sql echo -n $DAYMAX >> query.sql

echo -n ’ AND textpostags.postag = "’ >> query.sql echo -n $POSTAG >> query.sql

echo -n ’" AND aufnahme.sprecher_id = sprecher.id AND’ >> query.sql

echo -n ’ textpostags.aufnahme_id = aufnahme.id;’ >> query.sql

echo "create file $OUTPUTDIR/output_${POSTAG}_${DAYMIN}_${DAYMAX}.csv"

cat query.sql | sqlite3 $DB > \

$OUTPUTDIR/output_${POSTAG}_${DAYMIN}_${DAYMAX}.csv rm query.sql

Durch die Befehle DAYMIN und DAYMAX wird die Zeitspanne eingegrenzt, innerhalb welcher die POS-Tags gezählt und geordnet werden sollen. Ferner wird der Name und das Geburts- sowie Aufnahmedatum jeder Sprecherin und jedes Sprechers zu jedem Zeitpunkt benötigt. Durch die Berechnung in Juliandays4 können die Zeitangaben in Tagen gemacht werden. Das ist sehr sinnvoll, weil nicht alle Monate die gleiche Anzahl an Tagen aufweisen. Zudem rechnen Programme häufig in Tagen, wodurch weniger Ungenauigkeiten entstehen können. Durch die Befehlszeilen

echo -n ’SELECT sprecher.name, sprecher.geburtsdatum, ’ > query.sql echo -n ’aufnahme.datum, julianday(aufnahme.datum) ’ >> query.sql echo -n ’-julianday(sprecher.geburtsdatum), ’ >> query.sql

erfolgt zunächst die Ausgabe der Sprecherin/des Sprechers, die/der zu einer der hier verwendeten drei Altersgruppen zugeordnet werden kann.

Die Zuordnung wird errechnet durch die Information des Geburts- und Aufnahmedatums. Zusätzlich erhält man die POS-Tags der jeweiligen Sprecherin/des jeweiligen Sprechers in einem bestimmten Zeitraum in Verbindung mit dem jeweilig geäußerten Wort und der zugeordneten ID.

Diese Informationen zieht das Skript aus der erstellten Datenbank aus den Untertabellen sprecher, aufnahme und textpostags. Dabei werden (in einem folgenden Skript) für den Startpunkt ein Tagesminimum (DAYMIN) sowie ein Tagesmaximum (DAYMAX), also eine Zeitspanne von DAYMIN bis DAYMAX, in Juliandays festgelegt, die für die jeweilige Abfrage in Frage kommt. Weiterhin können ausgewählte oder alle POS-Tags gleichzeitig für eine Abfrage festgelegt werden (Skript: db_query_all_tag_count.sh). Des Weiteren ist eine Festlegung ausgewählter bzw. aller Sprecher/innen möglich, die in Verbindung mit diesen Informationen analysiert werden sollen.

db_query_all_tag_count.sh: Dieses Skript fragt die angeforderten POS-Tags zwischen den definierten Zeitstempeln aus der SQLite3-Datenbank ab und schreibt die Ergebnisse in eine CSV-Datei. Die Abfrage der Datenbank wird durch das Unterskript db_query_tag_count.sh ausgeführt.

Laut Mack (2014) müssen die Variblen DAYMINMAX, POSTAGS und OUTPUT_DIR je nach dem Ziel der Abfrage im Skript geändert bzw.

4https://en.wikipedia.org/wiki/Julian_day (letzter Zugriff 22.10.2014)

angepasst werden ([Mack (2014)]). Im unten aufgeführten Skript wird ersichtlich, dass die Zeitspanne alle drei Altersgruppen enthält: 1281:1495, 1496:1708, 1709:1983. An dieser Stelle kann variiert werden. Es kann in einer nächsten Abfrage zum Beispiel nur die Altersgruppe 1281:1495 berücksichtigt werden. Dementsprechend sieht die Befehlszeile folgendermaßen aus:

DAYMINMAX=“1281:1495“. Im Anschluss daran stehen hinter der Variable POSTAGS alle POS-Tags, die in der Analyse auftreten können. Sollen zum Beispiel lediglich die Eigennamen (NE) in der gewählten Altersgruppe untersucht werden, so wird nur POSTAGS=“NE“ in die Befehlszeile gesetzt.

Soll untersucht werden, welche und wieviele Adjektive und Konjunktionen in der gewählten Altersgruppe je Kind vorkommen, dann würde die Befehlszeile POSTAGS=“ADJA ADJD KOKOM KON KOUS“ lauten (alle POS-Tags ohne Kommata, nur mit Leerzeichen, voneinander getrennt aufführen!).

Werden hingegen alle POSTAGS je Kind untersucht, dann müssen alle POS-Tags aufgeführt werden. Hinter OUTPUT_DIR= wird der Pfad für das Ausgabeverzeichnis angegeben, also der Ort, an dem der Ordner mit den Ergebnissen liegen soll. Im Falle der vorliegenden Arbeit liegt das OUTPUT_DIR unter ../../../03_db_query_results/tag_count.

Skript: db_query_all_tag_count.sh

DAYMINMAX="1281:1495 1496:1708 1709:1983"

POSTAGS="ADJA ADJD ADV APPR APPRART ART CARD FM ITJ KOKOM KON KOUS NE NN PAV"

POSTAGS="$POSTAGS PDAT PDS PIAT PIDAT PIS PPER PPOSAT PPOSS PRELAT PRELS PRF"

POSTAGS="$POSTAGS PTKA PTKANT PTKNEG PTKVZ PTKZU PWAT PWAV PWS VAFIN VAIMP"

POSTAGS="$POSTAGS VAINF VAPP VMFIN VMINF VMPP VVFIN VVIMP VVINF VVIZU VVPP XY"

OUTPUT_DIR=../../../03_db_query_results/tag_count for d in $DAYMINMAX ; do

if [[ $d =~ ^(.*):(.*)$ ]]; then

DAYMIN=‘echo ${BASH_REMATCH[1]}‘

DAYMAX=‘echo ${BASH_REMATCH[2]}‘

for i in $POSTAGS ; do

if [ ! -e $OUTPUT_DIR/${DAYMIN}_${DAYMAX} ] ; then mkdir -p $OUTPUT_DIR/${DAYMIN}_${DAYMAX}

fi

echo $DAYMIN $DAYMAX $i $OUTPUT_DIR/${DAYMIN}_${DAYMAX}

./db_query_tag_count.sh $DAYMIN $DAYMAX $i \

$OUTPUT_DIR/${DAYMIN}_${DAYMAX}

done fi done

db_query_tag_count_name.sh: Das Skript arbeitet im Wesentlichen wie das Skript db_query_tag_count.sh. Der Unterschied ist, dass die POS-Tags nicht nur nach der Altersgruppe sortiert werden, sondern dass auch eine Zuordnung zur jeweiligen Sprecherin/zum jeweiligen Sprecher stattfindet.

Die Ergebnisse werden wie gewohnt in eine CSV-Datei geschrieben. Die

Befehlszeilen des vorliegenden Skripts entsprechen größtenteils denen des Skriptsdb_query_tag_count.sh. Zusätzlich existieren die Befehlszeilen

echo -n $NAME >> query.sql

echo -n ’" AND aufnahme.sprecher_id = sprecher.id AND’ >> query.sql echo -n ’ textpostags.aufnahme_id = aufnahme.id;’ >> query.sql

Durch das Einfügen dieser Befehle wird erreicht, dass sich die Abfrage speziell auf eine/n Sprecher/in bezieht (mehr dazu im nächsten Skript).

Skript: db_query_tag_count_name.sh

DB=../../../02_generated_files/corpus.db

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ ! -d $4 ] || [ -z $5 ] then echo "usage $0 daymin daymax postag outputdir name"

exit fi

DAYMIN=$1 DAYMAX=$2 POSTAG="$3"

OUTPUTDIR=$4 NAME=$5

echo -n ’SELECT sprecher.name, sprecher.geburtsdatum, ’ > query.sql echo -n ’aufnahme.datum, julianday(aufnahme.datum) ’ >> query.sql echo -n ’-julianday(sprecher.geburtsdatum),’ >> query.sql

echo -n ’aufnahme.esb_name, textpostags.wort, ’ >> query.sql echo -n ’textpostags.postag, textpostags.id ’ >> query.sql echo -n ’ FROM sprecher,aufnahme,textpostags ’ >> query.sql echo -n ’WHERE julianday(aufnahme.datum) - ’ >> query.sql echo -n ’julianday(sprecher.geburtsdatum) > ’ >> query.sql echo -n $DAYMIN >> query.sql

echo -n ’ AND julianday(aufnahme.datum) ’ >> query.sql echo -n ’- julianday(sprecher.geburtsdatum) < ’ >> query.sql echo -n $DAYMAX >> query.sql

echo -n ’ AND textpostags.postag = "’ >> query.sql echo -n $POSTAG >> query.sql

echo -n ’" AND sprecher.kuerzel = "’ >> query.sql echo -n $NAME >> query.sql

echo -n ’" AND aufnahme.sprecher_id = sprecher.id AND’ >> query.sql echo -n ’ textpostags.aufnahme_id = aufnahme.id;’ >> query.sql COUNT=‘cat query.sql | sqlite3 $DB | wc -l‘

if [ $COUNT -gt 0 ] ; then

echo -n "$COUNT datarows found: "

echo "create file $OUTPUTDIR/output_${POSTAG}_${DAYMIN}_${DAYMAX}.csv"

cat query.sql | sqlite3 $DB > \

$OUTPUTDIR/output_${POSTAG}_${DAYMIN}_${DAYMAX}.csv else

echo "$COUNT datarows found: "

fi

rm query.sql

db_query_all_tag_count_name.sh:Dieses Skript fragt die POS-Tags zwischen den Zeitstempeln unter Berücksichtigung des jeweilig gewählten Namen in Kurzform aus der Datenbank ab. Die Resultate werden wie gewohnt in

eine CSV-Datei geschrieben. Die Abfrage aus der Datenbank wird durch das Unterskript db_query_tag_count.sh initiiert. Die Variablen DAYMINMAX, POSTAGS, NAMES und OUTPUT_DIR können und sollten je nach dem Ziel der jeweiligen Abfrage eigenständig angepasst werden. Die Befehlszeilen entsprechen denen des Skripts db_query_all_tag_count.sh mit dem Zusatz, dass hier auch die einzelnen Sprecher/innen ausgewählt werden können.

Wenn eine derartige Abfrage mit allen Sprecherkürzeln ausgeführt wird, erhält man alle POS-Tags in Zuordnung zur jeweiligen Sprecherin/zum jeweiligen Sprecher, sortiert nach der Altersgruppe als Ergebnis. Der entsprechende Überordner kann zum Beispiel all_tag_count_name heißen. Als Unterordner können idealerweise drei Unterordner für je eine Altersgruppe angelegt werden. Hinter jedem dieser drei Ordner sollten in logischer Konsequenz jeweils Ordner auftauchen, die einer bestimmten Sprecherin/einem bestimmten Sprecher zuordenbar sind. In diesen Ordnern werden die jeweiligen POS-Tags in einer CSV-Datei abgelegt, die von der jeweiligen Sprecherin/vom jeweiligen Sprecher in der betreffenden Altersgruppe geäußert wurden bzw. dem jeweiligen syntaktischen Wort zugeordnet wurden.

Dies stellt nur eine mögliche Ordnerstruktur dar, die selbstverständlich je nach Bedarf geändert werden kann. Ferner ist es vorstellbar, dass nicht immer alle POS-Tags je Sprecher/in und Altersgruppe von der Datenbank abgefragt werden. Sollen beispielsweise nur die Verben analysiert werden, die der Sprecher MK im Zeitraum 1496 bis 1708 verwendet hat, dann müsste die Zeile DAYMINMAX=“1496:1708“ auf diese Weise eingegrenzt werden.

Damit werden lediglich POS-Tags abgefragt, die in diesem Zeitraum geäußert wurden. Durch Verändern der nächsten Zeile in

POSTAGS="VAFIN VAIMP VAINF VAPP VMFIN VMINF VMPP VVFIN VVIMP VVINF VVIZU VVPP"

werden ausschließlich alle Verben in der genannten Altersgruppe berücksichtigt. Da jedoch nicht alle Sprecher/innen in Betracht gezogen werden, sondern nur MK, muss der Befehl NAMES geändert werden in NAMES=“MK“. Ein anderes Szenario wäre es beispielsweise herauszufinden, wie viele Eigennamen (NE) in allen Altersgruppen von jedem einzelenen Kind geäußert werden. Dann müsste folgende Befehlszeile eingefügt werden:

DAYMINMAX=“1281:1495 1496:1708 1709:1983“

Für die Abfrage der POS-Tags genügt in diesem Falle POSTAGS=“NE“; die Zeile der Sprecher/innen muss wieder alle Namen enthalten, also

NAMES="AV JK JS LAR LEO LL LUA MA MK MM SO RD".

Das vollständige Skript zum Befehl db_query_all_tag_count_name.sh sieht folgendermaßen aus:

Skript: db_query_all_tag_count_name.sh

DAYMINMAX="1281:1495 1496:1708 1709:1983"

POSTAGS="ADJA ADJD ADV APPR APPRART ART CARD FM ITJ KOKOM KON KOUS NE NN PAV"

POSTAGS="$POSTAGS PDAT PDS PIAT PIDAT PIS PPER PPOSAT PPOSS PRELAT PRELS PRF"

POSTAGS="$POSTAGS PTKA PTKANT PTKNEG PTKVZ PTKZU PWAT PWAV PWS VAFIN VAIMP"

POSTAGS="$POSTAGS VAINF VAPP VMFIN VMINF VMPP VVFIN VVIMP VVINF VVIZU VVPP XY"

NAMES="av mm js rd mk leo lar so lua jk ll ma"

OUTPUT_DIR=../../../03_db_query_results/tag_count for n in $NAMES ; do

for d in $DAYMINMAX ; do if [[ $d =~ ^(.*):(.*)$ ]]; then

DAYMIN=‘echo ${BASH_REMATCH[1]}‘

DAYMAX=‘echo ${BASH_REMATCH[2]}‘

for i in $POSTAGS ; do

if [ ! -e $OUTPUT_DIR/${DAYMIN}_${DAYMAX}/$n ] ; then mkdir -p $OUTPUT_DIR/${DAYMIN}_${DAYMAX}/$n fi

echo -n "$DAYMIN $DAYMAX $i "

echo "$OUTPUT_DIR/${DAYMIN}_${DAYMAX}/$n"

./db_query_tag_count_name.sh $DAYMIN $DAYMAX $i \

$OUTPUT_DIR/${DAYMIN}_${DAYMAX}/$n $n done

rmdir –ignore-fail-on-non-empty $OUTPUT_DIR/${DAYMIN}_${DAYMAX}/$n fi

done done

5.2.4.2 02_typetoken

db_query_typetoken.sh: Mit diesem Skript werden die Types und die dazugehörigen Tokens zwischen den Zeitstempeln der EXMARaLDA-Datei abgefragt und in eine CSV-Datei geschrieben. Des Weiteren werden alle vorkommenden Wörter je POS-Tag und Altersgruppe in einer separaten Wortliste aufgeführt. Was sich recht simpel anhört, ist spätestens bei der Betrachtung des dazugehörigen Skripts eine lange Abfolge von Befehlszeilen. Der Befehl, mit dem die eben genannte Wortliste erstellt wird, istSELECT textpostags.wort; man wählt also das jeweilige POS-Tag mit dem dazugehörigen Wort (nicht Lemma). Benötigt werden dafür die Informationen sprecher, aufnahme, textpostags aus der Datenbank. Außerdem soll erneut die Zeit eingegrenzt und die Ergebnisse geordnet in den drei Altersgruppen anzeigt werden. Durch die Befehlszeilen:

echo -n ’WHERE julianday(aufnahme.datum) ’ >> query.sql

echo -n ’- julianday(sprecher.geburtsdatum) > ’ >> query.sql echo -n $DAYMIN >> query.sql

echo -n ’ AND julianday(aufnahme.datum) ’ >> query.sql echo -n ’- julianday(sprecher.geburtsdatum) < ’ >> query.sql echo -n $DAYMAX >> query.sql

echo -n ’ AND textpostags.postag = "’ >> query.sql echo -n $POSTAG >> query.sql

echo -n ’" AND aufnahme.sprecher_id = sprecher.id ’ >> query.sql echo -n ’AND textpostags.aufnahme_id = aufnahme.id;’ >> query.sql

erhält die Datenbank die Information, dass die POS-Tags jeder Sprecherin/jedes Sprechers zu jedem Aufnahmedatum abgefragt werden sollen. Wichtig im vollständigen Skript ist die Variable WORTLIST und die dazugehörige vollständige Befehlszeile

WORTLIST=‘cat $OUTPUTDIR/output_wortlist_${POSTAG}_${DAYMIN}_${DAYMAX}.txt‘

Dadurch werden alle vorkommenden Wörter in einer Liste angezeigt.

Abbildung 5.18: CA: Wortliste 1281 bis 1495 ART

Abbildung 5.18 zeigt beispielhaft die Wortliste aller Artikel, die von allen Kindern im Zeitraum 1281 bis 1495 geäußert wurden. In einer weiteren Abfrage (query2.sql) sollen schließlich die Types und die Tokens mit den dazugehörigen Sprecherinnen und Sprechern identifiziert und in eine Datei geschrieben werden. An dieser Stelle möchte ich die einzelnen Schritte nicht detailliert beschreiben; das Skript zeigt alle nötigen Befehle, die für eine Abfrage und Ausgabe der Types und Tokens je Sprecher/in in jeder Altersgruppe notwendig sind. Es soll jedoch erwähnt werden, dass durchwc -l (word count, list) alle Wörter gezählt und aufgelistet werden. Insbesondere bei linguistischen Analysen, die die Häufigkeit von Wörtern, Lemmata und/oder anderen sprachlichen Einheiten ermitteln, ist dies von großer Relevanz.

Zudem wird durch den Befehl erreicht, dass alle Wörter in alphabetischer Reihenfolge erscheinen.

Skript: db_query_typetoken.sh

DB=../../../02_generated_files/corpus.db

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ ! -d $4 ] ; then echo "usage $0 daymin daymax postag outputdir"

exit fi

DAYMIN=$1 DAYMAX=$2 POSTAG="$3"

OUTPUTDIR=$4

echo -n ’SELECT textpostags.wort ’ > query.sql

echo -n ’FROM sprecher,aufnahme,textpostags ’ >> query.sql echo -n ’WHERE julianday(aufnahme.datum) ’ >> query.sql echo -n ’- julianday(sprecher.geburtsdatum) > ’ >> query.sql echo -n $DAYMIN >> query.sql

echo -n ’ AND julianday(aufnahme.datum) ’ >> query.sql echo -n ’- julianday(sprecher.geburtsdatum) < ’ >> query.sql echo -n $DAYMAX >> query.sql

echo -n ’ AND textpostags.postag = "’ >> query.sql echo -n $POSTAG >> query.sql

echo -n ’" AND aufnahme.sprecher_id = sprecher.id ’ >> query.sql echo -n ’AND textpostags.aufnahme_id = aufnahme.id;’ >> query.sql cat query.sql | sqlite3 $DB | sort | uniq > \

$OUTPUTDIR/output_wortlist_${POSTAG}_${DAYMIN}_${DAYMAX}.txt

WORTLIST=‘cat $OUTPUTDIR/output_wortlist_${POSTAG}_${DAYMIN}_${DAYMAX}.txt‘

CNT=0

WORDCNTSUM=0

rm -f $OUTPUTDIR/output_typetoken_count_${POSTAG}_${DAYMIN}_${DAYMAX}.csv for j in $WORTLIST ; do

echo -n ’SELECT sprecher.name, sprecher.geburtsdatum, ’ > query2.sql echo -n ’aufnahme.datum, julianday(aufnahme.datum) ’ >> query2.sql echo -n ’-julianday(sprecher.geburtsdatum), ’ >> query2.sql

echo -n ’aufnahme.esb_name, textpostags.wort, ’ >> query2.sql echo -n ’textpostags.postag, textpostags.id FROM ’ >> query2.sql echo -n ’sprecher,aufnahme,textpostags WHERE ’ >> query2.sql echo -n ’julianday(aufnahme.datum) ’ >> query2.sql

echo -n ’- julianday(sprecher.geburtsdatum) > ’ >> query2.sql echo -n $DAYMIN >> query2.sql

echo -n ’ AND julianday(aufnahme.datum) ’ >> query2.sql echo -n ’- julianday(sprecher.geburtsdatum) < ’ >> query2.sql echo -n $DAYMAX >> query2.sql

echo -n ’ AND textpostags.postag = "’ >> query2.sql echo -n $POSTAG >> query2.sql

echo -n ’" AND textpostags.wort = ’\’ >> query2.sql echo -n $j\’ >> query2.sql

echo ’ AND aufnahme.sprecher_id = sprecher.id AND ’ >> query2.sql echo -n ’textpostags.aufnahme_id = aufnahme.id;’ >> query2.sql echo -n "$j|" \ >>\

$OUTPUTDIR/output_typetoken_count_${POSTAG}_${DAYMIN}_${DAYMAX}.csv WORDCNT=‘cat query2.sql | sqlite3 $DB | wc -l‘

WORDCNTSUM=$((WORDCNTSUM + WORDCNT)) CNT=$((CNT + 1)) echo $WORDCNT >>\

$OUTPUTDIR/output_typetoken_count_${POSTAG}_${DAYMIN}_${DAYMAX}.csv done

echo "—-|—-" >>\

$OUTPUTDIR/output_typetoken_count_${POSTAG}_${DAYMIN}_${DAYMAX}.csv echo "$CNT|$WORDCNTSUM" >>\

$OUTPUTDIR/output_typetoken_count_${POSTAG}_${DAYMIN}_${DAYMAX}.csv

rm -f query.sql rm -f query2.sql

db_query_all_typetoken.sh: Dieses Skript fragt ebenso die Types und Tokens zwischen den einzelnen Zeitstempeln in der EXMARaLDA-Datei aus der Datenbank ab und schreibt die Ergebnisse in eine CSV-Datei. Die Abfrage der Datenbank an sich wird durch das oben angeführte Unterskript db_query_typetoken.sh ausgeführt. In diesem Skript wird nun einerseits die Altersgruppe, für die die Types und Tokens erfragt werden, eingegrenzt und andererseits die POS-Tags festgelegt, für die die entsprechenden Types und Tokens erfragt werden sollen. Es ist sehr sinnvoll, wenn nicht gar unerlässlich, an dieser Stelle im Skript die Types und die Tokens an Hand der POS-Tags zu identifizieren. Anderenfalls käme es an einigen Stellen der Analyse zu zweideutigen Ergebnissen und die Wörter sowie die Lemmata würden trotz ihrer Formgleichheit unterschiedlichen POS-Tags zugeordnet. In diesem Zusammenhang soll das Wort schwimmen mit dem dazugehörigen Lemma schwimmen betrachtet werden. In einer Aussage könnte es heißen „Wir schwimmen im See“ und in einer nächsten Aussage „Wir gehen heute mit dem Kindergarten zum Schwimmen“. In beiden Fällen wäre das Lemma schwimmen, aber die POS-Tags unterscheiden sich. Demnach istschwimmen in der ersten Aussage ein finites Vollverb (VVFIN),Schwimmenin der zweiten Aussage müsste streng genommen als Nomen (NN) getaggt werden (siehe dazu aber den Eintrag unter dem Stichwort Nomen in Abschnitt 4.1.7). Das Skript geht bei seiner Suche aus von den POS-Tags und listet am Ende sortiert nach den POS-Tags alle Types mit den dazugehörigen Tokens auf.

Eine Möglichkeit wäre es, nur die Types und Tokens abzufragen, die in der Kategorie VVINF und in der Altersgruppe 1709:1983 vorkommen. In diesem Fall stünde in der ersten Zeile DAYMINMAX=“1709:1983“ und in der folgenden Zeile POSTAGS=“VVINF“. Das Programm benötigt also die Information der POS-Tags für die Ausgabe der Types und Tokens, weil dies in den EXMARaLDA-Dateien sowie in der Datenbank so organisiert ist.

Skript: db_query_all_typetoken.sh

DAYMINMAX="1281:1495 1496:1708 1709:1983"

POSTAGS="ADJA ADJD ADV APPR APPRART ART CARD FM ITJ KOKOM KON KOUS NE NN PAV"

POSTAGS="$POSTAGS PDAT PDS PIAT PIDAT PIS PPER PPOSAT PPOSS PRELAT PRELS PRF"

POSTAGS="$POSTAGS PTKA PTKANT PTKNEG PTKVZ PTKZU PWAT PWAV PWS VAFIN VAIMP"

POSTAGS="$POSTAGS VAINF VAPP VMFIN VMINF VMPP VVFIN VVIMP VVINF VVIZU VVPP XY"

OUTPUT_DIR=../../../03_db_query_results/typetoken for d in $DAYMINMAX ; do

if [[ $d =~ ^(.*):(.*)$ ]]; then

DAYMIN=‘echo ${BASH_REMATCH[1]}‘

DAYMAX=‘echo ${BASH_REMATCH[2]}‘

for i in $POSTAGS ; do