mosesdecoder/scripts/ems/support/report-experiment-scores.perl
2018-12-30 12:05:57 +00:00

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