単語の登場回数がどういう分布をしているか見てみる

今日は講習会があっていたので、蛋白質核酸酵素のほうを調べるお仕事ができていなかったので、電車の中で書いてみる*1。単語の登場回数というのはたぶんlong tailをしているんだろうなーというのは予想がつくんだけど、どのくらいlong tailなのかを調べてみた。

過去20年のそれぞれの年において、どの単語が何回登場したか、というのは前回のスクリプトでできている。こんな感じになっている。

/Users/yasuhisa/dbcls/pne/result% ls
1985.txt	1988.txt	1991.txt	1994.txt	1997.txt	2000.txt	2003.txt	2006.txt
1986.txt	1989.txt	1992.txt	1995.txt	1998.txt	2001.txt	2004.txt
1987.txt	1990.txt	1993.txt	1996.txt	1999.txt	2002.txt	2005.txt

これをとりあえず一本のファイルにまとめたい。ということでRubyで3分クッキング。

# -*- coding: utf-8 -*-

count = Hash.new
count.default = 0

Dir.glob("/Users/yasuhisa/dbcls/pne/result/*.txt").each{|file|
  File.open(file,"r").each{|line|
    l = line.split(",")
    count[l[0]] +=  l[1].chomp.to_i
  }
}

output = File.open("aaaa.csv","w")
count.each{|key,value|
  output.puts "#{key},#{value}"
}
output.close

ここまでくるとRで楽勝にできる。登場回数の頻度(10回登場した単語が何回くらい登場したか、というようなもの)を見てみる。

d <- read.csv("/tmp/aaaa.csv",header=FALSE)

hist(d[,2],nclass=30,
     main="頻度の登場回数",
     xlab="頻度",
     ylab="登場回数"
     )

Quartz 2 [*]-21
が、このヒストグラムだと、数回しか登場しない、という単語が多すぎる&大量に登場する単語がちょっとだけ登場するというのの両方の効果により、ほとんど意味を無さなくなってしまっているwww。tailがながーい分布に対しては対数を取る、というのが上等手段なので、logを取ってからヒストグラムを書いてみる。

hist(log(d[,2]),
     nclass=30,
     main="対数頻度の登場回数",
     xlab="頻度の対数",
     ylab="登場回数"
     )

Quartz 2 [*]-22
おお、やっとlong tailっぽくなった。logを取ってlong tailになる、ということは普通のlong tailよりもさらに右にtailが長いということなんだろうなー。

*1:そのためにわざわざ座れるように秋葉原まで戻ったw