Perl Porter Stemmer

时间:2012-11-13 16:19:56

标签: perl file

我正在检查这个搬运工。下面他们说我应该改变我的第一行。到底是什么我尝试了所有的东西,但干扰器不起作用。这可能是一个很好的例子吗?

#!/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
#

作为一个代码我写的是:

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);

代码没有错误,除非它不会产生任何错误!

1 个答案:

答案 0 :(得分:4)

该评论块充满了错误的建议。

<#> A#! .pm文件中的行无效。这是一个常见的错误。 #! line告诉Unix哪个解释器用运行程序当且仅当将文件作为命令行程序运行时。

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

#! line在use的模块,.pm文件中不执行任何操作。 Perl已经在那个时候运行了。这条线只不过是一条评论。

第二个问题是您的默认命名空间是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($_)

可能您的chdiropen中的一个或多个已经无声地失败,因此您的程序可能没有任何输入。不幸的是,Perl不会让你知道发生这种情况时,你必须检查。通常你add an or die $! after the function来检查错误。这是繁忙的工作,通常会忘记,而use autodie如果chdiropen等系统调用失败,则会自动产生错误。

通过修复这些内容,您的代码应该可以正常工作,或至少产生有用的错误消息。

最后,有许多stemming modules on CPAN的质量可能高于您在文档,测试和更新中找到的质量等等。 Lingua::StemText::English专门使用移植器算法。你可能想给那些人一个机会。