2016-01-09 3 views
1

У меня есть функция, которая учитывает частоты триграмм в тексте. Не требуется знание вычислительной лингвистики, мне просто нужна помощь с кодом Perl.Hash (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 стоит прочитать, так как он расширяет структуру данных.