wiki:開発ツール

お知らせ

  • ベースラインツール2.0で、重要な修正およびMCタスクへの対応がなされました。以下の注意事項および使い方をご覧ください。

ドライランデータおよびフォーマルランデータの解析結果

RITE-2のJAでは,ドライランデータおよびフォーマルランデータに含まれる文対について,その解析結果も提供します.解析ツールは以下の通りで,共通のXMLフォーマットで提供されます.

解析結果XMLの仕様およびサンプル

  • 注意
    • これらのデータは,解析ツールのインストール作業などの負担を軽減し,参加しやすくするためのもので,これらのデータを利用しなければいけない,というわけではありません.
    • ドライランだけでなく,フォーマルランデータについても解析結果を提供します.

フォーマット変換ツール

各種言語解析器の出力をXMLフォーマットに変換するためのツールです.解析器ごとに2種類のツールがあります.

ベースラインツール

含意関係認識の基本的なシステムを提供します.機械学習に基づいて分類する手法を採用しており,上記の解析結果を用いることで,サブミット可能なファイルを出力します.基本的な素性(単語の被覆率など)のみが実装されており,ドライランデータに対する交差検定を行うことで手軽に素性開発が行えます.

以下の機能を使うことができます.

  1. ドライランデータに対する交差検定(素性開発,パラメータチューニング向け)
    • 入力:ドライランデータ
    • 出力:サブミット可能なファイル,モデルファイル,素性ファイル
  2. ドライランデータを全て用いて学習し,フォーマルランデータに対して含意関係認識を行う
    • 入力:ドライランデータ,フォーマルランデータ
    • 出力:サブミット可能なファイル,モデルファイル,素性ファイル

ver.1.1の注意点

  • サブミット可能な形式において、確信度のスコアが0~1にならないという重要な問題があります。通常はver.2.0にアップデートしてください。feature.pyは共通して利用可能です。
  • ver.2.0はBCタスクにおける分類性能は変更ありません。従って、MCタスクに不参加の場合は、ver.1.1のままにすることもできます。
    • その場合は、サブミット可能なファイル中のスコアに対して、標準シグモイド関数などを適用して0~1の値域に変換する処理を追加してください。

ver.2.0での修正点と注意点

  • MCタスクに対応しました。
  • サブミット可能な形式において、確信度のスコアが0~1になっていなかった問題に対応しました。
  • ver.1.1までのfeature.pyは、変更することなく2.0でも利用できます。

システム要求(利用環境)

  • Linux, Mac OSX
    • Python 2.6以上
    • Classiasを利用する場合は,Ver.1.1をインストール
  • Windows
    • Cygwin上のPython 2.6以上
    • Classiasを利用する場合は,Ver.1.1をインストール
      • 32bit版のみであるため,メモリの制限があることに注意
  • その他
    • ご要望があれば対応を検討します.

日本語はUTF8にて取り扱いますので,UTF8対応のエディタを利用するなどの対応が必要です.特にWindows環境ではご注意ください.

使い方(概要)

以下のようにファイルなどが置かれていることを想定.

+--作業ディレクトリ(現在の居場所)
|  +--baseline-2.0
|  |  +--main.py
|  |  +--src/
|  |  +--.hg_archival.txt
|  +--rite2eval-1.1
|  |  +--data/
|  |  +--src/
|  |  +--build.xml
|  |  +--README
|  |  +--rite2eval.jar
|  +--RITE2_JA_dev_bc.parsed.unidic.xml
|  +--RITE2_JA_test_bc.parsed.unidic.xml(フォーマルランデータ 後日提供)
|  +--log(ベースラインツールによって作成される,出力結果の入ったディレクトリ)
|  |  +--cross_test_all.log(ベースラインツールによって作成される,サブミット可能なファイル)
|  |  +--cross_*.f(素性ファイル)
|  |  +--cross_*.model(学習されたモデルファイル)
|  |  +--cross_*_dev.f(交差検定時に学習に用いられれる素性ファイル)
|  |  +--cross_*_test.f(交差検定時にテストに用いられる素性ファイル)
|  |  +--cross_*_test.log(交差検定の各結果,サブミット可能なファイルはこのファイルを集計したもの)

