日本語解析ツール Konoha に AllenNLP 連携機能を実装した

### はじめに

<a href="https://github.com/himkt/konoha"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/himkt/konoha.png" width="460px"></a>

[konoha](https://qiita.com/klis/items/bb9ffa4d9c886af0f531) という形態素解析ライブラリを開発しています．
このライブラリに対し， AllenNLP のインテグレーションを実装したので，今回はその紹介をします．
この機能を利用することで，日本語のテキストを分かち書きなどの前処理なしで `allennlp train` コマンドに渡せるようになります．


### AllenNLP

[AllenNLP](https://allennlp.org/) は Allen Institute for Artificial Intelligence が開発している自然言語処理のライブラリです．
AllenNLp は非常に強力なツールなのですが，日本語のデータを扱いたい場合，予め形態素解析をしておく前処理が必要になることがあります．
[Spacy](https://spacy.io/) と [Ginza](https://megagonlabs.github.io/ginza/) のおかげで， Universal Dependencies （UniDic） が採用している単位であれば， AllenNLP で日本語データを扱うことは可能そうですが， 
個人的に MeCab (IPADic) や Sudachi， Sentencepiece を利用したいケースもあります．


### Konoha integration for AllenNLP

上記の形態素解析器を利用するため， Konoha に AllenNLP インテグレーションを実装しました．
（https://github.com/himkt/konoha/pull/71）
この機能を利用することで，多くの日本語の形態素解析器を AllenNLP 内で利用できます．
以降で実際にサンプルデータを用いてインテグレーションのデモを行います．


### データセット

今回はデモとして，分類問題のデータセットを利用します．
学習・テストデータは AllenNLP の `text_classification_json` が読み込める JSONL 形式です．
各行は `id`，`text`，および `label` のキーを持っています．

```json
{"id": 124, "text": "\"TensorFlow2.0が来ないのでもう良いよ！ってPyTorchに切り替えた翌日にTensorFlow2.0 previewが出たときの顔をしている\"", "label": 2}
{"id": 164, "text": "\"自分の研究について，ある検索キーワードを得た瞬間見覚えのない先行研究がわらわら出てくるやつ，体温が下がる瞬間\"", "label": 1}
```

なお，データは以下のリンクからダウンロードできます．

- https://konoha-demo.s3-ap-northeast-1.amazonaws.com/himkt-tweet/train.jsonl
- https://konoha-demo.s3-ap-northeast-1.amazonaws.com/himkt-tweet/test.jsonl


### Konoha のインストール

今回は形態素解析器として [Janome](https://mocobeta.github.io/janome/) を利用します．
以下のコマンドで Konoha をインストールしてください．

```
pip install 'konoha[janome,allennlp]'
```

Konoha は Janome, MeCab, Sudachi, KyTea, Sentencepiece をサポートしています．
例えば， MeCab を利用したい場合には `pip install 'konoha[allennlp,mecab]'` のようにオプションを変更してください．
現在利用可能な全機能を含んだ Konoha をインストールするためには， `pip install 'konoha[all_with_integrations]'` とコマンドを実行してください．


### Jsonnet 設定ファイル

Jsonnet ファイルを以下に示します．
もし Janome 以外の形態素解析器を利用したい場合，
`tokenizer` のセクションの `tokenizer_name: 'janome'` を利用したい解析器の名前に変更してください．
（例. `tokenizer_name: 'mecab'`）

```jsonnet
{
  dataset_reader: {
    lazy: false,
    type: 'text_classification_json',
    tokenizer: {
      type: 'konoha',
      tokenizer_name: 'janome',
    },
    token_indexers: {
      tokens: {
        type: 'single_id',
        lowercase_tokens: true,
      },
    },
  },
  datasets_for_vocab_creation: ['train'],
  train_data_path: 'https://konoha-demo.s3-ap-northeast-1.amazonaws.com/himkt-tweet/train.jsonl',
  validation_data_path: 'https://konoha-demo.s3-ap-northeast-1.amazonaws.com/himkt-tweet/test.jsonl',
  model: {
    type: 'basic_classifier',
    text_field_embedder: {
      token_embedders: {
        tokens: {
          embedding_dim: 128,
        },
      },
    },
    seq2vec_encoder: {
      type: 'cnn',
      num_filters: 128,
      embedding_dim: 128,
      output_dim: 128,
    },
    dropout: 0.3,
  },
  iterator: {
    batch_size: 10,
    type: 'basic',
  },

  trainer: {
    cuda_device: -1,
    num_epochs: 30,
    optimizer: {
      lr: 0.1,
      type: 'adam',
    },
    validation_metric: '+accuracy',
  },
}
```

### AllenNLP 実行コマンド

以下のコマンドで学習を実行できます．

```
allennlp train example.jsonnet -s result --include-package konoha
```

`--include-package konoha` とすることで， Konoha のインテグレーション機能を利用できます．

学習が終わったら以下のコマンドで予測結果を確認します．

```
allennlp predict --include-package konoha --use-dataset-reader result https://konoha-demo.s3-ap-northeast-1.amazonaws.com/himkt-tweet/test.jsonl
```

以下のように，日本語の平文が形態素解析され，ラベルの予測が行われていることが確認できます．

```
input 106:  Instance with fields:
         tokens: TextField of length 38 with text:
                [", TensorFlow, ，, ちょっと, 何, か, しよ, う, と, する, と, 200, 行, くらい, ド, カーン, って, エラー, 出し, て, くる, ので, 「,
                そんなに, 怒ん, なく, て, も, いい, じゃん, ...（, 半, べそ, 」, みたい, な, 感じ, "]
                and TokenIndexers : {'tokens': 'SingleIdTokenIndexer'}
         label: LabelField with label: 2 in namespace: 'labels'.'
```

### おわりに

[konoha](https://github.com/himkt/konoha) の AllenNLP インテグレーション機能の紹介を行いました．
日本語データを AllenNLP で扱う際にお役に立てば幸いです．