AOT のロシア語 DDC のインストール

自作のコンコーダンス・ソフトウェアを Lemmatizer C++ クラスライブラリによって見出語でも解析できるようにしようとしている。Lemmatizer についてはふたつのバージョンについて,すでにここで書いた。AOT で公開されている版(『ロシア語形態素解析 lemmatizer』参照)と,lemmtizer.org で公開されている版(『Lemmatizer UTF-8 対応ライブラリ』参照)である。

AOT 版は解析できるロシア語テキストのエンコーディングが Windows CP1251 のみであるのに対し,lemmatizer.org 版はさらに UTF-8 をサポートしている。私は UTF-8 が扱えるということで後者を自作プログラムで使おうと検討していた。しかし,いまひとつ仕様のドキュメントがきちんとしていない。辞書のソースコードを丹念に読むと,なんとなくわかって来るけれども,どうしても不明点が残る。サイト管理者に問い合わせても,なしのつぶてである。その点,AOT 版はロシア語の文法構造について品詞,性・数・格,活動体・不活動体,時制などの解析結果出力仕様が明確である。

さらに AOT 版は,形態素解析ツール Lemmatizer のほか,統辞解析ツール Synan,語彙素抽出ツール Graphan(要するに Tokenizer)をも提供していて,私の知る限り,ロシア語自然言語解析のための最強のツールセットともいえるのである。私のコンコーダンス・ソフトの設計に関しても,UTF-8 でテキストを受入れて,見出語を Lemmatizer から取得するときに iconv ライブラリによって CP1251 にコード変換し,再び UTF-8 に戻せばよい,と考えるようになった。