BC、MCタスク別の実行

ver2.0からMCタスクにも対応しました。学習対象のデータ中のラベルがYまたはNのみであるときにBC、それ以外ではMCタスクと自動判定します。ユーザが明示的にモードを指定する必要はありません。

  • BCタスク
    • 全ての学習アルゴリズムが利用可能で、YとNの二値分類器として学習されます。
    • 学習器の出力値が0以上であるときにY、それ以外ではNに分類されます。
    • 学習器の出力値は、標準シグモイド関数によって0~1のスコアに変換されます。
  • MCタスク
    • Classiasのpegasos.hingeとtruncated_gradient.hinge以外のアルゴリズムが利用可能です。
    • F、C、Iの多値分類器として学習されます。t1がt2を含意する、すなわちFに分類されたとき、t2がt1を含意するかも分類され、こちらもFに分類されたときのみBに分類されます。Bのスコアは2回の分類時のスコアの平均値となります。
    • 学習器の出力値は、標準シグモイド関数によって0~1のスコアに変換されます。

システム開発のための交差検定

ターミナル上で以下のように実行

  1. $ python baseline-2.0/main.py -d RITE2_JA_dev_bc.parsed.unidic.xml
    • -d で交差検定に用いるファイル名を指定(RITE2_JA_dev_bc.parsed.KNP.xmlなど)
    • -g で交差検定の分割数を指定(デフォルトは10)
    • -a で学習アルゴリズムを指定(デフォルトはClassiasを用いない平均化パーセプトロン)
    • -l で結果を出力するディレクトリを指定(デフォルトはlog)
  2. 結果が出力されたディレクトリ(デフォルトでは作業ディレクトリ直下にあるlog)の中にあるcross_test_all.logが,サブミット可能なファイル
  3. 評価ツールを用いて評価
    • $ java -jar rite2eval-1.1/rite2eval.jar -g RITE2_JA_dev_bc.parsed.unidic.xml -s log/cross_test_all.log

フォーマルランデータに対する含意認識

ターミナル上で以下のように実行

  1. $ python baseline-2.0/main.py normal -d RITE2_JA_dev_bc.parsed.unidic.xml -t RITE2_JA_test_bc.parsed.unidic.xml
    • -tで指定されているフォーマルランデータはまだ公開されていません

使い方(詳細)

実行コマンド

python main.py MODE [options]

実行モード MODEにて指定
  • 通常モード (normal)
    • python main.py normal … で実行します.
    • 指定された訓練データセットを用いてモデルを訓練した後,指定されたテストデータを用いてテストを行います.
  • 交差検定モード (cross)
    • python main.py cross … で実行します.
    • 指定された訓練データセットを用いて交差検定を行います.
オプション optionsに指定

