Folien - Index of
Download
Report
Transcript Folien - Index of
Korpuslinguistik für und mit
Computerlinguistik
Seminar SS 2003
Sitzung 1: UNIX, Perl
Gerold Schneider
UNIX: Grundbefehle
ls (list): Verzeichnisinhalt
cd (change dir.)
pwd (present working dir.)
cp (copy)
mv (move)
rm (remove)
rmdir (rm dir)
mkdir (make dir)
pico, nano, emacs (ed.s)
chmod (change mod.)
cat (catalog)
head, tail
more, less
|, <, > (pipe, in ,out)
man (manual pages)
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
2
UNIX: Linguists´ toolbox
grep, egrep ((extended) global regular expression)
tr (transform)
wc (word count)
sort
uniq
cut (cut columns)
paste (paste columns)
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
3
Bsp. 1: Wortliste, Konkordanz
Lexikon eines Textes: Text in 1-Wort-pro-Zeile Format
konvertieren, dann sortieren, Duplikate entfernen
cat my.txt | tr -s " " "\n" |sort | uniq
Häufigkeit mitzählen
cat my.txt | tr -s " " "\n" |sort | uniq -c
Preprocessing
cat my.txt | tr -s " " "\n" | tr -s "[A-Z]" "[a-z]" | tr -d
'[.,;:?\!"\(\)+-&=]' | sort | uniq -c
Konkordanz, Anzahl Types, Types per Token ?
Zipf interaktiv: http://users.info.unicaen.fr/~giguet/java/zipf.html
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
4
Bsp. 2: N-Gramme
Preprocessing
cat my.txt | tr -s " " "\n" | tr
"[.,:;'?\!]" > my.tmp
"[A-Z]" "[a-z]" | tr -d
Selber Text ohne erstes Wort
cat my.tmp | tail +2 > my.tmp2
Bigramme
paste -d" " my.tmp
my.tmp2 > bigramme
Liste der häufigsten Bigramme ?
Welche Wörter sind am häufigsten vor und nach der Präposition
„mit“ ?
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
5
Bsp. 3: Kontexte
Kontexte aller Wörter in einer bestimmten Fenstergrösse F
Vorgehen:
F-Gramme erstellen, analog zu Bigrammen
Herausschneiden der Kontextworte
cut
cut
cut
...
cut
-d" " -f 1,2
-d" " -f 1,3
-d" " -f 1,4
mygrams > kontexts
mygrams >> kontexts
mygrams >> kontexts
-d" " -f 1,F
mygrams >> kontexts
Lokale, syntaktische und semantische Distanz
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
6
Perl: Motivation
UNIX ist streng zeilenweise orientiert. Zeilensprünge können z.B.
nicht mittels tr entfernt werden.
tr erlaubt nur buchstabenweises Ersetzen, und die Ausgabe darf
nicht länger sein als die Eingabe. Dies verunmöglicht z.B. die
Erstellung einer Buchstabenkonkordanz.
UNIX ist nicht flexibel genug. Die gesammelten Daten stehen z.B.
nicht als Variablen/Listen/Hashes zur Verfügung
Mächtigere Werkzeug sind nötig: z.B. Perl
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
7
Perl: Zeilenfilterskelett
#!usr/bin/perl
## Pfad zum Perl-Interpreter
while(<>) {
## zeilenweise Daten einlesen
s/ersetzmich/durchdas/;
print;
## Ausgabe des Ergebnisses
}
Aufruf aus der Kommandozeile
cat myin.txt | perl myperlscript.pl > myout.txt
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
8
Perl: Umordungsschema
#!usr/bin/perl
## Pfad zum Perl-Interpreter
$/="\n";
## Datensatzbegrenzer
while(<>) {
## Datensatzweise Daten einlesen
($f1,$f2,$flast) = split(/\,/,$_); ## Felder lesen
$flast =~ s/\n//;
## chop Datensatzbegrenzer
$swapwas = $f1.$flast.$f2;
print "$swapwas\n"; ## Ausgabe des Ergebnisses
}
Beispiel:
prolog(wort,NN,12). prolog(wort,12,NN).
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
9
Perl: Geordnetes Einsammeln mit
Hashes: Wortliste
#!/usr/bin/perl
$/ = "";
#Datensatzbegrenzer: Paragraph
$* = 1;
#mehrzeilige Matches
while (<>){
s/-\n//g; tr/A-Z/a-z/;
#Trennzeichen weg,Kleinbuchstaben
@words = split (/\W*\s+\W*/,$_);
foreach $word (@words) {
$wordcount{$word}++;
}
}
foreach $word (sort keys (%wordcount)) {
printf "%20s,%d\n",$word,$wordcount{$word};
}
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
10
Perl: Geordnetes Einsammeln mit
Hashes: Bigramme
while(<>) {
s/^\s+//;
@words = split(/\W*\s+\W*/,$_);
for ($count=0;$count<=$#words-1;++$count) {
$wordcount{$words[$count]. " " .
$words[$count+1]}++;
}
}
foreach $wordpair (sort keys(%wordcount)) {
printf "%20s,%d\n",$wordpair,$wordcount{$wordpair};
}
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
11
Perl: Geordnetes Einsammeln mit
Hashes: Endungshäufigkeiten (3B.)
while(<>) {
s/^\s+//;
@words = split(/\s+/,$_);
for ($count=0;$count<=$#words;++$count) {
@chars = split(//,$words[$count]);
# split w/o sep.
if ($#chars > 1) { # at least 3 letters in this word
$ending{ $chars[$#chars-2] . " " .
$chars[$#chars-1] . " " .
$chars[$#chars]}++;
}
}
}
foreach $end (sort keys(%ending)) {
printf "%20s,%d\n",$end,$ending{$end};
}
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
12
Perl: Evaluation I
Gegeben sei die Ausgabenliste einer jeweils binären, maschinell
getroffenen Entscheidung E=[0|1], aligniert mit der
entsprechenden richtigen menschlichen Entscheidung („gold
standard“) G =[0|1], also eine Matrix {E,M}.
I IV
Accuracy=
E=0
E=1
I II III IV
G=0 {0,0} I {1,0} II
G=1 {0,1} III {1,1} IV
als 0 klassif.
2*Precision=
I
IV
I III II IV
2*Recall=
I
IV
I II III IV
als 1 klassifiziert
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
13
Perl: Evaluation II
while(<>) {
if /0\,0/{$caseI ++};
if /1\,0/{$caseII ++};
if /0\,1/{$caseIII++};
if /1\,1/{$caseIV ++};
}
I IV
Accuracy=
I II III IV
Precision=
I
IV
I III II IV
Recall=
I
IV
I II III IV
$accuracy = ...
$precision= ...
$recall
= ...
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
14
Perl: Aufgaben 4 + 12
(Microproject in Genf) I
Schreibmaschine mit Stemming-Spellchecker fürs Französische
Schritt 1: Einlesen eines grossen Textcorpus, ermitteln der häufisten
Endungen (siehe Endungsprogramm)
Schritt 2: Manuell morphologische Endungen ermitteln, Stemmingregeln
schreiben, stemmen:
$word
$word
$word
$word
$word
$word
$word
$word
$word
$word
$word
=~s/s$//;
=~s/ée$//;
=~s/ées$//;
=~s/es$//;
=~s/er$//;
=~s/ait$//;
=~s/able$//;
=~s/é$//;
=~s/elles$//;
=~s/elle$//;
=~s/ant$//;
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
15
Perl: Aufgaben 4 + 12
(Microproject in Genf) II
Schritt 3: Gestemmten Korpus einlesen in Hash,
Schreibmaschinenschleife durchaufen bis „STOP“ eingegeben wird.
Dann den Brief ausgeben und die eingegebenen Worte stemmen, ausser
sie sind im Ausnahmenlexikon (dans, sans, ...) und mit dem gestemmten
Korpus vergleichen.
if ($table{$word}) {
print "Le mot $word est accepté.\n";
}
elsif (!$table{$word}) {
print "Le mot $word n'est pas dans l'index, changez-le!\n";
Gerold Schneider: Korpuslinguistik für
Computerlinguistik, I
16