Thread Probleme mit Referenzen und komplexen Datenstrukturen
(8 answers)
Opened by Dingels at 2008-07-07 22:24
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 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 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 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 |