2016-01-09 69 views
1

我有一个函数可以计算文本中Trigrams的频率。没有计算语言学知识,我只需要Perl代码的帮助。哈希(Multihash?)索引(Perl)

这是功能:

sub extract_frequencies { 
    for(my $i=0; $i<=$#tag; $i++) { 
     $wordtagfreq{"$word[$i]\t$tag[$i]"}++; 
     $tagfreq{$tag[$i]}++; 
    } 

    # count Tag-Trigramm-Frequencies 
    my @start = ("<s>","<s>"); 
    unshift @tag, @start; # korrigiert 
    push @tag, "<s>"; 
    for(my $i=2; $i<=$#tag; $i++) { 
     $ngramfreq[3]{"$tag[$i-2]\t$tag[$i-1]\t$tag[$i]"}++; 
    } 
} 

的特定码点,我不明白有以下几种:

1)$ngramfreq [3]

什么散列索引是指在这里?我是否分别计数每个标签?这是钥匙的长度吗?我的结束键是什么(3个不同的标签键?)?

2)$i<=$#tag

是什么$#在Perl是什么意思?

有段时间没有用过Perl,所以我希望有些Perl Monks能帮助我。

+1

您可能需要分别检查哈希数组http://perldoc.perl.org/perldsc.html#ARRAYS-OF-HASHES和http://perlmaven.com/perl-arrays。 –

+1

我将'use Data :: Dumper;'添加到您的脚本的开头,并在'print Dumper \ @ ngramfreq'中查看您的数据结构 – fugu

+3

如果您想要Perl Monks的答案,请转至http://www.perlmonks。 org :-) – choroba

回答

5

[0]是一个数组索引,与散列无关。这意味着ngramfreq实际上是散列的数组:

my @ngramfreq = (
        { tag => 1, fish => 3 }, 
        { anothertag => 4 } 
       ); 

并由此$ngramfreq[0]让你第一匿名哈希,然后你就可以访问标记。

$#tag是数组@tag中的最后一个索引。因此,有3个元素,它将是2,因为数组显示是0,1,2

Data::Dumper是一种可视化结构的好方法,让您了解它是如何布局的。

perldoc perldsc值得一读,因为它扩展了数据结构。