Module in Perl

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