Hallo,
Ich habe folgendes Problem:
für meinen Programm habe ich einen Module besorgt Lingua::Stem, dieser arbeitet allerdings mit Arrays. Wie kann man diesen an einen Hash anwenden?
z.B.
%input = (‚class of drugs‘ => ‚medicine‘,
‚brain functions‘ => ‚medicine‘,
‚types of dementia‘ => medicine’,
‚cause of dementia‘ => ‚medicine‘);
das möchte ich als output bekommen:
%output:
class of drug => medicine
brain function => medicine
type of dementia => medicine
cause of dementia => medicine
Perl Code für @Array
#!/usr/local/bin/perl -w
use lib „/home/knoppix/MA/perl-lib/Lingua-Stem-0.83/lib“;
use Lingua::Stem;
use strict;
my(@stems, $stem, @forms);
while(){
chomp;
push @forms,$_;
}
@stems = stem(@forms);
foreach $stem (@stems) {
print „$stem\n“;
}
exit(0);
this is a stem() we define ourselves
it takes an array and returns an array - inefficient but easy to use
sub stem {
my(@forms) = @_;
my(@stems, $refToArrayOfStems);
there is another stem() sitting in Lingua::Stem
$refToArrayOfStems = Lingua::Stem::stem(@forms); # we do not know references yet
@stems = @{$refToArrayOfStems}; # so I’ll explain this scary line
only when you ask me
return(@stems);
}
Gruss,
Perl Anfänger : Krokodil Gena
Hallo,
Ich habe folgendes Problem:
für meinen Programm habe ich einen Module besorgt
Lingua::Stem, dieser arbeitet allerdings mit Arrays. Wie kann
man diesen an einen Hash anwenden?
z.B.
%input = (‚class of drugs‘ => ‚medicine‘,
‚brain functions‘ => ‚medicine‘,
‚types of dementia‘ => medicine’,
‚cause of dementia‘ => ‚medicine‘);
das möchte ich als output bekommen:
%output:
class of drug => medicine
brain function => medicine
type of dementia => medicine
cause of dementia => medicine
Du musst die keys des Arrays durch stem() schicken:
use strict;
use warnings;
use Lingua::Stem qw(stem);
my %input = (
'class of drugs' =\> 'medicine',
'brain functions' =\> 'medicine',
'types of dementia' =\> medicine',
'cause of dementia' =\> 'medicine',
);
my %output;
@output{ @{ stem(keys %input) } } = values %input;
Ich benutze hier am Ende eine hash slice, die ist hier erklärt:
http://perldoc.perl.org/perldata.html
Das ganze wird dadurch ein wenig ekliger, dass stem() eine Referenz auf ein Array zurückgibt und keine Liste, sonst hätte man einfach
@output{ stem(keys %input) } = values %input;
schreiben können.
Grüße,
Moritz
Hallo Moritz!
Danke für den Tipp, aber lösst mein Problem nicht ganz:
Du musst die keys des Arrays durch stem() schicken:
use strict;
use warnings;
use Lingua::Stem qw(stem);
my %input = (
‚class of drugs‘ => ‚medicine‘,
‚brain functions‘ => ‚medicine‘,
‚types of dementia‘ => medicine’,
‚cause of dementia‘ => ‚medicine‘,
);
my %output;
@output{ @{ stem(keys %input) } } = values %input;
Das Programm macht schon was man erwartet nur der Haken ist der, das mein Value/Key aus mehreren Wörtern besteht, man muss noch die Einträge in $value =~ /\w+/ zerlegen und einzeln „stemmen“.
Das was ich jetzt bekomme, passt noch nicht ganz:
Input => Output
diseases => diseas # Einzelne Wörter werden „stemmted“
class of drugs => class of drugs # class of drug
causes of dementia => causes of dementia # cause of dementia
brain functions => brain functions # brain function
types of dementia => types of dementia # type of dementia
Gruss,
Krokodil Gena.
Hallo,
Das Programm macht schon was man erwartet nur der Haken ist
der, das mein Value/Key aus mehreren Wörtern besteht, man muss
noch die Einträge in $value =~ /\w+/ zerlegen und einzeln
„stemmen“.
Na dann probier das doch mal.
Wo hakts?
Grüße,
Moritz