英文から使われている語彙の数を算出する

英文の読みやすさを計ってみた前回の続き。
英文で使われている「語彙数」、語彙の種類の数は「読みやすさ」を示すとても単純な指標の一つだ。
しかし「単語数」を数えるのはスクリプトを書ける人なら誰でもできるだろうが*1、「語彙数」を数えるのはちょっとやっかい。
英文中の単語は様々に変化してしまっているので、まずはそれらを原形に戻してやる必要がある。


ruby には Linguistics というモジュールがあって、単語を原形に戻す infinitive というメソッドがある。
が、これは "asked" を渡すと "aske" を返し、"ask" を渡すと空文字列を返すという悩ましい性質を持っている。まあ確かに "ask" という動詞があることを知っていなければ、 "asked" の原形のお尻に "e" がつくかつかないかは判断のしようがないわけで。


そこでさらに単語の語幹を取り出す stemmer というモジュールを組み合わせて、infinitive の返値(空文字列なら元の値)に対してさらに stem を取ればいい。
"take" が "tak" とかになっちゃうが、語彙数を数えるという目的には支障ないだろう。

require 'rubygems'
require 'stemmer'
require 'linguistics'
Linguistics::use( :en )

body = ARGF.read # 本文
infcount = Hash.new(0)
body.scan(/[A-Za-z]+(?:'t)?/).each do |word|
  inf = word.en.infinitive
  inf = (if inf=="" then word else inf end).stem
  infcount[inf] += 1
end
puts "Number of vocaburalies : #{infcount.size}"

なんでこんなことしてるかというと、Gutenberg Project から読みやすい作品を探して多読に使っちゃおうとかたくらんでるわけだ。
Gutenberg Project では(少し以前の)ほぼ全作品を収録した DVD イメージを Bittront で配布しているので、入手して全作品の Flesch-Kincaid Index と語彙数を算出して整列して……文字にすると涙ぐましいなあ(苦笑)。


でもおかげで Gutenberg Project にも多読に使えそうな初学者向けにリライトされた作品が収録されていることがわかったりしたので、まあ少しは役に立ったかな?


ちなみに Perl だと Lingua::EN::Infinitive という原形を取得するモジュールがあるのだが、動詞にしか対応していない(形容詞の比較級などは原形にしてくれない)ので、もうちょっと工夫がいりそう。

*1:もちろん電子データになっている場合だが