如您所知,Perl中的模块Text::Ngrams可以进行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)?
答案 0 :(得分:0)
您无法在同时获得所有不同大小的n-gram,但您可以使用多次调用get_ngrams
来获取所有n-gram。有一个未记录的参数n
到get_ngrams
,表示您想要列出的n-gram的大小。
在您的代码中,如果您说
my @ngramsarray = $ng3->get_ngrams(
n => 1,
orderby = >'frequency',
onlyfirst => 10,
normalize => 0);
你得到这个清单
('T', 8, 'E', 4, 'X', 2, '_', 2, 'S', 2)