#!/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:カ