libchasen

f:id:peroon:20090117004323j:image

Ruby人工無能を作ろうとしています。以下は形態素解析に必要なlibchasen.dllをrubyから使うためのメモです。

形態素解析chasenを使いたいのですが、Vistaの環境だとcha21244sp5.exeが動かなくて困ります。chasen233_031208.exeなら動いたので、これでいくことにしましたが、chasen.dllではなくlibchasen.dllを使うことになります。この変更のための説明は参考にしている本にはないので困っていたら、libchasenを扱うrubyプログラムをこちらで公開していたので、それを利用してrubyからchasenを呼び出すことができました。

(以下は引用です。これからもたびたび使うコードになると思うし、消されると困るのでここに引用としてメモしました。筆者様、消した方が良ければご連絡ください)

Ruby/Chasen Win32API版

概要

UNIX環境でRubyからChaSenを利用する際, Ruby/ChaSen というインターフェイスを使います。しかしWindows環境でこれを使おうとすると,いろいろ面倒です。ここでは,Win32API経由でChaSenを呼び出す,Ruby/ChaSen互換ライブラリを提供します。

追記:このスクリプトは以前Ruby/Chasen Alternativeという名前で公開していたものです。旧サイトは既に削除してしまったので、とりあえずここに再アップしておきます。以前のものとほとんど同じですが、微妙に修正してあります。
開発環境

    * ActiveScriptRuby 1.8.4
    * ChaSen 2.3.3[Windows Binary]

注1
    このスクリプトはWin32APIライブラリ経由でlibchasen.dllを呼び出します。 Win32APIは,Ruby1.8.x以降には標準で含まれていると思います。 libchasen.dllは古いChaSen(2.1.x以前?)には含まれていないかも知れない。 
注2
    このスクリプトの作成にあたって,以下の書籍を参考にさせていただきました。chasen.dllを利用したい場合は,そちらを参照してください。 

    * 秋山智俊(2005)『恋するプログラム―Rubyでつくる人工無能』毎日コミュニケーションズ.
            

インストール
環境変数の設定

ChaSenを利用するにあたって,いくつかWindowsの環境変数を設定しておく必要があります。環境変数を設定するには,[コントロールパネル]から[システム]を開き,[詳細設定]タブの[環境変数]ボタンをクリックしてください。

Path
    既存の設定の末尾に,libchasen.dllの置いてあるフォルダを追加してください。通常は,C:\Program Files\Chasenあたりにあると思います。
    例)Path = …C:\Program Files\Ruby-1.8\bin;C:\Program Files\Chasen 
chasenrc
    新規に変数を作成し,chasenrcファイルのフルパスを設定してください。通常は,C:\Program Files\Chasen\dic\chasenrcあたりにあると思います。
    例)chasenrc = C:\Program Files\Chasen\dic\chasenrc 

chasen.rbのインストール

以下のスクリプトをchasen.rbという名前で保存し,/lib/ruby/site_ruby/1.8以下に置いてください。

[C:\Program Files\ruby-1.8\lib\ruby\site_ruby\1.8\chasen.rb]

# Ruby/Chasen via Win32API ver 0.12 [2008.02.12]

require 'Win32API'

module Chasen

  DLL = 'libchasen.dll'
  Getopt = Win32API.new(DLL, 'chasen_getopt_argv', 'pp', 'i')
  Sparse = Win32API.new(DLL, 'chasen_sparse_tostr', 'p', 'p')

  def getopt(*opt)
    argv = opt.unshift($0).push(nil).pack('p' * opt.size)
    Getopt.call(argv, nil)
  end

  def sparse(text)
    Sparse.call(text + 0.chr)
  end

  def fparse(file)
    line = file.read
    sparse(line) unless line == nil
  end

  module_function :getopt
  module_function :sparse
  module_function :fparse

end

以上でインストールは完了です。
使い方
基本編

とりあえず次のような感じで使います。

require 'chasen'
Chasen.getopt('-F%m %P-\n')
puts Chasen.sparse('本日は晴天なり')

[実行結果]
本日 名詞-副詞可能
は 助詞-係助詞
晴天 名詞-一般
なり 助動詞
EOS

詳しい仕様は,気が向いたら書きます。
応用編 - Gyokuroを使ってみる

Ruby/ChaSenを簡単に使うために,Gyokuroというラッパーがあります。
ここ からダウンロードしてきて解凍し,その中に含まれる/lib/gyokuroフォルダをまるごとC:\Program Files\Ruby-1.8\lib\ruby\site_ruby\1.8\gyokuroフォルダとしてコピーすれば,すぐに使用することができます。
なお,最新のRubyを使っている場合には,typeをclassに直せという警告が出るかも知れません。その場合は,gyokuroフォルダ内のparser.rbファイルをテキストエディタで開いて,以下の修正を行ってください。

[parser.rb:40行目付近]
return self.type.parse(text).reject { |line|
↓
return self.class.parse(text).reject { |line|