これらについて調べるうち,じつはコンコーダンス生成ツール DDC(DWDS/Dialing Concordance)をも AOT が提供していることがわかった。ロシア語,英語,ドイツ語(ISO-8859-1)のコンコーダンス解析が可能である。そこで,これらすべてのツール(ここでは 「AOT ツール」と総称する)を FreeBSD にインストールして使ってみた。Linux ならおそらく苦もなく組込みができるのだろうが,BSD ユーザにとってはじつに面倒なので,私の失敗を踏まえたインストール・メモをしるしておく。コマンドラインは tcsh シェルである。

  1. AOT ツールのコンパイルには以下のソフトが必要である。バージョンが古かったり,インストールされていなければ追加導入しておく。最新の FreeBSD なら PCRE 以外ははじめから整備されているはずなので,ここでの説明は割愛する。PCRE については『ロシア語形態素解析 lemmatizer』を参照。( )内に私の試験環境をしるしておく。
  2. - gcc C/C++ コンパイラ 3.2 以上(4.2.1)
    - PCRE C/C++ 正規表現ライブラリ 6.4 以上(7.7 with UTF-8 options)
    - bison 構文解析器 1.875 以上(2.3)
    - flex 字句解析器 2.5.4 以上(2.5.4)
    - gmake GNU Make(3.81)

  3. 以下のアーカイブを AOT скачать 頁からダウンロードする。DDC についてのみ SorceForge から取得する。面倒だが,すべてダウンロードする。DDC を 1.74-1 と 1.80 の 2 版取得するのは,後者にはコンパイル用シェルスクリプトが添付されておらず,直近の古い版のそれを利用するためである(これについては,アーカイブになんの説明もなく,配布がちょっと杜撰ではないかと思う)。そして以下の順に同じディレクトリにおいて解凍する(いろいろややこしい)。ここではインストール・ディレクトリを /usr/local/lib/RML として説明する。
  4. - concord-1.74-1.tar.gz DDC-1.74-1
    - concord-1.80.tar.gz DDC-1.80
    - lemmatizer.tar.gz Lemmatizer
    - rus-src-morph.tar.gz 形態素解析辞書(露)
    - ger-src-morph.tar.gz 形態素解析辞書(独)
    - eng-src-morph.tar.gz 形態素解析辞書(英)
    - graphan.tar.gz Graphan
    - graphan_dicts.tar.gz 語彙素辞書
    - synan.tar.gz Synan
    - rus-syn-dicts.tar.gz 統辞解析用辞書(露)
    - ger-syn-dicts.tar.gz 統辞解析用辞書(独)

  5. 以下のように RML などの環境変数をセットする。これはインストールのみならず,実行時にも必要である。
  6. # setenv RML /usr/local/lib/RML
    # setenv RML_PCRE_LIB /usr/local/lib
    # setenv RML_PCRE_INCLUDE /usr/local/include

  7. DDC のアーカイブ concord-1.80 のディレクトリが $RML/ddc-1.8_kai として解凍されているはずである。この直下のファイルをすべて同じディレクトリ構成で $RML/Source の下に上書きコピーする。
  8. # cd $RML/ddc-1.8_kai
    # tar cf - . | ( cd ../Source; tar xvf - )

  9. 次にコンパイル用シェルスクリプトの修正を行う。FreeBSD では gmake は /usr/local/bin 下にあるが,AOT ツールのシェルスクリプトは /usr/bin/gmake を指しているので,これを訂正する。FreeBSD の gmake を /usr/bin/gmake にシンボリックリンクしてもよい。
  10. # cd $RML
    # mkdir shwork
    # foreach i (*.sh)
    foreach? cp $i shwork/$i.bak
    foreach? sed 's|/usr/bin/gmake|/usr/local/bin/gmake|' $i > shwork/$i
    foreach? mv $shwork/$i $i
    foreach? end
    #

  11. generete_syn_bin.sh 中の 26 行目 Language=`expr substr $i 1 3`Language=`expr $i : '\(...\)'` に書き換える。
  12. $RML/Source/ConcordDaemon/Main.cpp 及び $RML/Source/SynanDaemon/Main.cpp のファイル先頭に以下を追加する。あるいは,私の作ったパッチ bsdpatch$RML 直下に格納して patch -p1 < bsdpatch で適用してもよい。
  13. #include <sys/types.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <signal.h>

  14. いよいよ全 AOT ツールのコンパイル,辞書生成を行う。以下,順次添付シェルスクリプトを実行する。長い道のり...
  15. # cd $RML
    # ./compile_morph.sh
    # ./generate_morph_bin.sh Russian
    # ./generate_morph_bin.sh German
    # ./generate_morph_bin.sh English
    # ./gen_graphan_bin.sh Russian
    # ./gen_graphan_bin.sh German
    # ./compile_and_check_graphan.sh Russian
    # ./compile_and_check_graphan.sh German
    # ./compile_synan.sh
    # ./generate_syn_bin.sh Russian
    # ./generate_syn_bin.sh German
    # ./compile_concord.sh
    # ./check_concord.sh Russian
    # ./check_concord.sh German
    # ./check_concord.sh English

  16. 上記のそれぞれの実行後,エラーなくコンパイルが終了していることを確認する。synan(統辞解析ツール)のドイツ語チェック("./generate_syn_bin.sh German")でコンペア・エラーが出ても,$RML/test.tmp にドイツ語解析結果が出力されていれば問題ない。私の遭遇した問題からいえば,もしかすると,$RML/Source/SimpleGrammerLib 配下のモジュール・コンパイルで,s_qlex.cpp.tmp に文法不正があるとのエラーが発生するかも知れない。そのときは $RML/Source/SimpleGrammerLib/s_qlex.cpp.tmp をエディタで開いて,251-2 行目を確認し,以下のとおりに修正して,停止したシェルスクリプトから再実行してみてほしい。
  17. #include <FlexLexer.h>  // <-- 次行と繋がっている場合,改行を挿入する。
    int yyFlexLexer::yylex()

  18. ヘッダファイル,ライブラリをわかり易い場所にコピーしておく。AOT ツールのライブラリを使った自作プログラムをコンパイルするとき,-I/usr/local/include/RML-L/usr/local/lib/RML を指定すればよい。
  19. # cd $RML/Source
    # foreach i (*)
    foreach? mkdir -p /usr/local/include/RML/$i
    foreach? cp -p $i/*.h /usr/local/include/RML/$i
    foreach? end
    # find . -name "*.a" | xargs -J % cp % $RML

以上でインストールは完了である。ライブラリの利用,テストプログラムの実行が可能となる。日を改めて,Synan,DDC など,AOT ツールの簡単な使い方を紹介したいと思う。