Ahogrammer

Deep Dive Into NLP, ML and Cloud

辞書と生テキストから固有表現認識のモデルを学習させる

書いている本も山場を超えたので、ACL 2019の論文をパラパラと見ていたところ、以下の論文を発見。

この論文がどういう論文なのかというと、辞書と生テキストだけを使って固有表現のモデルを学習させるという論文。この論文の背景として、固有表現認識用のデータを作るのは非常にコストが高いという点がある。固有表現認識は系列ラベリングのタスクとして解かれることが多い。系列ラベリングとして解く場合、アノテーションツールを使って文中の「どこ」から「どこ」までが「どの固有表現タイプ」なのかというラベルを付ける作業をする必要がある。やったことのある人はよく分かると思うが、この作業には非常に時間がかかる。

f:id:Hironsan:20190826080919p:plain
アノテーションツール"doccano"での固有表現のラベル付け

論文で提案されている手法の特徴として、辞書が文中のすべてのエンティティをラベル付けする必要がない点、また、エンティティの一部をラベル付けすればいい点が挙げられる。従来手法だと、固有表現の辞書を用意して文中のテキストとマッチングする必要があった。しかし、その方法だと非常にカバレッジの高い高品質な辞書が必要だという欠点があった。仮に用意したとしても性能はそれほど出ない。それこそ、名前の組み合わせなど無限に近いので辞書のマッチングを行う方法には限界があるというわけだ。それに対して、論文の手法では完全なマッチングを必要としない。

f:id:Hironsan:20190826081430p:plain
ラベル付けの例(Distantly Supervised Named Entity Recognition using Positive-Unlabeled Learningより)

不完全なラベルから学習を行うために、論文では固有表現認識をPU学習(positive unlabeled learning)問題として定式化している。単なる教師あり学習ではなくPU学習として定式化しているのには理由がある。その理由は、用意した辞書が文中のすべてのエンティティをカバーできるとは限らない点にある。つまり、辞書を使ってラベル付けされなかったからと言って、エンティティではないとは限らないわけだ。たとえば、辞書に「安倍」という単語があり、テキストが「安倍晋三首相は・・・」だったとする。この時、辞書を使うことで「安倍」を人名としてラベル付けすることはできる。しかし、辞書にないからと言って「晋三」が人名で無いとは限らないということだ。

話をPU学習に戻すと、PU学習ではラベル付けされたデータをポジティブ(Positive)データ、それ以外はラベル付けされていない(Unlabeled)データとして学習を行う。普通は損失の計算はポジティブとネガティブなデータから計算するが、PUの場合は、ポジティブな例とラベル付けされてない例から計算する。ポジティブな方は普通に計算すればいいのであまり問題ではないので、問題はラベル付けされていないデータからいかにしてネガティブな方を推定するかという点にある。論文では、そのへんを上手いこと式変形することで、ポジティブデータとラベルなしデータから推定できると言っている。

f:id:Hironsan:20190826082635p:plain
論文中の損失の計算式(5)

ラベル付けのスキーマとしては単語がエンティティであるかないか(positive/negative)で行う。通常の系列ラベリングの場合、ラベル付けのスキーマとしてはIOB2やIOBESなどが使われることが多い。この論文でそれらのスキーマを採用しない理由としては、文中のラベルを完璧にラベル付けできるとは限らないという点にある。先ほどの例で言うなら、安倍がエンティティであることはわかるが、安倍晋三というエンティティの最初だということはわからないのでIOB2のようなスキーマを採用しないというわけだ。辞書とテキストのマッチングアルゴリズムとしては最長マッチを使っていて、最長の単語数を4としている。

モデルに関しては損失を除くと特別なものではないので割愛して、実験結果を示す。データセットとしては固有表現認識でよく使われている4つのデータセットを対象としている。まず、辞書だけを使って認識した結果は以下の通り。結果を見ると、適合率は高いが再現率が非常に低くなっていることがわかる。これは辞書のカバレッジの問題で、予測すべきところを予測できていないという点を示唆している。

f:id:Hironsan:20190826085934p:plain
辞書だけを使ってCoNLL2003に対する認識を行った結果

次に、学習させたモデルの結果を示す。図の左側半分は通常の系列ラベリングによる結果なので置いておくとして、注目すべきは図の右側半分。CoNLL2003の英語のデータセットに対する結果を見ると、最高でF1が82.94という結果になっている。SOTAなモデルがF1で93を超えることを考えると非常に低い値ではあるのだが、辞書をそのまま使った場合と比べると非常に大きな改善が見られる。MUCやTwitterのデータセットに対しては差は更に小さい。辞書と生テキストだけ用意すればいいことを考えると結構魅力的な結果になっている。

f:id:Hironsan:20190826090033p:plain
実験結果

いかがだっただろうか?プロトタイピングのアプリケーションに固有表現認識を組み込む場合、従来は辞書を用意してテキストとのマッチングをとっていたり、形態素解析器の辞書に組み込んだりしていた人も多かったのではないかと思う。そのような場合にこの論文で紹介されている手法を使うと、用意した辞書はそのままに、性能を改善することができるのではないかと思う。