品詞解析RubyライブラリEngTagger
Posted by Yoichiro Hasebe
5月の初めからPerlを勉強しています。今後仕事で必要になる可能性があるので。8年くらい前に小さなスクリプトを作って遊んだりしてたけど、Perlのオブジェクト指向はどうもよく分からんなぁと思って使うのを止めたのでした。あらためて調べてみると、これが結構合理的だし面白い。
早速何かに役立てたいと思いつつも、ある程度の規模のプログラムをPerlで書く気にはなりません(それだったらRubyで書きたい)。じゃあPerlモジュールを何か見つけてきてそれのRuby移植版を作ろう。ということで、CPANを眺めていたら、Lingua::En::Taggerというのを見つけました。どんなモジュールかというと、Part of Speech Tagger、すなわち品詞解析器です。Pen Treebankのコロケーション情報を元にした隠れマルコフモデルを使い、入力された英文を品詞解析します。ライセンスはGPL2でした。
ゴールデンウィークの時間を使って、何とか一通りの作業が完了。もとのPerlモジュールがそうなのだけど、英文中からすべての名詞を抜き出したり、固有名詞(と思われるもの)を抜き出したり、修飾句に導かれた名詞句を抜き出すといった機能があります。もちろんこれらをすべて実装。
コードの品質はともかく、Rubyライブラリとして需用は少なからずあると思うので、RubyForgeでgemとして公開することにします。詳細は以下の通り。
プロジェクト・サイト
インストール
gem install engtagger使い方
require 'rubygems'
require 'engtagger'
# EngTaggerオブジェクトの作成
tgr = EngTagger.new
# サンプルテキスト text
text = "Alice chased the big fat cat."
# textに品詞タグ付与(XML形式)
tagged = tgr.add_tags(text)
# => "<nnp>Alice</nnp> <vbd>chased</vbd> <det>the</det> <jj>big</jj> <jj>fat</jj><nn>cat</nn> <pp>.</pp>"
# text中の全ての名詞・名詞句およびその頻度を取得
word_list = tgr.get_words(text)
# => {"Alice"=>1, "cat"=>1, "fat cat"=>1, "big fat cat"=>1}
# タグ付けされたテキストから名詞を抽出
nouns = tgr.get_nouns(tagged)
# => {"cat"=>1, "Alice"=>1}
# タグ付けされたテキストからすべての固有名詞を抽出
proper = tgr.get_proper_nouns(tagged)
# => {"Alice"=>1}
