お久しぶりです。
「固有表現抽出」と「固有表現認識」。今だに、どちらで呼ぶべきか悩んでいる僕ですが、とりあえず、最近の固有表現抽出のメモです。
固有表現抽出の発展(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
気が向いたら追記します。