📄 align.pl
字号:
#!/usr/bin/perl# 赖豺ファイル(*.ref)と簿棱ファイル(*.hyp)に滦して、# DPを蝗って帽胳のアラインメントをとる。# オプション -u で帽疤(妨轮燎or矢机)を回年、# オプション -f で山淡(戳机かな寒じり or カタカナ)を回年する。# 妨轮燎帽疤でアラインメントを艰る眷圭、剩圭胳借妄を乖なうかどうかを# オプション -c で回年する。# なお、オプション -r の稿に赖豺ファイルを回年する。## 蝗脱恕# % align.pl \# -u {morpheme|char} \# [-c] \# -f {kanji|kana} \# -r reference_file \# hypothesis_file \# > alignment_file# 2003/06/11 CM 滦炳# オプション借妄require "getopts.pl";&Getopts('hu:cf:r:');if ($opt_h || !$opt_u || !$opt_f || !$opt_r) { &usage;}if ($opt_u ne "morpheme" && $opt_u ne "char") { &usage;}if ($opt_f ne "kanji" && $opt_f ne "kana") { &usage;}if ($opt_u eq "char" && $opt_c) { &usage;}# 赖豺ファイルを粕み哈んで、息鳞芹误に掐れる。open(REFER, "nkf -e $opt_r |");while (<REFER>) { chop; if (/^[a-zA-Z0-9\-]+$/) { $r_id = $_; } else { $refer{$r_id} = $_; }}$h_id = "";@idref = ();while (<>) { chop; if (/^[a-zA-Z0-9\-]+$/) { if ($h_id ne "") { print "\n"; } # 滦炳する赖豺帽胳误を@referに掐れる。 $h_id = $_; @refer = split(' ', $refer{$h_id}); } elsif (! /^cmscore/) { # 簿棱帽胳误を@resultに掐れる。 @result = split(' ', $_); # alignmentを悸乖して冯蔡を叫蜗する &process_align(); } elsif (/^cmscore:\s+(.*)$/) { # CMスコアを叫蜗 $cmalpha = 0; @cmscore = split(/[ \t\n]+/, $1); &output_cm(); } elsif (/^cmscore\[(.*)\]:\s+(.*)$/) { # CMスコアを叫蜗(剩眶) $cmalpha = $1; @cmscore = split(/[ \t\n]+/, $2); &output_cm(); }}sub process_align { &ignore_pause; if ($opt_f eq "kanji") { # @rfer、@resultを戳机かな寒じり山淡の误にする。 &mk_kanji_array; } elsif ($opt_f eq "kana") { # @rfer、@resultをカナ山淡の误にする。 &mk_yomi_array; } # @refer、@resultを矢机帽疤の误にする。 if ($opt_u eq "char") { $refer = join('', @refer); $result = join('', @result); @refer = split(//, $refer); @result = split(//, $result); } # @referの眶を$rcountに、@resultの眶を$hcountに掐れる。 $rcount = $#refer + 1; $hcount = $#result + 1; # @refer、@result、$rcout、$hcountを粕み哈んで、アラインメントに掐る。 ($status_str, $result_str, $refer_str) = &taiou; # 赖豺帽胳误、簿棱帽胳误、アラインメント冯蔡误を叫蜗脱に腊妨する。 $refer_line = "REF: " . $refer_str; $result_line = "HYP: " . $result_str; $status_line = "EVAL: " . $status_str; # id、赖豺帽胳误、簿棱帽胳误、アラインメント冯蔡误を叫蜗する。 print "id: $h_id\n"; print "$refer_line\n"; print "$result_line\n"; print "$status_line\n";}sub usage { print "align.pl <OPTS> hyp_file > alignment_file\n"; print " OPTS --> [-h] -u {morpheme|char} [-c] -f {kanji|kana} -r ref_file\n"; print " -h --> show help\n"; print " -u {morpheme|char} --> select a unit for alignment\n"; print " -c --> do complex word process (-u morpheme)\n"; print " -f {kanji|kana} --> select a face for alignment\n"; print " -r ref_fine --> specify a formatted reference file\n"; exit(-1);}#sub ignore_pause {# @refer = grep(!/\+[^〖ア-ンヴァィゥェォッャュョヮ]+\+7[3-8]/, @refer);# @result = grep(!/\+[^〖ア-ンヴァィゥェォッャュョヮ]+\+7[3-8]/, @result);#}sub output_cm { local(@cmscore_tmp, @ids); @ids = @idref; for (@ids) { push(@cmscore_tmp, $cmscore[$_]); } @cmscore = @cmscore_tmp; if ($cmalpha == 0) { print "CMSCORE:"; } else { print "CMSCORE[$cmalpha]:"; } for (@cmscore) { print " $_"; } print "\n";}sub ignore_pause { local(@ref_tmp, @result_tmp, @idref_tmp, $c, $i, $NF); @idref = (); for ($i=0;$i<=$#result;$i++) { push(@idref, $i); } for (@result) { $c = shift(@idref); next if /<s>/; next if /<\/s>/; unless (/(、|。|ˇ|々|—|≈|∽|∝|≠|〗|∪|∩|ⅵ|ⅳ)/) { push(result_tmp, $_); push(idref_tmp, $c); next; } $NF = split(/\+/); if ($_[0] ne $_[1] && $NF > 1) { push(result_tmp, $_); push(idref_tmp, $c); } } @result = @result_tmp; @idref = @idref_tmp; for (@refer) { unless (/(、|。|ˇ|々|—|≈|∽|∝|≠|〗|∪|∩|ⅵ|ⅳ)/) { push(ref_tmp, $_); next; } $NF = split(/\+/); if ($_[0] ne $_[1] && $NF > 1) { push(ref_tmp, $_); } elsif (/ˇ/ && length($_[0]) > 2) { # 粕みにも山淡にもˇがあるとき $_ =~ s/ˇ//g; push(ref_tmp, $_); } } @refer = @ref_tmp;}sub mk_kanji_array { grep(s/\+.*$//, @refer); grep(s/\+.*$//, @result);}sub mk_yomi_array { grep(s/^[^\+]*\+//, @refer); grep(s/^[^\+]*\+//, @result); grep(s/\+.*$//, @refer); grep(s/\+.*$//, @result);}sub taiou { local($i, $j, %g, %d, %r, @status, @kekka_result, @kekka_refer); local($kx, $kx2) = 0; local($status_str, $result_str, $refer_str); local($status_str2, $result_str2, $refer_str2); local($del, $ins, $sub, $cor); local($del2, $ins2, $sub2, $cor2); local($ref2, $hyp2); # DPを蝗ってアラインメントを艰る ($kx, $cor, $sub, $del, $ins) = &dp; # 粕みでアラインメントを艰った冯蔡、驶淡粕みの婶尸で弥垂疙りに # なっているところについて、赖豺冉年をやり木す。 # (驶淡の面に赖豺が崔まれていれば、OKとする。) for ($i = $kx - 1; $i >= 0; $i--) { if ($status[$i] eq "S") { if ($kekka_result[$i] =~ /\{.+\}/ && $kekka_refer[$i] =~ /\{.+\}/) { $kekka_result[$i] =~ /(.*)\{(.+)\}(.*)/; $result_head = $1; $result_yomi = $2; $result_tail = $3; @resyomis = split('\/', $result_yomi); $kekka_refer[$i] =~ /(.*)\{(.+)\}(.*)/; $refer_head = $1; $refer_yomi = $2; $refer_tail = $3; @refyomis = split('\/', $refer_yomi); foreach $resyomi (@resyomis) { if ($result_head) { $resyomi = $result_head . $resyomi; } if ($result_tail) { $resyomi = $resyomi . $result_tail; } foreach $refyomi (@refyomis) { if ($refer_head) { $refyomi = $refer_head . $refyomi; } if ($result_tail) { $refyomi = $refyomi . $refer_tail; } $status[$i] = "C" if $resyomi eq $refyomi; } } } elsif ($kekka_result[$i] =~ /\{.+\}/ && $kekka_refer[$i] !~ /\{.+\}/) { $kekka_result[$i] =~ /(.*)\{(.+)\}(.*)/; $result_head = $1; $result_yomi = $2; $result_tail = $3; @resyomis = split('\/', $result_yomi); $ref_yomi = $kekka_refer[$i]; foreach $resyomi (@resyomis) { if ($result_head) { $resyomi = $result_head . $resyomi; } if ($result_tail) { $resyomi = $resyomi . $result_tail; } $status[$i] = "C" if $resyomi eq $ref_yomi; } } elsif ($kekka_result[$i] !~ /\{.+\}/ && $kekka_refer[$i] =~ /\{.+\}/) { $res_yomi = $kekka_result[$i]; $kekka_refer[$i] =~ /(.*)\{(.+)\}(.*)/; $refer_head = $1; $refer_yomi = $2; $refer_tail = $3; @refyomis = split('\/', $refer_yomi); foreach $refyomi (@refyomis) { if ($refer_head) { $refyomi = $refer_head . $refyomi; } if ($refer_tail) { $refyomi = $refyomi . $refer_tail; } $status[$i] = "C" if $refyomi eq $res_yomi; } } else { ; } } } # 剩圭胳借妄なし if (!$opt_c) { for ($i = $kx - 1; $i >= 0; $i--) { local($len1, $len2, $len, $format); $len1 = length($kekka_result[$i]); $len2 = length($kekka_refer[$i]); $len = $len1 > $len2 ? $len1 : $len2; $format = "%-" . $len . "s "; $status_str .= sprintf($format, $status[$i]); $result_str .= sprintf($format, $kekka_result[$i]); $refer_str .= sprintf($format, $kekka_refer[$i]); } ($status_str, $result_str, $refer_str); } # 剩圭胳借妄あり else { for ($i = $kx - 1; $i >= 0; $i--) { local($len1, $len2, $len, $format); $len1 = length($kekka_result[$i]); $len2 = length($kekka_refer[$i]); $len = $len1 > $len2 ? $len1 : $len2; $format = "%-" . $len . "s "; if ($status[$i] eq "C") { if (@status_tmp) { &fukugougo; # 剩圭胳借妄に掐る } $status_str2 .= sprintf($format, $status[$i]); $result_str2 .= sprintf($format, $kekka_result[$i]); $refer_str2 .= sprintf($format, $kekka_refer[$i]); $cor2++; $ref2++; $hyp2++; } # Sから幌まりDやIが鲁くような千急疙り婶尸帽胳误を芹误に掐れる if ($status[$i] eq "S") { $check_s = 1; push(@status_tmp, $status[$i]); push(@kekka_result_tmp, $kekka_result[$i]); push(@kekka_refer_tmp, $kekka_refer[$i]); } # Sから幌まりDやIが鲁くような千急疙り婶尸帽胳误を芹误に掐れる if ($status[$i] eq "D") { if ($check_s) { push(@status_tmp, $status[$i]); push(@kekka_result_tmp, $kekka_result[$i]); push(@kekka_refer_tmp, $kekka_refer[$i]); } else { $status_str2 .= sprintf($format, $status[$i]); $result_str2 .= sprintf($format, $kekka_result[$i]); $refer_str2 .= sprintf($format, $kekka_refer[$i]); $del2++; $ref2++; } } # Sから幌まりDやIが鲁くような千急疙り婶尸帽胳误を芹误に掐れる if ($status[$i] eq "I") { if ($check_s) { push(@status_tmp, $status[$i]); push(@kekka_result_tmp, $kekka_result[$i]); push(@kekka_refer_tmp, $kekka_refer[$i]); } else { $status_str2 .= sprintf($format, $status[$i]); $result_str2 .= sprintf($format, $kekka_result[$i]); $refer_str2 .= sprintf($format, $kekka_refer[$i]); $ins2++; $hyp2++; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -