というわけで、『はじめてのAIプログラミング』を読んでるわけなんですが
n-gramによるテキスト処理の説明があったのでコードを書いてみた。
Ngram.pm
package Ngram;
use strict;
use warnings;
use utf8;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors(qw(n str));
our $VERSION = '0.01';
use Encode;
sub d{decode('utf8', shift)};
sub e{encode('utf8', shift)};
sub make{
my $self = shift;
my @error;
$self->{n} = $self->{n} || 3;
$self->{str} = $self->{str} || push @error, "文字列を与えてください。";
push @error, "数字を指定して下さい。" if($self->{n} !~ m/^\d+$/);
die join("\n", @error) if(@error);
$self->{str} =~ s/\n//g;
$self->{str} =~ s/\s//g;
my @list = split(//, $self->{str});
die e("文字数が足りません!\n".
$self->{n}. "文字以上でお願いします") if($self->{n} > @list);
my $keyword = '$list[$i]';
if($self->{n} > 1){
for (1..$self->{n}-1){$keyword .= '.$list[$i+'. $_. ']'};
}
for my $i (0..@list-$self->{n}){
$self->{analyze}{eval($keyword)}++;
}
}
sub say{
my $self = shift;
for my $key (sort { $self->{analyze}{$b} <=> $self->{analyze}{$a} } keys %{$self->{analyze}}){
print e($key), ":", $self->{analyze}{$key}, "\n";
}
}
1;
#!/usr/bin/perl;
use strict;
use warnings;
use utf8;
use lib qw(./lib);
use Ngram;
my $ngram = Ngram->new({
n=>2,
str=>"abcbacbcbabcabcabbcabcbabcabacbabcbcabcabbcabcabacb"
});
$ngram->make;
$ngram->say;
n=1なら
b:21
c:15
a:15
n=2なら
ab:12
bc:12
ca:8
cb:7
ba:6
ac:3
bb:2
n=3なら
bca:8
abc:8
cab:8
cba:4
bcb:4
bab:3
acb:3
bac:3
abb:2
bbc:2
aba:2
cbc:2
まずはここまで。。