
#!/usr/bin/perl
use strict;
use warnings;
use SUFARY;
use Encode;
use open ':utf8';
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
my $min_ngram = 1;
my $wordset_fn = shift @ARGV;
my $suf = SUFARY->new($wordset_fn);
while (<>) {
chomp;
next if /^\s*$/;
my @chars = split(//, $_);
my %phrases;
my %scores;
my %seen;
for (my $i = 0; $i < @chars; $i++) {
for (my $j = $i + $min_ngram - 1; $j < @chars; $j++) {
my $key = join("", @chars[$i..$j]);
next if $seen{$key};
$seen{$key} = 1;
my ($left, $right) = $suf->range_search($key);
last if not defined $left and not defined $right;
for (my $k = $left; $k <= $right; $k++) {
my $pos = $suf->get_position($k);
my @lis = $suf->get_line_info($pos);
next if $phrases{$lis[0]}{$key};
$phrases{$lis[0]}{$key} = 1;
$scores{$lis[0]}++;
}
}
}
foreach my $li (sort {$scores{$b} <=> $scores{$a}} keys %scores) {
my $line = $suf->get_line($li);
print "$scores{$li} ";
print decode('utf-8', $line);
print " vgram:".join(",", sort keys %{$phrases{$li}})."\n";
}
}
これはゆで卵 卵 あれはカレー 米 カレーな釜玉 卵 焼き鳥はカレー 鶏 ゆで卵は豚カツ 豚 豚カツと豚汁 豚
./mkipu8.pl a.txt > a.txt.ary mkary -so a.txt
% echo "これはカレー" | ./vgram.pl a.txt 15 あれはカレー 米 vgram:は,はカ,はカレ,はカレー,れ,れは,れはカ,れはカレ,れはカレー,カ,カレ,カレー,レ,レー,ー 10 焼き鳥はカレー 鶏 vgram:は,はカ,はカレ,はカレー,カ,カレ,カレー,レ,レー,ー 6 カレーな釜玉 卵 vgram:カ,カレ,カレー,レ,レー,ー 6 これはゆで卵 卵 vgram:こ,これ,これは,は,れ,れは 2 ゆで卵は豚カツ 豚 vgram:は,カ 1 豚カツと豚汁 豚 vgram:カ