僕はまた、旅に出る。

僕はまた、旅に出る。

最近の固有表現抽出のメモ

お久しぶりです。

 

「固有表現抽出」と「固有表現認識」。今だに、どちらで呼ぶべきか悩んでいる僕ですが、とりあえず、最近の固有表現抽出のメモです。 

 

固有表現抽出の発展(NN~最近)

・[Collobert et al. 2011] : ここからNN手法が進み始めた。

・[Chiu and Nichols 2015] : Bi-LSTMモデル、CNNによる文字ベクトルと、素性の追加

・[Huang et al. 2015, Lample et al.  2016, Ma and Hovy 2016]:Bi-LSTM-CRFモデル

・[Sato et al. 2017, Ye and Ling 2018]:CRF部分の改良

・[Yang et al. 2017]:POS→NER、英語→ドイツ語、CoNLL2003→twitterなどタスク、言語、データの転移学習。前段レイヤーを共有し、後段レイヤーをそれぞれで学習。

・[Peter et al. 2017]:事前学習した言語モデルの出力を入力word embeddingや、前段のLSTMの出力にconcatして後段LSTMに入力。

・[Peter et al. 2018]:[Peter et al. 2017]の改良版。俗に言う「ELMo」です。固有表現抽出を含む、六つのタスクでSOTA。

・[Akbik et al. 2018]:文字単位で、文全体の文脈を見てembeddingを作る(contextual string embedding)。文字レベル、単語レベルも使ってSOTA。

 

[Yang and Zhang 2018]が最近の手法がすごくまとまっています(ELMo, contextual string embeddingの前まで)。

 

 現在では、RNNモデルを使うことが主流ですが、 CNNでの系列処理の論文も出ているようなので、CNN型のモデルも出てくるかもしれませんね。あと、翻訳ではRNN+attentionだったのが、RNN使わず(self-attention)になってSOTA出ましたし、まだまだモデル側を改良する話は出てくる気がします。

2018/08/18追記

semantic role labelingではモデルの提案があるので、応用できそうですね[Tan et al. 2018 AAAI]

画像情報+固有表現抽出

画像情報も使って、抽出精度を上げるという論文もありました。

・[Lu et al. 2018 ACL] Bi-LSTM-CRFモデルのLSTMに与える初期ベクトルを、「説明文」と「対応する画像」を用いた visual attention model から作成

・[Zhang et al. 2018 AAAI] Bi-LSTMの隠れ層とVGG-Net 16を用いて作った画像の素性ベクトルからattentionを計算し、隠れ層の値と組み合わせたのち、CRFへ入力

日本語

・[Misawa et al. 2017 ACL workshop] Char-Bi-LSTM-CRFモデル。データは毎日新聞記事コーパス。固有表現クラスは出現頻度の高かった「製品名・地名・組織名・時間」、pre-tokenizeにMecabを使用。

ニューラル固有表現抽出まわりで参考になる実装(github等)

フレームワークで開発された、知っている限りの実装です。

Chainer:deep-crf

Tensorflow:NeuroNER

Keras:anago

Pytorch:Advanced: Making Dynamic Decisions and the Bi-LSTM CRF (Pytorchチュートリアル)、NCRF++ 、flair

 そのほか、思っていること。

残念なのが、手法に関しては高性能なものが出てきた一方で、実タスクへの応用の際に問題になっているのは提供されている(様々なドメインの)日本語のデータがほとんどないことです。shared taskなんかでは、基本的には新聞ベースのフォーマルな記事を対象としているため、基本的な表現(人名・地名・組織名)のアノテーションデータしかありません。一方で、実社会でのデータを対象としたタスクでは、自分たちでデータの選定や、固有表現クラスの定義を行う必要があるため、やはりアノテーションが必要になってきます。多くの企業では自社内でデータ構築を行っているのかもしれませんね。

あとは、単語分割の単位がサブワードに変わるのかどうか、とか。現在の日本語の固有表現抽出では入力の際の前処理として、Mecabなどを使って単語分割してトークン化します。その後、トークンをvector化したり、embeddingを足したりしてNNへ入力しています。もしかしたら、機械翻訳のように単語分割の単位がサブワードに変わる可能性もあるのかなぁ、と。ただ、pre-trainのembeddingも入力しているので、大規模な日本語テキストで効きそうなのかは定かではないです。紹介した論文でも、一応文字単位で、文全体の文脈を見てembeddingを作っていますし、現状ではそれで十分なのかも知れませんね。

以上、メモでした。

 

まとまっている参考文献とSOTAが紹介されたgitリポジトリ

[Yang and Zhang 2018]:Design Challenge and Misconceptions in Neural Sequence Labeling

NLP-progress/named_entity_recognition.md at master · sebastianruder/NLP-progress · GitHub

 

気が向いたら追記します。