はじめに
konoha という形態素解析ライブラリを開発しています.
このライブラリに対し, AllenNLP のインテグレーションを実装したので,今回はその紹介をします.
この機能を利用することで,日本語のテキストを分かち書きなどの前処理なしで allennlp train
コマンドに渡せるようになります.
AllenNLP
AllenNLP は Allen Institute for Artificial Intelligence が開発している自然言語処理のライブラリです.
AllenNLp は非常に強力なツールなのですが,日本語のデータを扱いたい場合,予め形態素解析をしておく前処理が必要になることがあります.
Spacy と 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
のキーを持っています.
{"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 を利用します.
以下のコマンドで 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 で扱う際にお役に立てば幸いです.