TheanoでNER(前処理)
NER(Named Entity Recognition)
系列ラベリングの一種。
日本語では、固有表現抽出と言われるタスク。
具体例としてはこんなの
太郎は5月18日に花子に会いに行った。
これに含まれる固有表現を抽出(タグ付け)すると以下となる。
<PERSON>太郎</PERSON>は<DATE>5月18日</DATE>の<TIME>朝9時</TIME>に<PERSON>花子</PERSON>に会いに行った。
by Wikipedia
タグのフォーマットとしては下記がある。
- IOB1
- IOB2
- IOE1
- IOE2
- IOBES
それぞれの例は下図
※「Support Vector Machine を用いた Chunk 同定」(工藤 2002)より引用
論文について
今回は、深層学習によりSOTAを達成した論文の実装例を見ていく。
タイトルは、
「Neural Architectures for Named Entity Recognition 」
[1603.01360] Neural Architectures for Named Entity Recognition
この論文では、下記の2つの手法で実験を行っている。
- LSTM+CRF
- S-LSTM
ここでは、1. について取り上げる。
ちなみに論文自体の理解は下記のSlideShareでのまとめを参考にさせて頂いた。
コードなどがある著者のgithubはここ
github.com
実行ファイルは2つある。
- train.py
- tagger.py
今回は、LSTM+CRFによりどのように固有表現を学習するかを見るためtrain.pyを読んでいく。
モデル構築で重要なのは、model.pyのbuild関数なので、そこを中心に理解していきたい。
では、中身に入っていく。
前処理(train.py)
まずは、コーパスの読み込み、Index変換など
Initialize model
model = Model(parameters=parameters, models_path=models_path)
でmodelインスタンスを生成している。
ただし、Modelクラスの__init__
では、引数のparameters
を自身の変数(インスタンス変数)に渡すのが主な役割。
(ここでモデルの構築などは行われていない)
Load sentences
コーパスの読み込み
戻り値のxx_sentences
は、list of sentenceの形。
各sentenceは、コーパスがこのような一行の場合、
RUGBY NNP I-NP I-ORG
sentence = [RUGBY, NNP, I-NP, I-ORG]
となる。
Use selected tagging scheme (IOB / IOBES)
タグのチェック&(IOB or IOBESの形に)更新
タグは、
tags = [sentence [-1] for sentence in sentences ]
で取り出している。
Create a dictionary / mapping of words
単語の辞書作成(フォーマットは、単語[頻度])
(事前学習済みのembeddingを指定した場合、embedding内の単語も辞書に追加)
Create a dictionary and a mapping for words / POS tags / tags
文字単位の辞書作成
タグの辞書作成
Index data
コーパスをIndexに変換
戻り値のxx_data
は、list of dictionariesの形。
各単語は、
- str_words:単語
- words:単語ID
- chars:その単語の文字IDのリスト
- caps:大文字小文字の情報(数値)
- tags:ラベルのID
の辞書形式。
Save the mappings to disk
id_to_word
, id_to_char
, id_to_tag
をcPickleで保存
ついでにmodelのインスタンス変数にこれらの値を渡している。
ここまでが前処理
次でメインとなるモデル構築部分を見ていく。