⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 align.pl

📁 about sound recognition.i want to downlod
💻 PL
📖 第 1 页 / 共 2 页
字号:
#!/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 + -