機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

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

それぞれの例は下図
f:id:kento1109:20171202125405p:plain
※「Support Vector Machine を用いた Chunk 同定」(工藤 2002)より引用

論文について



今回は、深層学習によりSOTAを達成した論文の実装例を見ていく。
タイトルは、
Neural Architectures for Named Entity Recognition
[1603.01360] Neural Architectures for Named Entity Recognition
この論文では、下記の2つの手法で実験を行っている。

  1. LSTM+CRF
  2. S-LSTM

ここでは、1. について取り上げる。

ちなみに論文自体の理解は下記のSlideShareでのまとめを参考にさせて頂いた。

www.slideshare.net


コードなどがある著者のgithubはここ
github.com

実行ファイルは2つある。

今回は、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のインスタンス変数にこれらの値を渡している。

ここまでが前処理

次でメインとなるモデル構築部分を見ていく。