mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-12-27 22:14:57 +03:00
185 lines
4.9 KiB
Perl
Executable File
185 lines
4.9 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
#
|
|
# This file is part of moses. Its use is licensed under the GNU Lesser General
|
|
# Public License version 2.1 or, at your option, any later version.
|
|
|
|
# $Id: report-experiment-scores.perl 407 2008-11-10 14:43:31Z philipp $
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
my $email;
|
|
|
|
my %TYPE;
|
|
$TYPE{"nist-bleu"} = "BLEU";
|
|
$TYPE{"multi-bleu"} = "BLEU";
|
|
$TYPE{"nist-bleu-c"} = "BLEU-c";
|
|
$TYPE{"multi-bleu-c"}= "BLEU-c";
|
|
$TYPE{"ibm-bleu"} = "IBM";
|
|
$TYPE{"ibm-bleu-c"} = "IBM-c";
|
|
$TYPE{"meteor"} = "METEOR";
|
|
$TYPE{"bolt-bleu"} = "BLEU";
|
|
$TYPE{"bolt-bleu-c"} = "BLEU-c";
|
|
$TYPE{"bolt-ter"} = "TER";
|
|
$TYPE{"bolt-ter-c"} = "TER-c";
|
|
$TYPE{"multi-bleu-detok"} = "BLEU";
|
|
$TYPE{"multi-bleu-c-detok"}= "BLEU-c";
|
|
|
|
$TYPE{"sacre-bleu"} = "BLEU";
|
|
$TYPE{"sacre-bleu-c"}= "BLEU-c";
|
|
|
|
my %SCORE;
|
|
my %AVERAGE;
|
|
foreach (@ARGV) {
|
|
if (/^email='(\S+)'/) {
|
|
$email = $1;
|
|
}
|
|
}
|
|
foreach (@ARGV) {
|
|
if (/^set=(\S+),type=(\S+),file=(\S+)$/) {
|
|
&process($1,$2,$3);
|
|
}
|
|
}
|
|
foreach my $set (sort keys %SCORE) {
|
|
my $score = $SCORE{$set};
|
|
chop($score);
|
|
print "$set: $score\n";
|
|
}
|
|
if ((scalar keys %SCORE) > 1) {
|
|
print "avg:";
|
|
my $first = 1;
|
|
foreach my $type (sort keys %AVERAGE) {
|
|
print " ;" unless $first; $first = 0;
|
|
printf " %.02f $TYPE{$type}",$AVERAGE{$type}/(scalar keys %SCORE);
|
|
}
|
|
print "\n";
|
|
}
|
|
|
|
sub process {
|
|
my ($set,$type,$file) = @_;
|
|
$SCORE{$set} .= "; " if defined($SCORE{$set});
|
|
if (! -e $file) {
|
|
print STDERR "ERROR (score $type for set $set): file '$file' does not exist!\n";
|
|
}
|
|
elsif ($type eq 'nist-bleu' || $type eq 'nist-bleu-c') {
|
|
$SCORE{$set} .= &extract_nist_bleu($file,$type)." ";
|
|
}
|
|
elsif ($type eq 'ibm-bleu' || $type eq 'ibm-bleu-c') {
|
|
$SCORE{$set} .= &extract_ibm_bleu($file,$type)." ";
|
|
}
|
|
elsif ($type eq 'multi-bleu' || $type eq 'multi-bleu-c'
|
|
|| $type eq 'multi-bleu-detok' || $type eq 'multi-bleu-c-detok') {
|
|
$SCORE{$set} .= &extract_multi_bleu($file,$type)." ";
|
|
}
|
|
elsif ($type eq 'sacre-bleu' || $type eq 'sacre-bleu-c') {
|
|
$SCORE{$set} .= &extract_sacre_bleu($file,$type)." ";
|
|
}
|
|
elsif ($type eq 'meteor') {
|
|
$SCORE{$set} .= &extract_meteor($file,$type)." ";
|
|
}
|
|
elsif ($type =~ /^bolt-(.+)$/) {
|
|
$SCORE{$set} .= &extract_bolt($file,$1)." ";
|
|
}
|
|
}
|
|
|
|
sub extract_sacre_bleu {
|
|
my ($file,$type) = @_;
|
|
my ($bleu,$ratio);
|
|
#print STDERR "type=$type, file=$file \n";
|
|
|
|
foreach (my $line = `cat $file`) {
|
|
chomp($line);
|
|
#print STDERR "line=$line \n";
|
|
my @toks = split(" ", $line);
|
|
$bleu = $toks[2];
|
|
$ratio = $toks[9];
|
|
}
|
|
my $output = sprintf("%.02f ",$bleu);
|
|
$output .= sprintf("(%.03f) ",$ratio) if $ratio;
|
|
|
|
$AVERAGE{"sacre-bleu"} += $bleu;
|
|
|
|
return $output.$TYPE{$type};
|
|
}
|
|
|
|
sub extract_nist_bleu {
|
|
my ($file,$type) = @_;
|
|
my ($bleu,$ratio);
|
|
foreach (`cat $file`) {
|
|
$bleu = $1*100 if /BLEU score = (\S+)/;
|
|
$ratio = int(1000*$1)/1000 if /length ratio: (\S+)/;
|
|
}
|
|
if (!defined($bleu)) {
|
|
print STDERR "ERROR (extract_nist_bleu): could not find BLEU score in file '$file'\n";
|
|
return "";
|
|
}
|
|
my $output = sprintf("%.02f ",$bleu);
|
|
$output .= sprintf("(%.03f) ",$ratio) if $ratio;
|
|
|
|
$AVERAGE{$type} += $bleu;
|
|
|
|
return $output.$TYPE{$type};
|
|
}
|
|
|
|
sub extract_ibm_bleu {
|
|
my ($file,$type) = @_;
|
|
my ($bleu,$ratio);
|
|
foreach (`cat $file`) {
|
|
$bleu = $1*100 if /BLEUr\dn4c?,(\S+)/;
|
|
$ratio = int(1000*(1/$1))/1000 if /Ref2SysLen,(\S+)/;
|
|
}
|
|
if (!$bleu) {
|
|
print STDERR "ERROR (extract_ibm_bleu): could not find BLEU score in file '$file'\n";
|
|
return "";
|
|
}
|
|
my $output = sprintf("%.02f ",$bleu);
|
|
$output .= sprintf("(%.03f) ",$ratio) if $ratio;
|
|
|
|
$AVERAGE{$type} += $bleu;
|
|
|
|
return $output.$TYPE{$type};
|
|
}
|
|
|
|
sub extract_multi_bleu {
|
|
my ($file,$type) = @_;
|
|
my ($bleu,$ratio);
|
|
foreach (`cat $file`) {
|
|
$bleu = $1 if /BLEU = (\S+), /;
|
|
$ratio = $1 if / ration?=(\S+),/;
|
|
}
|
|
my $output = sprintf("%.02f ",$bleu);
|
|
$output .= sprintf("(%.03f) ",$ratio) if $ratio;
|
|
|
|
$AVERAGE{"multi-bleu"} += $bleu;
|
|
|
|
return $output.$TYPE{$type};
|
|
}
|
|
|
|
sub extract_bolt {
|
|
my ($file,$type) = @_;
|
|
my $score;
|
|
foreach (`cat $file`) {
|
|
$score = $1 if $type eq 'bleu' && /Lowercase BLEU\s+([\d\.]+)/;
|
|
$score = $1 if $type eq 'bleu-c' && /Cased BLEU\s+([\d\.]+)/;
|
|
$score = $1 if $type eq 'ter' && /Lowercase TER\s+([\d\.]+)/;
|
|
$score = $1 if $type eq 'ter-c' && /Cased TER\s+([\d\.]+)/;
|
|
}
|
|
my $output = sprintf("%.02f ",$score*100);
|
|
$AVERAGE{"bolt-".$type} += $score*100;
|
|
return $output.$TYPE{"bolt-".$type};
|
|
}
|
|
sub extract_meteor {
|
|
my ($file,$type) = @_;
|
|
my ($meteor, $precision);
|
|
foreach (`cat $file`) {
|
|
$meteor = $1*100 if /Final score:\s*(\S+)/;
|
|
$precision = $1 if /Precision:\s*(\S+)/;
|
|
}
|
|
my $output = sprintf("%.02f ",$meteor);
|
|
$output .= sprintf("(%.03f) ",$precision) if $precision;
|
|
$AVERAGE{"meteor"} += $meteor;
|
|
|
|
return $output.$TYPE{$type};
|
|
|
|
}
|