4

我想使用 ROUGE 分析我的摘要。到目前为止,我已经编写了一个 perl 脚本来在命令行上运行 ROUGE,这就是我目前所拥有的:

#!/usr/bin/perl

use warnings;
use Cwd;
$curdir=getcwd;
$ROUGE="/ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e /data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a DUC2002ROUGE.in.26.spl.xm> /sample-output/salam.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);

但是我收到此错误:

系统找不到指定路径

4

7 回答 7

5

系统找不到指定路径

您的脚本路径错误,/ROUGE-1.5.5.pl不存在,因此调用的 shellsystem()正在抱怨。

于 2013-10-13T13:35:00.770 回答
5

问题是这/ROUGE-1.5.5.pl是一个绝对文件路径,表示该文件位于根目录中。您说它与正在运行的 Perl 程序位于同一目录中,因此您需要./ROUGE-1.5.5.pl或只是ROUGE-1.5.5.pl

该程序解决了问题并填补了一些漏洞。我已经使用abs_pathfrom 函数Cwd将程序、数据、输入和输出名称转换为绝对路径;执行隐式检查文件是否存在,并让我避免chdir只会混淆事物的情况。我还添加了一个粗略的诊断来system提示它失败的原因

#!/usr/bin/perl

use strict;
use warnings 'all';

use Cwd qw/ getcwd abs_path /;

my $ROUGE  = abs_path('ROUGE-1.5.5.pl');

my $data   = abs_path('data');
my $input  = abs_path('sample-test/DUC2002ROUGE.in.26.spl.xm');
my $output = abs_path('sample-output/salam.out');

my $cmd = qq{"$ROUGE" -e "$data" -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a "$input" > "$output"};
print $cmd, "\n";

system($cmd) == 0 or die qq{system() failed: $?};
于 2016-01-18T17:48:56.103 回答
2

您有一些错误的文件路径和一些拼写错误,但这有效:

#!/usr/bin/perl

use warnings;
use Cwd;
$curdir=getcwd;
$ROUGE="../ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a DUC2002-ROUGE.in.26.spl.xml > ../sample-output/salam.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);

但是,当您可以在命令行中键入以下内容时,为什么要使用 perl 来编写脚本来运行 ROUGE:

perl ROUGE-1.5.5.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a sample-test/DUC2002-ROUGE.in.26.spl.xml > sample-output/salam.out

于 2015-03-26T00:26:12.333 回答
2

如果您希望将 ROUGE 输出存储在文件中而不是打印到命令行或终端,我相信我有答案。

您不需要 perl 脚本,您可以从命令行运行 ROUGE。要输出到文件,请添加> results.txt到命令的末尾。

运行这样的东西会输出到命令行:

perl ROUGE-1.5.5.pl -e data -n 4 -w 1.2 -m  -2 4 -u -c 95 -r 1000 -f A -p 0.5 -t 0 -a -d settings.xml

而这将输出到名为 results.txt 的文件中:

perl ROUGE-1.5.5.pl -e data -n 4 -w 1.2 -m  -2 4 -u -c 95 -r 1000 -f A -p 0.5 -t 0 -a -d settings.xml > results.txt

这个问题帮助了我:如何将控制台输出重定向到文本文件

于 2015-03-19T00:06:17.670 回答
1

我同意关于绝对路径与相对路径的其他答案。我也同意当你可以将 Perl 作为一个简单的命令行参数时为什么使用 Perl 的问题。然而,我要扭转这种局面,说,如果你打算使用 Perl 来做这件事,那就让它有机会记录你正在做的事情,以便将来更容易调整,比如:

use strict;
use warnings;
use Cwd;

my $curdir = getcwd;

use constant ROUGE => '../ROUGE-1.5.5.pl';

my @OPTIONS = ('-2', '-1', '-U', # use skip-bigrams and compute unigram scores (not sure -1 is valid)
    '-e' => '../data', # data directory
    '-c' => 95, # confidence interval (default)
    '-r' => 1000, # sampling points (default)
    '-n' => 4, # max-ngram length
    '-w' => 1.2, # LCS weight
    '-a' => 'DUC2002-ROUGE.in.26.spl.xml'
);

if (chdir("sample-test")) {

    my $cmd = join(" ", ROUGE, @OPTIONS, "> ../sample-output/salam.out");
    print STDERR $cmd, "\n";
    system($cmd);

    chdir($curdir);
}
于 2016-01-21T18:37:35.050 回答
-1

我认为您想在 windows 中使用 rouge 评估summerization。我建议您使用ubuntulinux 版本并安装 rouge 并使用此命令获取输出:

我的意思是将此文件保存为 perl 文件并在 linux 的终端中执行此文件

 #!/usr/bin/perl -w
use Cwd;
$curdir=getcwd;
$ROUGE="../ROUGE-1.5.5.pl";
chdir("sample-test");
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a -m ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a -m -s ROUGE-test.xml > ../sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM -z SIMPLE DUC2002-BE-F.in.26.lst 26 > ../sample-output/DUC2002-BE-F.in.26.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM DUC2002-BE-F.in.26.simple.xml 26 > ../sample-output/DUC2002-BE-F.in.26.simple.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM -z SIMPLE DUC2002-BE-L.in.26.lst 26 > ../sample-output/DUC2002-BE-L.in.26.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -3 HM DUC2002-BE-L.in.26.simple.xml 26 > ../sample-output/DUC2002-BE-L.in.26.simple.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -n 4 -z SPL DUC2002-ROUGE.in.26.spl.lst 26 > ../sample-output/DUC2002-ROUGE.in.26.spl.lst.out";
print $cmd,"\n";
system($cmd);
$cmd="$ROUGE -e ../data -n 4 DUC2002-ROUGE.in.26.spl.xml 26 > ../sample-output/DUC2002-ROUGE.in.26.spl.out";
print $cmd,"\n";
system($cmd);
chdir($curdir);
于 2016-01-17T14:41:38.233 回答
-4
  1. 安装 perl http://www.activestate.com/activeperl

  2. 如果在 Windows 上,则从 dos 命令运行

    perl perlscript.pl

于 2013-10-13T13:26:55.350 回答