在Perl中获取nbest键值对哈希表

时间:2014-11-13 17:56:54

标签: perl sorting hash hashtable perl-data-structures

我有这个使用哈希表的脚本:

#!/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] !

如何更改代码以考虑每个值的频率以及打印最正确的值?

感谢您的帮助。

1 个答案:

答案 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] !