LoginSignup
15
21

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-03

はじめに

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

AllenNLP

AllenNLP は Allen Institute for Artificial Intelligence が開発している自然言語処理のライブラリです.
AllenNLp は非常に強力なツールなのですが,日本語のデータを扱いたい場合,予め形態素解析をしておく前処理が必要になることがあります.
SpacyGinza のおかげで, 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 形式です.
各行は idtext,および label のキーを持っています.

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

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

Konoha のインストール

今回は形態素解析器として 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'

{
  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 の AllenNLP インテグレーション機能の紹介を行いました.
日本語データを AllenNLP で扱う際にお役に立てば幸いです.

15
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
21