Как получить массив всех ngrams в Perl Text::Ngrams

Как вы знаете, модуль Text::Ngrams в Perl может дать анализ Ngrams. Существует следующая функция для получения массива Ngrams и частот.

get_ngrams(orderby=>'ngram|frequency|none',onlyfirst=>NUMBER,out=>filename|handle,normalize=>1)

Но он дает только последние Ngrams. Например, следующий код не дает ни Uni-Gram, ни Bi-Gram:

my $ng3 = Text::Ngrams->new( windowsize => 2, type=>'byte');
my $text = "test teXT TESTtexT";

$text =~ s/ +/ /g; # replace multiple spaces to single
$text = uc $text; # uppercase all

$ng3->process_text($text);
my @ngramsarray = $ng3->get_ngrams(orderby=>'frequency', onlyfirst=>10, normalize=>0 );
foreach(@ngramsarray)
{
    print "$_\n";
}

выход:

T E
4
E X
2
_ T
2
E S
2
S T
2
X T
2
T _
2
T T
1

Однако с помощью функции

to_string(orderby=>'ngram|frequency|none',onlyfirst=>NUMBER,out=>filename|handle,normalize=>1,spartan=>1)

он показывает оба Ngrams. Но только он отображает результат. Мне нужен результат в массиве.

Как получить все Ngrams (Unigram и Bigram) одновременно этим массивом?


person Losa    schedule 07.05.2013    source источник


Ответы (1)


Вы не можете получить все n-граммы разных размеров одновременно в одно и то же время, но вы можете получить их все, используя несколько вызовов get_ngrams. Существует недокументированный параметр от n до get_ngrams, в котором указывается размер n-грамм, которые вы хотите перечислить.

В вашем коде, если вы говорите

my @ngramsarray = $ng3->get_ngrams(
  n => 1,
  orderby = >'frequency',
  onlyfirst => 10,
  normalize => 0);

вы получаете этот список

('T', 8, 'E', 4, 'X', 2, '_', 2, 'S', 2)
person Borodin    schedule 07.05.2013