ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

syntaxeval: 文の正しさの評価モデル [失敗]

文法的に正しそうな文かを判定するモデルを作成し、パッケージ化したのですが、全然うまくいかないということを紹介します。

プロジェクトの場所

https://github.com/sugiyamath/syntaxeval

準備

mecabjavaを入れてください。ubuntuなら以下です:

sudo apt install mecab libmecab-dev mecab-ipadic-utf8 default-jdk

syntaxevalのインストール

syntaxevalのインストールは、bashスクリプトによって書かれています:

git clone https://github.com/sugiyamath/syntaxeval
cd syntaxeval
./install

実行方法

from syntaxeval import Analyzer
analyzer = Analyzer()
result = analyzer.analyze("犬も歩けば棒に当たる。")
print(result['probabilities'], result['tree'])

なにがうまく行かないのか

まず、このモデルはこちらで作成していますが、テストセットにおける精度はそれなりによかったのです。

しかし、実際に現実の文に適用してみると、全然トンチンカンな出力をしてしまいます。

In [54]: a.analyze("ljが;lkjがだ")['probabilities']
Out[54]: {'syntax': 0.8, 'semantics': 0.9995695}

上記のように、本当は低く評価してほしい文を、高く評価してしまっています。

原因はなにか

結局、原因は学習に利用するデータにあるような気がします。学習時に、正例にkeyakiの文、負例にPCFGによって生成した文を渡していますが、現実の文はもっと多様です。そして、keyakiコーパスから作成したPCFGを用いてパースしているため、そこにない語彙への対応もできていません。そのあたりも問題点の一つです。

semanticsのモデルの方は、構文ではなく、文のテキストそのものをkerasで学習させたものですが、MCTSによって負例の生成を行っています。

学習データの負例が全く現実的にはありえない文になってしまっているのが原因だと思います。訓練データはもう少し多様な例があったほうが良さそうですが、それ自体が難しい課題です。