我有这个使用哈希表的脚本:
#!/usr/bin/env perl
use strict; use warnings;
my $hash = {
'cat' => {
"félin" => '0.500000',
'chat' => '0.600000',
'chatterie' => '0.300000'
'chien' => '0.01000'
},
'rabbit' => {
'lapin' => '0.600000'
},
'canteen' => {
"ménagère" => '0.400000',
'cantine' => '0.600000'
}
};
my $text = "I love my cat and my rabbit canteen !\n";
foreach my $word (split "\s+", $text) {
print $word;
exists $hash->{$word}
and print "[" . join(";", keys %{ $hash->{$word} }) . "]";
print " ";
}
目前,我有这个输出:
I love my cat[chat;félin;chatterie;chien] and my rabbit[lapin] canteen[cantine;ménagère] !
我需要根据频率(存储在我的哈希中)获得nbest键值。例如,我希望根据以下频率获得3个最佳翻译:
I love my cat[chat;félin;chatterie] and my rabbit[lapin] canteen[cantine;ménagère] !
如何更改代码以考虑每个值的频率以及打印最正确的值?
感谢您的帮助。
答案 0 :(得分:0)
最简单的方法是编写一个子程序,返回给定单词的N个最常见的翻译。我在下面的程序中写了best_n
来做到这一点。它使用List::UtilsBy
中的rev_nsort_by
来简洁地进行排序。它不是核心模块,因此可能需要安装。
我还使用了可执行替换来就地修改字符串。
use utf8;
use strict;
use warnings;
use List::UtilsBy qw/ rev_nsort_by /;
my $hash = {
'cat' => {
'félin' => '0.500000',
'chat' => '0.600000',
'chatterie' => '0.300000',
'chien' => '0.01000',
},
'rabbit' => {
'lapin' => '0.600000',
},
'canteen' => {
'ménagère' => '0.400000',
'cantine' => '0.600000',
}
};
my $text = "I love my cat and my rabbit canteen !\n";
$text =~ s{(\S+)}{
$hash->{$1} ? sprintf '[%s]', join(';', best_n($1, 3)) : $1;
}ge;
print $text;
sub best_n {
my ($word, $n) = @_;
my $item = $hash->{$word};
my @xlate = rev_nsort_by { $item->{$_} } keys %$item;
$n = $n > @xlate ? $#xlate : $n - 1;
@xlate[0..$n];
}
<强>输出强>
I love my [chat;félin;chatterie] and my [lapin] [cantine;ménagère] !