Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12893[/thread]

Problem mit einem Hash of Hashes

Leser: 2


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Dingels
 2008-12-11 19:09
#117095 #117095
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe ein annotiertes Textkorpus vorliegen. In jeder Zeile steht ein einziges Wort, dahinter ein Wortarten-Tag.

Mit einem Hash of Hashes habe ich jetzt gezählt, welches Wort mit welchem Wortarten-Tag wie häufig vorkommt.

Die Struktur dieses Hashs sieht folgendermaßen aus:

$VAR1 = 'Haus';
$VAR2 = {
'VNP' => 3,
'NE' => 17,
'NN' => 4
};
$VAR3 = 'Garten';
$VAR4 = {
'NE' => 12,
'NN' => 35
};
$VAR5 = 'Auto';
$VAR6 = {
'NGB' => 465,
'VP' => 142,
'MO' => 1,
'VE' => 7,
'NN' => 2
};

Dann habe ich den äußeren Hash nach dem Alphabet sortiert und die inneren Hashes nach Häufigkeit absteigend sortiert. Dann hab ich die sortierten Ergebnisse Zeile für Zeile in ein Array geschrieben.

Die Struktur des Arrays sieht also jetzt folgendermaßen aus :

$VAR1 = 'Auto NGB 465';
$VAR2 = 'Auto VP 142';
$VAR3 = 'Auto VE 7';
$VAR4 = 'Auto NN 2';
$VAR5 = 'Auto MO 1';
$VAR6 = 'Garten NN 35';
$VAR7 = 'Garten NE 12';
$VAR8 = 'Haus NE 17';
$VAR9 = 'Haus NN 4';
$VAR10 = 'Haus VNP 3';

Jetzt möchte ich zu jedem Worttyp aber nur den Eintrag im Array behalten, der die höchste Häufigkeit besitzt. D.h. zum Worttyp 'Auto' möchte ich nur die erste Zeile behalten, zum Worttyp 'Garten' nur die erste Zeile und zum Worttyp 'Haus' nur die erste Zeile.

Folgendes soll also später nur noch im Array stehen:

$VAR1 = 'Auto NGB 465';
$VAR2 = 'Garten NN 35';
$VAR3 = 'Haus NE 17';


Meine Frage:
Wie schaffe ich es, pro Worttyp alle Einträge außer den mit dem höchsten Häufigkeitswert zu entfernen? Geht das nur im Array oder auch schon in dem Hash? Wenn ja, wie? Ich hab schon zig Sachen ausprobiert, aber es klappt nichts.

Habt ihr vielleicht eine Idee?

Vielen Dank. :)


MfG,
Dingels
lichtkind
 2008-12-11 19:48
#117096 #117096
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
ich seh in deinem post nirgend einen HoH. Bist du dir sicher das du sowas benutzt?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Dingels
 2008-12-11 19:51
#117097 #117097
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
lichtkind+2008-12-11 18:48:27--
ich seh in deinem post nirgend einen HoH. Bist du dir sicher das du sowas benutzt?


Ja, das tue ich. Hab die Struktur mit dem Modul Data::Dumper ausgegeben. Um es etwas klarer zu machen: So sieht die Struktur aus:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my %hash = ("Haus" => {"NN"  => 4, 
"VNP" => 3,
"NE" => 17
},

"Garten" => {"NN" => 35,
"NE" => 12
},

"Auto" => {"NN" => 2,
"VE" => 7,
"MO" => 1,
"NGB" => 465,
"VP" => 142
}
);
lichtkind
 2008-12-11 20:01
#117098 #117098
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
dumper ist staek veraltet, es gibt yaml denter ,etc.

zu deiner frage. du willst jetzt alle "NN" einträge addieren oder?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Dingels
 2008-12-11 20:04
#117099 #117099
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
lichtkind+2008-12-11 19:01:08--
dumper ist staek veraltet, es gibt yaml denter ,etc.

zu deiner frage. du willst jetzt alle "NN" einträge addieren oder?


Nein. Schade, hab scheinbar mein Anliegen nicht verständlich formuliert.

Also nochmal:

Im Array oben habe ich jetzt alle Kombination zwischen Schlüssel und Werten stehen, wie man oben sehen kann. Ich möchte in dem Array zu jedem Worttyp (Haus, Garten und Auto) alle Einträge bis auf den allerersten löschen. Denn ich brauche nur die Einträge mit den jeweils größten Worttyp-Tag-Häufigkeiten.

Oder, anders ausgedrückt, da die Einträge ja schon sortiert sind:
Ich möchte zu jedem Worttyp nur den jeweils ersten Eintrag im Array behalten. Alles andere soll gelöscht werden.

Jetzt verständlich? Hab doch oben eigentlich alles dargelegt.

Gruß,
Dingels
pq
 2008-12-11 20:34
#117100 #117100
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Data::Dumper ist prima, und man kann sich dauf verlassen, dass es überall installiert ist.
Bei mir ist es automatisch in jedem Modul drin, weil ichs früher oder später zum debuggen brauche.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2008-12-11 20:36
#117101 #117101
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Dingels: mach mal statt
print Dumper @array;
print Dumper %hash;

das hier:
print Dumper \@array;
print Dumper \%hash;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Dingels
 2008-12-11 20:40
#117102 #117102
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
pq+2008-12-11 19:36:19--
Dingels: mach mal statt
print Dumper @array;
print Dumper %hash;

das hier:
print Dumper \@array;
print Dumper \%hash;


Mist, ja ich hab den Backslash für die Referenzen vergessen. Danke für den Hinweis.

Aber ist ja jetzt auch irrelevant, ich hab ja alle wichtigen Strukturen jetzt gepostet.

Hat denn jetzt jemand eine Idee, wie ich dieses im Grunde banale Problem lösen kann? Bitte lasst mich nicht dumm sterben. xD
pq
 2008-12-11 20:48
#117103 #117103
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my %max;
for my $type (keys %hash) {
    my $values = $hash{$type};
    my $max = (sort {
        $values->{$b} <=> $values->{$a}
    } keys %$values )[0];
    $max{$type} = "$max $values->{$max}";
}
print Dumper \%max;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Dingels
 2008-12-11 21:13
#117105 #117105
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
@ pq

Ich danke dir. Die Lösung ist ja tatsächlich sehr banal. Ich wusste zwar, dass Hashes intern als Arrays verarbeitet werden, aber dass man beim Sortieren eines Hashs direkt einen Index angeben kann, darauf wär ich nie gekommen. ^^

Vielen vielen Dank. Mein Problem ist gelöst.


Schönen Abend noch. :)
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-12-11 19:09.