プログラムで指定できるオプションの一覧です。このうち、データセットのパスは必ず指定する必要があります。

  • -a NAME
    • 学習に用いる学習アルゴリズムを指定します。利用できるアルゴリズムは以下の通りです。without_classias 以外のアルゴリズムを使用するためには、Classiasをインストールする必要があります。
    • デフォルトはwithout_classiasが選択されます。
    • MCタスクでは、二値分類のみに対応するpegasos.hinge、truncated_gradient.hingeは利用できません。
    • 全てのアルゴリズムにおいて、学習器の出力値はシグモイド関数によって0~1に変換されます。変換を行わず、学習器の出力のままにする場合は、後述の–no-sigmoidオプションをご利用ください。
      • without_classias
        • 平均化パーセプトロンで学習します。Classiasのインストールを必要としません。Classiasに比べて実行時間が長くなります。
      • lbfgs.logistic
        • L-BFGS法もしくはOW-LQN法による勾配降下法でL1/L2正則化付きロジスティック回帰モデルをバッチ学習します。
      • averaged_perceptron
        • 平均化パーセプトロンで学習します。
      • pegasos.logistic
        • Primal Estimated sub-GrAdient SOlber (Pegasos) による確率的勾配降下法で、L2正則化付きロジスティック回帰モデルをオンライン学習します。
      • pegasos.hinge
        • Primal Estimated sub-GrAdient SOlver (Pegasos) による確率的勾配降下法で,L2正則化付きL1損失SVMをオンライン学習します.
      • truncated_gradient.logistic
        • Truncated Gradientによる確率的勾配降下法で、L1正則化付きロジスティック回帰モデルをオンライン学習します。
      • truncated_gradient.hinge
        • Truncated Gradientによる確率的勾配降下法で、L1正則化付きL1損失SVMをオンライン学習します。
  • -d NAME
    • 訓練データセットのファイルパスを指定します。
  • -t NAME
    • テストデータセットのファイルパスを指定します。交差検定モードでは指定する必要はありません。
  • -l NAME
    • ログファイルを出力するディレクトリの名前を指定します。このオプションを指定しなかった場合のディレクトリ名は log になります。
  • -g NUM
    • 交差検定におけるデータセット分割数を指定します。初期値は 10 です。
  • -p NAME=VALUE
    • 学習アルゴリズムの各種パラメータを指定します。NAME がパラメータ名、VALUEがその値に対応しています。利用できるパラメータ名や値の型は、学習アルゴリズムごとに異なります。
    • without_classias 以外のアルゴリズムで利用できるパラメータはClassiasの仕様と一致しています。それらのアルゴリズムで指定できるパラメータについてはClassiasのマニュアルを参照してください。
      • 以下には without_classias で指定することのできるパラメータを示します。
        • eta=VALUE
          • 学習アルゴリズム開始直後の学習率を指定します。デフォルト値は 0.1 です。
        • max_iterations=NUM
          • 学習における反復回数の上限値を指定します。デフォルト値は 1000 です。
        • period=NUM
          • 目的関数の収束を判別する反復数を指定します。デフォルト値は 20 です。
        • epsilon=VALUE
          • 目的関数の収束を検出する閾値を指定します。
        • periodパラメータで指定された値をKとすると、過去K回の反復で得られた目的関数の分散を計算し、その分散の値を max(1, |現在の反復で得られた目的関数値|) で割った値がVALUE値を下回ったとき、学習アルゴリズムを停止させます。デフォルト値は 0.001 です。
  • –no-sigmoid
    • 本オプションを追加すると、学習器の出力値に対してシグモイド関数を適用せず、そのまま出力されるようになります。通常は利用する必要はありません。シグモイド関数以外の変換を利用したい場合などにご指定ください。

素性の開発

入力から素性を抽出する処理は src/feature.py の中の関数 getFeature(pair) で行なっています。getFeature は、引数としてPairインスタンス pair を受け取り、返り値として pair の素性をハッシュテーブルで返す関数になっています。返り値のハッシュテーブルは、キーが文字列型で、値が実数型です。解析に用いる素性を変更したい場合には、この関数の内容を編集してください。

クラスリファレンス

Pair

文対の情報を表すクラス。

  • メンバ変数
    • attr : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこのインスタンスについて記述された属性を保持している。
    • text : Sentenceクラスのインスタンス。
    • hypo : Sentenceクラスのインスタンス。
Sentence

一文の情報を表すクラス。

  • メンバ変数
    • attr : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこの文について記述された属性を保持している。必須の属性として text, id を持つ。それぞれ、元文、判別用のIDを指定する。
    • chunks : Chunkクラスのインスタンスのリスト。文を構成する各文節の情報を表す。
    • annotation : ハッシュテーブル(キー:文字列、値:文字列)のリスト。xmlファイル内で記述されている、この文のアノテーションの際に用いられたツールに関する情報を保持している。
  • メソッド
    • getHeadChunk(idx) : idx番目の文節の、係り先の文節を返す。係り先が存在しない場合は False を返す。
    • itertokens() : 文に含まれる全ての形態素を走査するジェネレータを返す。
    • find_token(attr) : 引数として指定した属性に一致するような形態素を探し、見つかればそのインデックスを (文節インデックス,形態素インデックス) のタプル形式で返す。例えば sent.find_token({'surf':'食べる'}) とすると、文中から表層形が「食べる」である形態素を探す。なお、引数に複数の属性を指定した場合は、それらを全て満たすような形態素を探す。
