SYSはシステムの出力、ANSはもともとの正解のラベルを意味する。またラベルには "ans", "sys" という文字列を使わないこと。またはソースを書き換えること。^[LABEL:SYS]\t[LABEL:ANS].*$
N これはひどいですね。 N とっとと失せろ! P すばらしいアイディアです。 P かっこいいよ P これはいいんじゃないっすか P 楽しい苦行。 M すごい!けど、ひどい! M うれしかなし。 - 電車に乗って移動中です。 - 鳩を見た
N N これはひどいですね。 - N とっとと失せろ! P P すばらしいアイディアです。 - P かっこいいよ N P これはいいんじゃないっすか M P 楽しい苦行。 M M すごい!けど、ひどい! - M うれしかなし。 - - 電車に乗って移動中です。 - - 鳩を見た
#!/usr/local/bin/perl use strict; use warnings; my %label; my %count; while (<>) { next if not /^([^\t\n]+)\t([^\t\n]+)(\t)/; my ($sys, $ans) = ($1, $2); $count{"ans"}{$ans}++; $count{$sys}{"sys"}++; $count{"ans"}{"sys"}++; $count{$sys}{$ans}++; $label{$sys} = $label{$ans} = 1; } my @labels = sort keys %label; my $lb_num = @labels; ### Count printf "|| %4s ||".(" %4s ||" x $lb_num)." %4s ||\n", "", @labels, "ans"; foreach my $l (@labels, "sys") { my @vals = map {$count{$_}{$l}||0} (@labels, "ans"); printf "|| %4s ||".(" %4d ||" x $lb_num)." %4d ||\n", $l, @vals; } print "\n"; ### Precision, Recall, F_1 my ($sum_pre, $sum_rec, $sum_f, $ok_res); printf "|| %4s || %6s || %6s || %6s ||\n", "", "Pre", "Rec", "F"; foreach my $l (@labels) { my $pre = ($count{$l}{$l}||0)/($count{$l}{"sys"}||1); my $rec = ($count{$l}{$l}||0)/($count{"ans"}{$l}||1); my $f = 2 * $pre * $rec / (($pre + $rec)||1); printf "|| %4s || %.4f || %.4f || %.4f ||\n", $l, $pre, $rec, $f; $sum_pre += $pre; $sum_rec += $rec; $sum_f += $f; $ok_res += $count{$l}{$l}||0; } printf "|| Ave || %.4f || %.4f || %.4f ||\n", $sum_pre/@labels, $sum_rec/@labels, $sum_f/@labels; print "\n"; printf "|| Classification Accuracy || %.4f ||\n", $ok_res/$count{"ans"}{"sys"}; print "\n";
% ./prerec.pl prerec.test.txt || || - || M || N || P || ans || || - || 2 || 0 || 0 || 0 || 2 || || M || 1 || 1 || 0 || 0 || 2 || || N || 1 || 0 || 1 || 0 || 2 || || P || 1 || 1 || 1 || 1 || 4 || || sys || 5 || 2 || 2 || 1 || 10 || || || Pre || Rec || F || || - || 0.4000 || 1.0000 || 0.5714 || || M || 0.5000 || 0.5000 || 0.5000 || || N || 0.5000 || 0.5000 || 0.5000 || || P || 1.0000 || 0.2500 || 0.4000 || || Ave || 0.6000 || 0.5625 || 0.4929 || || Classification Accuracy || 0.5000 ||
- | M | N | P | ans | |
- | 2 | 0 | 0 | 0 | 2 |
M | 1 | 1 | 0 | 0 | 2 |
N | 1 | 0 | 1 | 0 | 2 |
P | 1 | 1 | 1 | 1 | 4 |
sys | 5 | 2 | 2 | 1 | 10 |
Pre | Rec | F | |
- | 0.4000 | 1.0000 | 0.5714 |
M | 0.5000 | 0.5000 | 0.5000 |
N | 0.5000 | 0.5000 | 0.5000 |
P | 1.0000 | 0.2500 | 0.4000 |
Ave | 0.6000 | 0.5625 | 0.4929 |
Classification Accuracy | 0.5000 |