[n-gram][perl]

    # ngram.pl
  1 use strict;
  2 use warnings;
  3 use utf8;
  4 binmode STDIN, ':utf8';
  5 binmode STDOUT, ':utf8';
  6
  7 my @text = split(//,join('',<>) );
  8
  9 my $seek = 0;
 10 my $span = 2;
 11
 12 while(1) {
 13     my @words = grep {$_} map { $text[$_] } ($seek..($seek+$span));
 14     print join('',@words ) . "\n";
 15     $seek++;
 16
 17     last if( $seek > @text );
 18 }

青空文庫あたりから文章データをもらってくる。

http://www.aozora.gr.jp/cards/001095/card42821.html

cat text_file.txt | perl ngram.pl

まあこんな感じの結果が出る。

 探偵
探偵小
偵小説
小説は
説はジ
はジフ
ジフテ
フテリ


それで、これをカウントすると、

  1 use strict;
  2 use warnings;
  3 use utf8;
  4 binmode STDIN, ':utf8';
  5 binmode STDOUT, ':utf8';
  6
  7 my %results;
  8 while( my $line = <> ) {
  9     chomp $line;
 10     $results{$line}++;
 11 }
 12
 13 for my $key ( sort { $results{$b} <=> $results{$a} } keys %results ) {
 14     print join("\t",$key,$results{$key} ) . "\n";
 15 }
cat text_file.txt | perl ngram.pl | perl count.pl


結果はこんな感じ。

   1     33
   2 探偵小  15
   3 偵小説  12
   4    12
   5 。  11
   6 ている  8
   7 してい  7
   8 小説の  5
   9 である  5
  10 であり  5
  11 る。    5
  12 ない。  5
  13  探偵  4
  14 、探偵  4
  15 ……。    4
  16 ように  4
  17 フテリ  3
  18 うであ  3
  19 読んで  3
  20 いるの  3
  21 しても  3
  22 ックリ  3
  23 みると  3
  24 小説を  3


小説とか探偵がこの文章で重要であるということがなんとなくわかる。