ロシア語形態素解析 lemmatizer

BSD で動作するロシア語形態素解析ソフトウェアをかねてから探していた。二つの目的がある。ひとつは,プーシキンのコンコーダンス・プログラムの単語集計において,現行の出現形ではなく lemmatized な見出語でまとめること。いまひとつは,現時点の私の関心事であるロシア語旧正字法について,misima のような新・旧正字法変換のプログラムを書くこと。ロシア語旧正字法も語彙に依存する複雑な特性をもっており,そのためには misima 旧仮名遣い変換における「茶筌」と同じように,ロシア語形態素解析器が必要なのである。さらにその正字法変換ツールの用途としては,LaTeX T2D 旧正字法ロシア語用ハイフネーションパターンの作成を考えている。ここまで成せば,ロシア人にも果たせなかった LaTeX contribution となるはずだ。

FreeBSD russian ports にはそれらしいのが見当たらなかった。"Russian tagset and Russian statistical taggers" サイト(Serge Sharoff 氏による)によれば,インターネットリソースには TreeTagger, SVMTagger などのいわゆる tagger プログラムがいくつか公開されている。でも,残念ながら,私の愛用する FreeBSD,Mac OS X においてコマンドラインから使用できるツールがなかったのである。

ところが昨日,ロシアのサイトを探し回っていて lemmatizer(http://www.aot.ru/)を見つけた。ウクライナ・キエフ大学の Алексей Сокирко(アレクセイ・ソキルコ)によるプログラムである。このサイトでは,Graphematics 書記素解析ツール GraphmatThick,Syntax 統辞解析ツール TestSynan も公開されていて,私はしばらく勉強させてもらおうと思っているところである。lemmatizer は外部データを切り替えることで英語,ロシア語,ドイツ語の解析が可能な形態素解析ツールである。ライブラリとして使用することを主たる目的に書かれたものだが,TestLem という簡易試験ツールも添付している。ロシア語については,かの有名なザリズニャクの文法辞書の考え方に準拠している。Windows 及び Linux 用のアーカイブが用意されている。FreeBSD にもじつは textproc 分類で ports が存在することも判明。そこで早速 FreeBSD と Mac OS X Tiger にインストールしてみた。それぞれ,動作させるのにかなり苦労した。このソフトについて紹介・説明している日本語サイトは皆無のようである。通常の手順では組込みできないので,ここでインストール手順と使い方とを紹介する。

【FreeBSD インストール】

ports が用意されているが,通常の make install clean 発行だけではダメである(ports のバグなのか,説明が足りないのか)。スーパーユーザ権限で以下のオペレーションによってインストールする。これにより,ロシア語,英語,ドイツ語の形態素解析辞書も同時にインストールされる。

# cd /usr/ports/textproc/lemmatizer2
# make
# make install generatemorph installmorph
# cd /var/db/lemmatizer/Dicts/Morph
# chmod a+rx Eng Ger Rus

FreeBSD では lemmatizer の付属プログラムを使用するに先立って,環境変数 RML に辞書の組込みディレクトリ名をセットしておく。.tcshrc にも記述しておくとよい。

% setenv RML /var/db/lemmatizer

【Mac OS X インストール】

Mac OS X については lemmatizer 本体とロシア語辞書のみのインストール方法に留める。もちろん,英語,ドイツ語用の辞書も取り寄せて組込むことができる。詳細は Docs/Morph_UNIX.txt に記載されている。

  1. インストールするディレクトリ(ここでは $HOME/pkg/lemmatizer とする)を作成し,そこに http://www.aot.ru/download.php から lemmatizer.tar.gz と rus-src-morph.tar.gz をダウンロード格納する。
  2. lemmatizer は PCRE(Perl Compatible Regular Expressions)ライブラリを使用する。http://www.pcre.org/ からアーカイブをダウンロードし,これをインストールする。展開したディレクトリにおいて,./configure, make, make install とごく一般的な手順で組込むことができるが,UTF-8 でも使う可能性があるなら configure のオプションに "--enable-utf8 --enable-unicode-properties" を追加してビルドすることをお勧めする(FreeBSD ports は UTF-8 オプション付きで自動的に組込まれる)。
  3. % ./configure --enable-utf8 --enable-unicode-properties
    % make
    % sudo make install

  4. 環境変数をセットする。これはインストールのみならず,lemmatizer 利用の際にも必要である。
  5. % setenv RML /Users/isao/pkg/lemmatizer
    % setenv RML_PCRE_LIB /usr/local/lib
    % setenv RML_RCRE_INCLUDE /usr/local/include

  6. lemmatizer の C++ コンパイル,リンク用インストーラに定義されたオプションは,そのままでは Mac OS X Tiger ではエラーとなるので,次にこれに訂正を施す。Source/common/common_exe_mak ファイルを以下のように書き換える。
  7. 〔前〕:

    libs_argument := -Wl,--start-group $(pcre_libs) 
    $(subst .$(lib_ext),,$(lib_pathes)) -Wl,--end-group
     
    ifeq ($(libmode), static)
        lib_mode_switch := -static
    endif

    〔後〕: -Wl,--start(end)-group, -static
    オプションを削除

    libs_argument :=  $(pcre_libs) $(subst .$(lib_ext),,$(lib_pathes))
     
    #ifeq ($(libmode), static)
    #    lib_mode_switch := -static
    #endif
  8. コンパイル,リンク,辞書生成をスクリプトによって実行する。
  9. % ./compile_morph.sh
    % ./generate_morph_bin.sh Russian

  10. $HOME/pkg/lemmatizer/Bin にパスを通しておく。

【使い方】

lemmatizer 付属の TestLem は,lemmatizer ライブラリを用いたテストプログラムである。これで手軽にロシア語テキストの形態素解析を行うことができる。ただし,解析対象ロシア語テキストファイルの作成に際しては,以下の2点に注意する。

  1. ロシア語は Windows cp1251 エンコードで記述する。iconv などのコード変換プログラムを用いて UTF-8 などから変換すればよい。Emacs なら以下のコードを .emacs に記述すれば,cp1251 キリルエンコーディングを直接扱うことができるようになる。
  2. (codepage-setup 1251)
    (define-coding-system-alias 'windows-1251 'cp1251)

  3. 1行1単語の形にしておく。このため,通常のテキストファイルを扱う場合は,適当な tokenizer ツールを用いて前処理する形態となるだろう。

試しに,次のようなテキストファイル r.txt を準備するとしよう。

Я
люблю
вас
,
Надя
!

これをコマンドラインにおいて TestLem プログラムで処理する。

% TestLem Russian r.txt
Loading..
read r.txt
process r.txt
Count of words = 6
Time = 0 seconds; 0 ticks
too few words to measure the speed
writing to r.lem

Russian という第一引数はロシア語形態素辞書を指示するものである。English,German とすれば,それぞれ英語,ドイツ語の形態素解析が可能である。ファイル名(r.txt)を省略すると標準入力からテキストを読む。処理結果は,この場合 r.lem というファイル名で生成される。その出力は次のようなものである。

Я -> Я ча#
ЛЮБЛЮ -> ЛЮБИТЬ кб#
ВАС -> ВЫ чучхчч#
, -> , яя#
НАДЯ -> НАДЯ до#
! -> ! яя#

出力結果例においては,ЛЮБЛЮЛЮБИТЬ という不定形をもつ動詞で,一人称・単数・現在形であるということが,"ЛЮБИТЬ кб#" という形式で示されている。"ВЫ чучхчч" は,ВАС という出現形が二人称複数代名詞 ВЫ の生格,対格もしくは前置格であることを示す。このように,文法解析結果は "->" の先に「見出語 xx..#」で示され,文法構造は "кб","чу","до" など二文字からなるニモニックの組合せで示される。語として複数解がある場合は "xx...#" が複数出力される。こうして,語の出現形の lemmatize された見出語と文法構造が得られるのである。コンコーダンスにおいて見出語で出現度数を分析する等の処理が可能となる。

ロシア語文法構造ニモニック,文法略号の意味は Dicts/Morph/rgramtab.tab 及び http://www.aot.ru/technology.html に解説がある。詳細はそちらを参照。

付記: その後,UTF-8 Russian Lemmatizer を用いて実用的 C++ プログラミングを行った。以下のブログ記事を参照いただきたい。