0

このポーターステマーをチェックしていました。以下では、最初の行を変更する必要があると述べています。正確には、すべてを試しましたが、ステマーは機能しません。どのような例がよいでしょうか。

#!/usr/local/bin/perl -w
#
# Perl implementation of the porter stemming algorithm
# described in the paper: "An algorithm for suffix stripping, M F Porter"
# http://www.muscat.com/~martin/stem.html
#
# Daniel van Balen (vdaniel@ldc.usb.ve)
#
# October-1999
#
# To Use:
#
# Put the line "use porter;" in your code. This will import the subroutine 
# porter into your current name space (by default this is Main:: ). Make 
# sure this file, "porter.pm" is in your @INC path (it includes the current
# directory).
# Afterwards use by calling "porter(<word>)" where <word> is the word to strip.
# The stripped word will be the returned value.
#
# REMEMBER TO CHANGE THE FIRST LINE TO POINT TO THE PATH TO YOUR PERL 
# BINARY
#

Aコードとして、私は次のことを書いています:

use Lingua::StopWords qw(getStopWords);
use Main::porter;
my $stopwords = getStopWords('en');

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

    chdir("c:/perl/input");
    @files = <*>;
    foreach $file (@files) 
      {
        open (input, $file);

        while (<input>) 
          {
            open (output,">>c:/perl/normalized/".$file);
        chomp;
        porter<$_>;
        for my $stop (@stopwords) 
        {
        s/\b\Q$stop\E\b//ig;
        }
        $_ =~s/<[^>]*>//g;
        $_ =~ s/[[:punct:]]//g;
        print output "$_\n";

          }

       }
    close (input);
    close (output);

コードは、何もステミングしていないことを除いて、エラーを出しません!!!

4

1 に答える 1

4

そのコメント ブロックは間違ったアドバイスでいっぱいです。

#! .pm ファイルの行は効果がありません。よくある間違いです。#! line は、ファイルをコマンドラインプログラムとして実行する場合にのみ、プログラムを実行するインタープリターを Unix に指示します。

./somefile                # uses #! to determine what to run somefile with
/usr/bin/perl somefile    # runs somefile with /usr/bin/perl regardless of #!

#! 行は、モジュール、.pm ファイルで何もしませんuse。その時点で Perl はすでに実行されています。行はコメントにすぎません。

2 つ目の問題は、デフォルトの名前空間が .xml ではmainないことMainです。ケーシングは重要です。

コードに移ってuse Main::porter;もうまくいきません。である必要がありますuse porter。のようなエラー メッセージが表示されるはずですCan't locate Main/porter.pm in @INC (@INC contains: ...)。そのコードが実行される場合、おそらく porter.pm をMain/ディレクトリに移動しましたか? 移動すると、ポーター機能のインポートが混乱します。

porter<$_>;「ファイルハンドル $_ から行を読み取って、それをポーターに渡してください」と言います。$_ はファイルハンドルではなく、今開いたファイルの行です。porter($_)行をポーター関数に渡したいとします。警告をオンにすると (use warningsスクリプトの先頭に追加)、Perl はそのような間違いについて警告します。

おそらくポーターからの戻り値で何かをしたいと思うでしょう。そうでなければ、本当に何もしません。 my @whatever_porter_returns = porter($_).

おそらく 1 つ以上のchdirまたはopenが暗黙のうちに失敗したため、プログラムに入力がない可能性があります。残念ながら、Perl はこれがいつ発生したかを通知しません。確認する必要があります。通常、関数の後に を追加しor die $!て、エラーをチェックします。これは忙しい作業であり、多くの場合忘れがちです。代わりに、システムコールが成功または失敗したuse autodie場合に自動的にエラーを生成することができます。chdiropen

それを修正すると、コードが機能するか、少なくとも有用なエラーメッセージが生成されるはずです。

最後に、CPAN には多くのステミング モジュールがあり、ドキュメント、テスト、更新などで見つけたものよりも高品質である可能性があります。 Lingua::StemText::Englishは特に porter アルゴリズムを使用します。あなたはそれらを試してみたいかもしれません。

于 2012-11-13T16:40:38.623 に答える