🤗

BARTを用いた新しい固有表現抽出手法の紹介

2021/12/17に公開

こんにちは、fujisyo32です。今年の9月まで大学院で自然言語処理の研究をやっており、今年の10月からSansan株式会社に入社した者です。業務外では自然言語処理技術を追ったりする他に分析コンペや競プロとかもやったりしています。

この記事は、Sansan Advent Calendar 2021 17日目の記事です。


はじめに

今日は、BARTを用いて、固有表現抽出を行う手法、Template-Based Named Entity Recognition Using BART を紹介します。この研究は自然言語処理の国際会議ACL2021に採択されています。著者による実装が公開されているので記事の後半で日本語で動かす実験をしています。

論文紹介

固有表現抽出とは

固有表現というのは固有名詞や時間表現、金額表現などの総称です。固有表現抽出は、「文に含まれている固有表現を抽出する」、「抽出した単語がどういう表現か(人名、組織名……)を推定する」の2つを行います。
入力

山田太郎は10月にXX株式会社に入社しました

出力

山田太郎:人名
10月:時間表現
XX株式会社:組織名

既存手法


画像は元の論文から引用したものです。文を単語単位で分割してEncoderに入力し、MLP(CRF)層を通して分類問題のように出力します。このEncoderの部分はBERTのような言語モデルを使う場合が多いです。

提案手法

前処理

ACL will be held in Bangkok.

という文に対して、

ACL is a conference entity.
ACL will is not an entity.
……
in Bangkok is not an entity.
Bangkok is a location entity.

という感じで、全てのスパンに対して文を作ります。Bangkok is a location entity.のような固有名詞を含む文は全て学習に利用し、そうでない文はサンプリングして一部だけ使います。実際の学習データは以下のようになります。

input,output
山田太郎は10月にXX株式会社に入社しました。,山田太郎は人名です。
山田太郎は10月にXX株式会社に入社しました。,10月は時間表現です。
山田太郎は10月にXX株式会社に入社しました。,XX株式会社は組織名です。
山田太郎は10月にXX株式会社に入社しました。,10月にXXは固有表現ではありません。
山田太郎は10月にXX株式会社に入社しました。,入社しましたは固有表現ではありません。
山田太郎は10月にXX株式会社に入社しました。,山田太郎は10月は固有表現ではありません。
加藤部長は昨日つけ麺を食べました。,加藤は人名です。
……

学習

やっていることはすごく単純で、先ほど作ったデータセットのinputの文を入力としてoutputの文を出力するようにBARTを学習します。

推論

推論するときは全てのスパンでそれぞれテンプレートを埋めてみて、どれが一番しっくりくるかのスコアを出します。最後にスコアが高い順に見ていって同じトークンを2回含まないように選びます。

この例だと「ACL willは固有表現ではない」ということと、「Bangkokが地名」ということを推論しています。

結果


CoNLL2003で実験したスコアです。Sequence Labeling-BERTが既存手法の章で紹介したモデルです。multi-template-BARTが提案手法の最も性能が出る設定であり、このタスクにおいて高い性能を発揮するモデルと同等の性能を示しています。


こちらはCoNLL2003で学習した後に、ラベルを追加して別のコーパスを学習する設定でのF1スコアです。上部の10,20,50,100,200,500は追加で学習するコーパスの1ラベルあたりの件数を示しています。Template-based-BARTは他の手法と比べて少ないコーパスでも高い性能が得られることがわかります。

実験

この記事を読んでいる方の半分くらいは「英語で性能が出ることはわかったけど、日本語はどうなの?」と思っていらっしゃることだと思います。私もそう思ったのでストックマーク社のデータセットを使って実験してみることにしました。

元の設定と変更したポイント

言語モデル

京大の黒橋研究室がfairseqに対応した日本語のBARTモデルを公開してくださっています。著者の実装はtransformersを利用していたので、最初はこの日本語BARTをいい感じにtransformersの形式に変換してやろうと思っていました。しかし、あまりうまくいきませんでした。とりあえず動くようにはしたのですが、明らかに<mask>トークンの予測などで不自然な出力をするようになってしまいました。(うまく変換する方法をご存知の方がいたら教えて欲しいです)

そのため、実験に用いた言語モデルはfacebook/mBART-large-cc25です。このmBARTというのはBARTをベースとした翻訳性能の向上を目的とした言語モデルです。日本語を含む多言語コーパスを使ってBARTに近い事前学習を行なっているため、日本語BARTと近い挙動をすることが期待できます。

推論時の挙動

著者の実装はスコアを\prod_{i=0}^N{p_{w_i}}のように計算しています。p_{w_i}は全語彙の中である単語w_iを出力する確率(0<p_{w_i}<1)で、トークンの出現確率の積を見て各々のスパンで最もそれらしいラベルとスコアを決めています。

長い固有表現がないという前提があればそれでも問題ないのですが、長いスパンほどスコアが小さくなってしまうため、このままでは長い固有名詞を捉えることができなくなってしまいます。日本語の実験では著者の実装そのままだとうまく動かず、固有表現をほとんど検出することができなくなってしまいました。

そこで、出現確率の積ではなくperplexityと呼ばれるものに変更しています。式で書くと
\frac{1}{N}\sum_{i=0}^N\log{p_{w_i}}のようになります。スパンの長さで割ってやることで長さの影響を受けにくくなることが期待できます。

ラベルの変更

論文中では英語での実験しか行っていなかったので、日本語のラベルを作る必要があります。ここでのラベルというのは、「人名」や「組織名」などのことです。mBARTのtokenizerは日本語をかなり細かく分割するため、分割後のトークン数が同じになるように設定しました。

結果

precision recall f1
baseline 66.75 68.77 67.74
proposed 56.14 54.16 55.13

baselineは既存手法の章で紹介したencoderにbert-base-multilingual-casedを使って出力にMLP層を使うモデルです。

性能に関してはパラメータの設定などは行なっていないので単純な比較はできませんが、従来手法と比較すると今ひとつでした。日本語でもそれなりにうまく動くことはわかったので、日本語のみで事前学習したBARTを使って、パラメータの調整や推論のスコアの計算方法をもう少し工夫すると改善するのかもしれません。

考察と感想

実際に実験した感想として学習時間はそこまで気になりませんが、推論時間がGPUを使っても非常に遅いのが気になりました。既存手法の章で紹介した手法と比べると、この手法の推論時間は(ラベル数+1)x(1文に含まれるスパンの数)倍です。例えばラベル数が12で1~9トークンで構成されるスパンを全て考慮するとすると、30トークンで構成される文に含まれるスパンは234個なので、 単純計算で推論時間はおよそ3000倍になります。 そのため、実際に使うには細かく分割しないトークナイザーを使ったり、候補となるスパンを絞り込む方法と併用するといった工夫が必要だなと思いました。

この手法の論文に書かれていなかったメリットとして学習データのアノテーションが雑で済むという点が挙げられます。スパンが固有名詞かどうかを一つずつ判断するため、ある文に固有表現が複数含まれている場合に全てアノテーションしておかないと性能が下がるといったことがありません。そのため現実にあり得るかはわからないですが、「推論時間は遅くてもいいから大量の雑なアノテーション済みデータで学習したい」という時に向いているのかもしれません。

最後に

この記事ではTemplate-Based Named Entity Recognition Using BARTという手法と日本語での実験について紹介しました。私は固有表現抽出以外の自然言語処理技術にも関心があるため、また何かの機会でそれらの紹介などもできればと思います。最後まで読んでいただきありがとうございました。

Discussion