37,720
社区成员
发帖
与我相关
我的任务
分享
#!/usr/bin/perl
( $words, $pos, $ngram, $lex, $hmm ) = @ARGV;
open WORDS, $words or die "Can not open the $words file!\n";
open POS, $pos or die "Can not open the $pos file!\n";
open NGRAM, $ngram or die "Can not open the $ngram file!\n";
open LEX, $lex or die "Can not open the $lex file!\n";
open HMM, " > $hmm " or die "Can not open the $hmm file\n";
%wordkey = {};
$wnum = 0;
while( <WORDS> )
{
chomp;
$wnum++;
@wk = split;
$wordkey{$wk[1]} = $wk[0];
}
print HMM "M= $wnum\n";
close WORDS;
%poskey = {};
$pnum = 0;
while( <POS> )
{
chomp;
$pnum++;
@pk = split;
$poskey{$pk[1]} = $pk[0];#4 vb
}
print HMM "N= $pnum\n";
close POS;
@unipos = ();
@bipos = ();
while ( <NGRAM> )
{
chmop;
@png = split;
$n = @png;
if ( $n == 2 )
{
$unipos[$poskey{$png[0]}] = $png[1];#vb 100
}
if ( $n == 3 )
{
$bipos[$poskey{$png[0]}][$poskey{$png[1]}] = $png[2];
}
}
close NGRAM;
print HMM "A:\n";
foreach $i ( 1..$pnum )
{
foreach $j ( 1..$pnum )
{
$p = ( $bipos[$i][$j] + 1 ) / ( $unipos[$i] + $pnum ) ;
printf HMM ("%5.4f ", $p);
}
print HMM "\n";
}
print HMM "B:\n";
@wordpos = ();
while ( <LEX> )
{
chmop;
@wpn = split;
$wordpos[$poskey{$wpn[1]}][$wordkey{$wpn[0]}] = $wpn[2];
}
close LEX;
foreach $i ( 1..$pnum )
{
foreach $j ( 1..$wnum )
{
$p = ( $wordpos[$i][$j] + 1 ) / ( $unipos[$i] + $wnum ) ;
printf HMM ("%5.4f ", $p);
}
print HMM "\n";
}
print HMM "pi:\n";
$sum = 0;
shift ( @unipos );
foreach $n ( @unipos )
{
$sum += $n;
}
foreach $n ( @unipos )
{
$p = $n / $sum;
printf HMM ("%5.4f ", $p);
}
print HMM "\n";