1

英語のテキストをステミングしようとしています。多くのフォーラムを読みましたが、明確な例が見つかりませんでした。Text::ENGlish を使用するのと同じようにポーター ステマーを使用しています。これは私が得た距離です:

    use Lingua::StopWords qw(getStopWords);
    my $stopwords = getStopWords('en');
    use Text::English;

    @stopwords = grep { $stopwords->{$_} } (keys %$stopwords);

    chdir("c:/Test Facility/input");
    @files = <*>;

    foreach $file (@files) 
      {
        open (input, $file);

        while (<input>) 
          {
            open (output,">>c:/Test Facility/normalized/".$file);
        chomp;
        for my $w (@stopwords) 
        {
        s/\b\Q$w\E\b//ig;
        }
        $_ =~s/<[^>]*>//g;
        $_ =~ s/[[:punct:]]//g;
        ##What should I write here to apply porter stemming using Text::English##
        print output "$_\n";

          }

       }
    close (input);
    close (output);
4

1 に答える 1

1

次のコードを次のように実行します。

perl stemmer.pl /usr/lib/jvm/java-6-sun-1.6.0.26/jre/LICENSE

次のような出力が生成されます。

operat system distributor licens java version sun microsystems inc sun willing to license java platform standard edition developer kit jdk

ストップワード以外に、長さが 1 で数値の文字列が削除されることに注意してください。

#!/usr/bin/env perl
use common::sense;

use Encode;
use Lingua::Stem::Snowball;
use Lingua::StopWords qw(getStopWords);
use Scalar::Util qw(looks_like_number);

my $stemmer = Lingua::Stem::Snowball->new(
    encoding    => 'UTF-8',
    lang        => 'en',
);

my %stopwords = map {
    lc
} keys %{getStopWords(en => 'UTF-8')};

local $, = ' ';
say map {
    sub {
        my @w =
            map {
                encode_utf8 $_
            } grep {
                length >= 2
                and not looks_like_number($_)
                and not exists $stopwords{lc($_)}
            } split
                /[\W_]+/x,
                shift;

        $stemmer->stem_in_place(\@w);

        map {
            lc decode_utf8 $_
        } @w
    }->($_);
} <>;
于 2012-11-13T20:27:33.740 に答える