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