Chunk

文節の情報を表すクラス。

  • メンバ変数
    • attr : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこの文節について記述された属性を保持している。必須の属性として id, head を持つ。それぞれ、文節ID、係り先文節IDを示す。IDは文字列として c0, c1 … といった形式を取る。係り先が無い場合は c-1 とする。任意の属性として type, score を持つ。それぞれ、係りタイプと解析器の確信度を示す。
    • toks : Tokenクラスのインスタンスのリスト。文節を構成する各形態素の情報を表す。
  • メソッド
    • head() : この文節の係り先のインデックスを、整数型に変換した上で返す。attr['head'] を呼び出すことと等価だが、attr['head'] の場合は値の型が文字列型となるため、基本的にはこちらを用いた方がよい。
    • find(attr) : 引数として指定した属性を持つような形態素を探し、見つかればそのインデックスを返す。見つからなければ -1 を返す。複数の属性を指定した場合は、それらを全て満たすような形態素を探す。
Token

形態素の情報を表すクラス。

  • メンバ変数
    • attr : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこの形態素について記述された属性を保持している。必須の属性として id, surf, orig を持つ。それぞれ、形態素ID、表層、原形を示す。IDは文字列として t0, t1 といった形式を取る。任意の属性として head を持つ。これは係り先の形態素IDを示し、形態素単位の係り受け解析を行った場合のみ使用される。任意の属性として pos, pos1, pos2, pos3, pos4, read, con, conType, pron を持つ。pos は品詞情報、pos1~pos4 はその細分類を示す。read は読みを、con は活用形を、conType は活用型を、pron は発音時の読み方を示す。
    • pred : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこの形態素の述語項構造に関して記述された属性を保持している。したがって、述語となる形態素以外ではこの変数は空辞書となる。すなわち、形態素が述語であるかどうかは、この変数が空かどうかで判別できる。必須の属性として type をとり、値は述語のタイプを示す。任意の属性として格関係をとり、値は形態素IDを示す。格関係は ga, wo, ni, kara, he, yori, to, de, no, ga2 の10種類である。
    • modal : キー・値ともに文字列型で表されるハッシュテーブル。xmlファイル内でこの形態素の拡張モダリティ情報に関して記述された属性を保持している。xml内に記述の無い形態素についてはこの変数は空となる。必須の属性として assumptional, sentiment, focus, tense, type, authenticity, source を持つ。これらは「モダリティ情報タグ付与コーパス作成の作業基準 version 0.7」の3ページと対応している。

素性抽出の例

textのBagOfWords
for tok in pair.text.itertokens():
    key = 'bow_text(%s)' % tok.attr['orig']
    feat[key] = 1.0
text内に出現する名詞の連続
for chk in pair.text.chunks:
    nouns = []
    for tok in chk.toks:
        if tok.attr['pos'] == '名詞':
            nouns.append(tok.attr['surf'])
            if len(nouns) > 1:
                key = 'nns(%s)' % ','.join(nouns)
                feat[key] = 1.0
            else:
                del nouns[:]
pairにおける文間の述語一致
preds_t = set((tok.attr['orig'] for tok in pair.text.itertokens() if bool(tok.pred)))
preds_h = set((tok.attr['orig'] for tok in pair.hypo.itertokens() if bool(tok.pred)))
for pred in (preds_t & preds_h):
    key = 'co_pred(%s)' % pred
    feat[key] = 1.0

更新履歴

  • 2013.3.22: Ver.3.0 リリース
  • 2012.9.7: Ver.1.1リリース
    • デフォルトエンコーディングをutf-8に変更
  • 2012.9.6: Ver.1.0リリース

評価ツール

BC, MCサブタスクの評価ツール

