2012年1月10日火曜日

Rubyでコーパス言語学(2)

XMLコーパスを読み込む

前回のエントリで作成したXMLコーパスに対して、いろいろな操作を試みる。まずはnokogiriを用いてXMLコーパスをロードする。

# -*- coding: utf-8 -*-
require 'nokogiri'
f = open('c:¥KyotoCorpus4.0¥xml¥syn¥950101.xml')
doc = Nokogiri::XML(f){|config| config.noblanks}
f.close

XMLファイルのロードはNokogiri::XML(f)で行う。このとき、後ろにブロックをつけて読み込み時の設定を行うことができる。noblanksは空白だけのテキスト要素を無視せよというもので、これがないとXMLファイル中のインデントとかがいちいちテキスト要素として読み込まれるのでうざい。ちなみに最後の三行は次のように書くこともできる。

file = 'c:¥KyotoCorpus4.0¥xml¥syn¥950101.xml'
doc = open(file){|f| Nokogiri::XML(f){|config| config.noblanks}}

文、文節、語の数を数える

今回使用するXMLコーパスの基本的な構造は次の通りである。

<document>文書全体
<sentence>
<chunk>文節
<tok>

特定の種類のノードのリスト(ノードセット)を取得するには、xpathメソッドを使う。xpathはxmlにおける正規表現みたいなもので、詳しくはぐぐれ。

sentences = doc.xpath('//sentence')
chunks = doc.xpath('//chunk')
tokens = doc.xpath('//tok')

ノードセットの数を取得するにはsizeメソッドを使う。

puts <<"END"
sentences: #{sentences.size}
chunks: #{chunks.size}
tokens: #{tokens.size}
END

形態素情報で検索する

特定の語のノードセットを取得したい場合はtok要素の属性を利用する。例えば判定詞の「で」だけを検索したい場合は次のようにする。

de = doc.xpath('//tok[text()="で" and @pos="判定詞"]')

xpath中のtext()はテキスト要素を取得する関数で、@posのように@で始まる名前は属性を表す。この例では、<tok pos="判定詞">で</tok>のようなパターンのtok要素のセットを取得する。


手抜きKWIC

文ID、語ID、前文脈、検索語、後文脈をタブ文字で区切ったKWICもどきを出力する。

# -*- coding: utf-8 -*-
require 'nokogiri'
file = '(中略)950101.xml'
xpath = '//tok[@pos="判定詞"]'

doc = open(file){|f| Nokogiri::XML(f){|config| config.noblanks}}
tokens = doc.xpath(xpath)
tokens.each do |tok|
  sen = tok.at_xpath('ancestor::sentence')
  senid = sen.attr('S-ID')
  tokid = tok.attr('id')
  prev = sen.xpath('.//tok[@id < %i]' % tokid)
  foll = sen.xpath('.//tok[@id > %i]' % tokid)
  puts [senid, tokid, prev.text, tok.text, foll.text].join("¥t")
end

at_xpathはノードセットではなく最初にマッチしたノードだけを返すメソッド。最初から該当する要素が一つしか無いと予想される場合によく使う。xpath中のancestorは軸と呼ばれるもので、現在のノードの祖先(親ノードや祖父ノードなど)を検索せよという指示を与える。attr('S-ID')はS-IDという名前の属性の値を返せというメソッドで、戻り値は多分文字列(String)。ちなみに類似するattributeというメソッドはNokogiri::XML::Attrオブジェクトだったかを返したはず。textはテキスト要素を文字列として返すメソッドで、ノードにもノードセットにも使える。ノードセットの場合は、各ノードのtextを連結した文字列を返す(スペースなどは挟まない)。

このプログラムは、kwic.rbとか適当な名前で保存して次のように使う。

ruby kwic.rb > result.txt

出力結果のresult.txtは、Excelとかで開くと閲覧しやすい。コマンドラインでXMLファイルや検索文字列(xpath)を指定できるようにするとか改造はお好みで。

0 件のコメント:

コメントを投稿