Jって(笑)
ちょっと出遅れ気味だけど「自分マイニング!」やってみました。
ふつうに頻度100以上、6文字以上の頻出部分文字列はこんなかんじ。
318 てしまった。 278 たんだけど、 213 ってしまった 188 ったんだけど 140 ったんだけど、 136 ってしまった。 120 なってしまっ 105 とりあえず、 103 してしまった 101 ないんだけど
あんまりおもしろくないんで(って云うか「たんだけど」使いすぎ)、CaboCha 使って、頻出文節をとってみたらこんなかんじ。
$ cabocha -f1 all | ruby seg.rb | sort | uniq -c | sort -nr | head -10 662 ちょっと 645 やっぱり 351 で 325 でも 323 が 321 もう 304 J 256 この 250 かなり 249 ことで
ついでに CaboCha の出力から頻出形態素 v-gram (3-gram 以上)をとってみたら、こんなかんじ。
$ ruby v-gram.rb all.dep 835 んだけど 349 たんだ 347 ていた 340 たんだけど 223 んだろう 143 ってことで 127 だけど) 125 てきた 113 だろうか 108 にして 107 たのは 104 気がする
つぎは頻出部分木か? とか思ったけど、なんだかお仕事してるみたいな気になってきたので、このあたりでやめておきます。
使ったスクリプトは以下のとおり。
seg.rb:
$KCODE = 's' seg = '' ARGF.each do |line| if line =~ /^(EOS|\*)/ then puts seg if !seg.empty? seg = '' next end seg << line.chomp.split[0].gsub(/。|、|\?|!/, '') end puts seg if !seg.empty?
v-gram.rb:
$KCODE = 's' $cutoff = ARGV.shift.to_i path = ARGV.shift input = open(path) table = Hash.new size = -1 pattern_len = 1 while table.size > size do size = table.size pattern = [''] * pattern_len input.each do |line| if line =~ /^EOS/ then pattern = [''] * pattern_len next elsif line =~ /^\*/ then next end morph = line.chomp.split[0].gsub(/。|、|\?|!/, '') next if morph.empty? pattern.shift pattern.push(morph) next if pattern_len > 1 and table[pattern[0..-2]].nil? table[pattern] = (table[pattern] || 0) + 1 end table.delete_if {|pattern, freq| freq < $cutoff } input.rewind pattern_len += 1 end table.to_a.sort {|a, b| b[1] <=> a[1] }.each do |pattern, freq| next if pattern.size < 3 puts "#{freq}\t#{pattern.join}" end input.close