各サブタスクについて,システムの出力を評価するツールを提供しています.

ダウンロード後,展開して,以下のように使います.

$ java -jar rite2eval.jar -g data/sample_mc_g.xml -s data/sample_mc_s.txt

data/sample_mc_s.txtは含意関係認識システムによって出力されるファイルで,以下のようにサブミット可能な形式です.

1 I 1.0
2 I 1.0
3 B 1.0
...

評価結果は以下のように,関係ごとの精度,再現率,F値の他に,全体の正解率とマクロF値およびコンフュージョンマトリックスが出力されます.

------------------------------------------------------------
|Label|    #|          Precision|             Recall|    F1|
|    C|    1|  0.00(    0/    0)|  0.00(    0/    1)|  0.00|
|    B|    3|100.00(    2/    2)| 66.67(    2/    3)| 80.00|
|    F|    1|  0.00(    0/    2)|  0.00(    0/    1)|  0.00|
|    I|    5| 66.67(    4/    6)| 80.00(    4/    5)| 72.73|
------------------------------------------------------------
Accuracy:	60.00(     6/    10)
Macro F1:	38.18 

Confusion Matrix
-----------------------------
|gold \ sys|   C   B   F   I|
-----------------------------
|         C|   0   0   0   1|
|         B|   0   2   1   0|
|         F|   0   0   0   1|
|         I|   0   0   1   4|
-----------------------------

システム出力として,配布データと同じXML形式を利用することもできます.

$ java -jar rite2eval.jar -x -g data/sample_mc_g.xml -s data/sample_mc_s.xml

本ツールのオプションは以下のとおりです.

$ java -jar rite2eval.jar [options] -g [gold-data] -s [system-output-file]
  -t	system-output-file is a tab-delimited or space-delimited format
  -x	system-output-file is a rite xml format (default)

システム出力のフォーマットが正しいかどうかを確認する場合は、以下のコマンドを実行します。

$ java -jar rite2eval.jar -s [system-output-file]

正しい場合は、

The format of this file is valid.

と表示されます。

Unittestデータ評価時には、Unittestデータに含まれる言語現象のカテゴリごとの評価結果が出力されます。

更新履歴

  • 2012.9.6: ユニットテストの評価に対応
  • 2012.7.23: リリース

大学入試サブタスクの評価ツール

大学入試サブタスクは、含意関係ラベルの精度に加えて、試験の正答率も評価します。

ダウンロード後、展開して、以下のように使います。

$ python rite2examscore.py -g RITE2_JA_dev_exam.ans -s sample_exam_run.txt

RITE2_JA_dev_exam.ans は試験問題の正答表です。sample_exam_run.txt は含意関係認識システムによって出力されるファイルで、以下のようにサブミット可能な形式です。

1 Y 0.8
2 N 0.6
3 Y 1.0
...

評価結果は、以下のように、まず各科目ごとの正答率と正答数が表示され、その後、各設問の結果が表示されます。JA, JB, MS, PE, WA, WB は、それぞれ日本史A、日本史B、現代社会、政治・経済、世界史A、世界史Bです。

===== SUMMARY =====
JA2009: 0.285714 (4/14)
JB2009: 0.312500 (5/16)
MS2009: 0.173913 (4/23)
PE2009: 0.291667 (7/24)
WA2009: 0.200000 (5/25)
WB2009: 0.266667 (8/30)
 TOTAL: 0.250000 (33/132)
===== EVALUATION RESULTS =====
JA2009
  ID: EVAL     GLD/SYS    TYPE         GOLD LABELS              SYSTEM LABELS
   5: WRONG    1/4        choose-Y     1=Y,2=N,3=N,4=N          1=Y(0.456869),2=Y(0.554831),3=Y(0.599073),4=Y(0.695192)
   9: WRONG    9/11       choose-Y     8=N,9=Y,10=N,11=N        8=N(0.856898),9=N(0.844198),10=N(0.190628),11=Y(0.253200)
...

お問い合わせ先

RITE2オーガナイザ: ntc10-rite2-organizers (at) cs.cmu.edu