Thread Probleme mit Referenzen und komplexen Datenstrukturen (8 answers)
Opened by Dingels at 2008-07-07 22:24

Dingels
 2008-07-07 22:24
#111922 #111922
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Guten Abend allerseits,

ich bin der Computerlinguist, dem ihr vor einigen Wochen schon mal sehr geholfen habt. Noch mal ein großes Dankeschön. :-)

Nach einigen Aufgaben, die ich selbst lösen konnte, sitze ich diesmal seit Stunden vor einer Aufgabe und weiß nicht weiter. Es geht um die Verwendung von Referenzen und komplexen Datenstrukturen.

Wie das in der Theorie funktioniert, ist mir klar, aber in der Anwendung scheitert es. Ihr würdet mir sehr helfen, wenn ihr mir bei folgender Aufgabe helfen könntet. Ihr sollt nicht meine Hausaufgaben machen, aber zumindest einen Tipp, wie ich vorgehen sollte, könnt ihr doch bestimmt geben. Schon mal ein großes Danke dafür. :-)

Zur Aufgabe:
Ich habe ein Textkorpus mit annotierten Daten in folgender Form:

Quote
Ich PRO.Pers.Subst.1.Nom.Sg.*6 Ich
habe VFIN.Haben.1.Sg.Pres.Ind haben
einen ART.Indef.Acc.Sg.Masc eine
Menschen N.Reg.Acc.Sg.Masc Mensch
gesehen VPP.Full.Psp sehen
, SYM.Pun.Comma ,
welcher PRO.Inter.Subst.-3.Nom.Sg.Masc welche
schwankte VFIN.Full.1.Sg.Past.Ind schwanken
und CONJ.Coord.-2 und
umsank VFIN.Full.3.Sg.Past.Ind <unknown>
. SYM.Pun.Sent .


Links stehen die Wörter des Textes, in der Mitte das Tag (mit Infos für Kasus, Genus usw) und rechts das Lemma, also die Grundform des Wortes.

Die Aufgabe besteht darin, das Korpus so umzuformatieren, dass links die unterschiedlichen Worttypen (also nicht jedes einzelne Vorkommen eines Wortes) alphabetisch absteigend sortiert ausgegeben wird und rechts daneben die jeweiligen Tags, mit denen der Worttyp auftritt. Dabei sollen die Tags nach Häufigkeit sortiert werden. Das heißt, das häufigste Tag soll als erstes hinter dem Worttyp stehen, dann das zweithäufigste usw. Die Häufigkeiten können wir auch dahinterschreiben, sind aber nicht unbedingt notwendig, solange die Reihenfolge stimmt. Also so zB.:

Quote
ahnte VFIN.Full.3.Sg.Past.Ind (3) VFIN.Full.1.Sg.Past.Ind (2) VFIN.Full.1.Sg.Past.Subj (2)
als CONJ.Comp.-2 (196) CONJ.SubFin.-2 (61) APPR.Als(33) CONJ.Coord.Als(3)


Wir sollten uns dabei am Code eines Beispielprogramms unseres Dozenten orientieren, aber das hilft mir nicht wirklich weiter. Mein Code sieht bisher so aus (das Korpus ist schon in der Variablen $lexikon eingelesen):


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
my @zeilen_lexikon = split ("\n", $lexikon);

my $token;
my $tag;
my $lemma;

my %hash;

foreach my $zeile (@zeilen_lexikon) {
        # Die Leerzeichen zwischen Worttypen und Tags normalisieren: 
        $zeile =~ s/\s+/ /g;
        
        # Worttyp, Tag und Lemma voneinander trennen:
        if ($zeile =~ /([A-ZÄÖÜa-zäöüß0-9,;.:!?"'\(\)\[\]\{\}\-]+)\s([A-Z]+(\.[A-Za-z0-9\-\*]+){1,6})\s([A-ZÄÖÜa-zäöüß0-9,;.:!?"'\(\)\[\]\{\}\-]+)/) {
                $token = $1;
                $tag = $2;
                $lemma =$4;     
                
                # Ich zähle die  verschiedenen Kombinationen aus Worttyp und Tag:
                $hash{lc($token)}->{$tag}++;
        }
}

# Ausgabe
foreach my $token (sort keys %hash) {
        foreach my $tag (sort {${$hash{$token}}{$b} <=> ${$hash{$token}}{$a}} keys %{$hash{$token}}) {
                print $hash{$token} . "\t\t" . $tag . "\t\t" . $hash{$token}->{$tag} . "\n";
        }
}


Mit diesem Code weiß ich jetzt wenigstens schon mal, welcher Worttyp mit welchem Tag wie oft auftritt. Das ergibt z.B. folgenden Output:

Quote
alle PRO.Indef.Attr.-3.Acc.Pl.Fem 12
alle PRO.Indef.Attr.-3.Acc.Pl.Masc 7
alle PRO.Indef.Attr.-3.Nom.Pl.Fem 7
alle PRO.Indef.Attr.-3.Acc.Sg.Fem 5
alle PRO.Indef.Attr.-3.Acc.Pl.Neut 2
alle PRO.Indef.Attr.-3.Acc.Pl.*6 1
alle PRO.Indef.Attr.-3.Nom.Pl.*6 1


Jetzt weiß ich aber nicht, wie ich diese Ergebnisse in die richtige Form bringen soll. Meine Idee war, dass ich einen Hash baue, in dem die Worttypen als Schlüssel und die Tags als Werte gespeichert werden. Dabei sollen die Tags in Listen, also Arrays abgelegt werden. Das heißt, die Arrays sollen als Werte der Schlüssel fungieren. Aber leider scheint das nicht zu funktionieren. Ich hab schon zig Sachen ausprobiert, aber ich komme nicht zur Lösung.


Könnt ihr mir einen Hinweis geben? Vielen vielen Dank! :-)


Schönen Gruß,
Dingels

View full thread Probleme mit Referenzen und komplexen Datenstrukturen