Beatrust techBlog

Beatrust 開発者ブログ

日本語辞書ありキーワード抽出器からの多言語辞書なしキーワード抽出器の Distillation

Beatrust の tatsuya(白川)です。Beatrust は 人々の経験や強みを可視化して、自由に繋がり、協業・共創できる環境を作る という Mission を達成するためのサービスづくりとお客様への提供・活用促進活動を行っています。

beatrust.com

キーワード抽出は Beatrust の基礎技術のひとつなのですが、これまで Beatrust で開発していたキーワード抽出器は辞書を用いたルールベースのものだったので、辞書外のキーワードを抽出できないというデメリットがありました。Beatrust のお客様は様々な業界に渡っており、それぞれ固有の専門用語や社内でのみ通用する社内用語なども多く、辞書ベースの方法ではそれらのキーワードを抽出することは現実的に不可能でした。

今回そんな状況を鑑みて、辞書ベースのキーワード抽出器を用いて、辞書なしのキーワード抽出器を学習するというチャレンジを行い、一定の成果が得られたのでご報告したいと思います。今回のチャレンジを実行したのは、国内外から Beatrust をお手伝いいただいている鈴木宏和さん神代洋明さんによるものですが、白川が代表して執筆しております。

なお、現行のキーワード抽出器については下記のブログでも触れているのでご参照ください。 tech.beatrust.com

本記事でご紹介したいこと:

  • 辞書を用いた現行のルールベースのキーワード抽出器の課題
  • BERT の fine tuning によるルールベースキーワード抽出器を mimic 可能
  • 多言語コーパスで事前学習された BERT を使うことによるキーワード抽出機能の多言語転移
  • 恒例のご宣伝(ご一緒できる仲間を絶賛募集中です!)

Beatrust におけるキーワード抽出

前回の記事でもご紹介しているのですが、Beatrust では現状二箇所でキーワード抽出機能を提供しています。 一つは Beatrust People におけるタグサジェスト機能で、もう一つは Beatrust Ask(組織のメンバーに自由に質問・共有できるサービス)におけるキーワードサジェスト機能です(かたやタグでかたやキーワードで呼び名が異なっているのはコダワリポイントなのですがそちらはまた)。いずれの機能もテキストからキーワードを抽出してくる機能と、テキストに関連度が高いキーワードを提示する機能がベースになっています。

f:id:daynap1204:20210713162517p:plain
Tag & Keyword Suggestion

キーワードはコンテンツの内容を端的に表す Beatrust における中心的なサマリ情報です。さまざまな機能で使われているため、キーワードサジェストにおいては、関連性が高く多様なキーワードを可能な限りもれなく選定する必要があります。現状のキーワードサジェスト機能は、下記のように、キーワード抽出結果と関連キーワード推定結果を組み合わせて出力しています。

f:id:daynap1204:20210720084621p:plain
Keyword Suggestion

前回の記事にも書いているのですが、とくに関連キーワードを作る際は何らかの制約を入れないととんでもない語が選ばれることもあります。そのため、辞書を使って出力を限定することは実用上非常に重要です。その際、出力されるキーワードのカバレッジをあげるためには、辞書中の語を拡充する必要があります。Beatrust ではそれを実現するためにサービス上に蓄積されるデータやクローリングで得たデータなどを用いて、キーワードの収集・追加・整備を行っています。現時点では、辞書にはクリーニングされた状態で数万語が登録されています。

一方で、キーワード抽出に関してはユーザー自身が書いた文書から抽出されるため、抽出される語を辞書中の語に限定する必要性は相対的に低いです。そのため、辞書を用いないキーワード抽出器を構築することは現実的な選択肢になります。しかしそれを学習させるデータを作るためのアノテーションコストは馬鹿にならないですし、そもそも何をキーワードにすべきかというのをfixするのが難しいです。まずはきっちり動く機能を手早く作りたかったのもあり、現状では辞書を用いたルールベースの抽出器(spaCy の PhraseMatcher を用いたルールベースのものです)を育てていました。

今回ご紹介するのは、そんなキーワード抽出器を辞書なしで動作させるための改善施策です。

辞書ありキーワード抽出器を用いた辞書なしキーワード抽出器の弱教師あり学習

Beatrust でメンテナンスししてるキーワード辞書(Entity 辞書)にはすでに数万のキーワードが含まれており、それをもとにした現行の辞書ありキーワード抽出器は、一般用語に限定するとそれなりの精度で動作できているのではと思っています。下記は現行のキーワード抽出の例です。

f:id:daynap1204:20210719161437p:plain

一方で、社内用語や特殊すぎる専門用語については、汎用の辞書でそれらをカバーするのは困難であり、専門性・特殊性の高い文章の場合、キーワードの取りこぼしが多いという欠点がありました。上記でも、たとえば「NTTデータ数理システム」、「ABEJA」などの用語はとれていません。これは辞書にこれらの語を登録していないからなのですが、どんな語を登録すればよいか、というのは辞書整備上の一大テーマです。やたらめったら登録すればいいわけではなく、登録することにより挙動が変になったりするケースもあるため、結構注意を要します。

そのため、辞書を使わないキーワード抽出器をつくることはとても魅力的に思えるのですが、それを学習させるための準備(主にアノテーション)が結構大変そうで、導入をためらっていました。

今回、そんな辞書なしのキーワード抽出器構築の第一手として、既存のキーワード抽出器を Teacher Model として、辞書なしのキーワード抽出器(Student)を蒸留(distillation)する戦略を試してみました。

この方法の利点は、追加のアノテーションが不要なことです。これまでの経験からも、「細かいことを考える前にとにかくデータを集めてアノテーションをせよ」というのは一定の真理だと思っているのですが、ことキーワード抽出に関しては、下記のようなハードポイントがあって、できる限りアノテーションをしないで済ませたいと思っていました。

  1. 何をキーワードとして定義するのかを決めるのが難しい。しかもそれを決めたとしてその定義をアノテーターの方にインプットするのが難しい
  2. アノテーションが思いの外大変。たいていのツールではキーワード部分にマーキングするのですが、結構悩みます。また、世の中のツールだとキーワードにラベルもつけられるようになっている事が多く、今回ラベル情報は不要なため、わざわざラベル付けしないといけないのは作業としてノイジー
  3. 1、2に関連して、大量のアノテーションデータを確保するのが大変。我々はスタートアップだしスピード命なのでできるだけチャキチャキやりたい。
  4. しかも日本語以外に例えば英語も対象としたい

このアイデアを実現するに当たって、今回は huggingface/transformers で公開されている bert-base-multilingual-cased を使用しました。固有表現抽出においてはサブワード分解なしのほうが精度が出やすいとか、tokenize もできるだけ長い単位(たとえばsudachiだったら C 単位)でやったほうが精度が出やすいとかの話はちらほら聞いたりするのですが、その辺のチューニングや BERT 自体の再学習はまた今度検証するとして、今回はまずはアイデアの実現可能性を検証しました。また、もともとはひとまず日本語のみにフォーカスして進めようと思っていたのですが、最新の transformers を使う上での便から(意図せず)multilingual な学習済み BERT モデルを使っています。

以下は今回の仕組みアーキテクチャです。token に対して IOB タグを分類機として予測しています。

f:id:daynap1204:20210719231917p:plain
辞書ありキーワード抽出器の学習済み BERT モデルでの蒸留

学習は下記のようなプロセスになります。なお、IOB タグに関してはこちらなどをご参照ください(固有表現/キーワードの開始位置に B を、その後のキーワード継続位置には I を、それ以外には O を付与するアノテーションです)。 kzinmr.hatenablog.com

  1. 独自に収集したコーパスに対して、既存のキーワード抽出器でキーワードを特定する
  2. sudachi でコーパス中のテキストを tokenize しつつ、1 の情報をもとに IOB タグを付与する
  3. BERT モデルで使用している wordpiece を用い、2 の token をサブワード分解する
  4. サブワード分解にあわせ、適宜 alignment をとりながら IOB タグを付与する
  5. 4 の IOB タグを予測するよう、分類用に last layer を載せ替えた BERT モデルを fine tuning する

実は既存のキーワード抽出器では sudachi(正確には GiNZA)で tokenize しているのですが、今回使った BERT モデルは wordpiece で分解しています。そのため、まず IOB タグ付与の部分でちょっと不自然ですが、サブワード分解しつつ IOB タグをサブワードに反映する処理を行っています。また出力時には token 単位のキーワードがほしいので、BERT から出力されたサブワード単位の IOB タグに対して適当に alignment をとることで、sudachi 準拠の tokenization に合わせる後処理をしています。たとえば「白川達也は Beatrust で機械学習をしています」という文を入力すると、サブワード分解をかましているために「白川達」という部分のみがキーワード抽出されたりしますが、この後処理のおかげでキーワードが「白川達也」まで延長されます(未知語 [UNK] の扱いが雑だったり論理が粗いのでまれに失敗しますが…)。

結果

以下は実際にこの仕組で学習したときの成果です。今回学習に使ったコーパスの情報は下記のとおりです(基本的にはコーパスに既存のキーワード抽出器を適用しただけなので学習データを作成するのはほぼ自動です)。

  • 言語: すべて日本語
  • 文数: 6437 文
  • 平均文字数: 64.4 文字
  • 平均キーワード数: 4.1 個
  • ユニークキーワード数: 7870 語

まず、鈴木さん、神代さん、白川の Beatrust 上でのプロフィールにたいして、現行キーワード抽出器と次世代版キーワード抽出器の比較をおこなってみました。

f:id:daynap1204:20210719172002p:plain
現行キーワード抽出器と次世代版キーワード抽出器の比較(プロフィール)

上記のとおり、既存の辞書ベースのキーワード抽出だと抽出できていないキーワードも抽出できていることがわかると思います。たまたまかもしれませんが、現行版で抽出できていたキーワードは次世代版でもすべて抽出できていました。カバレッジの向上には今回作ったモデルは寄与しそうです。

一方で人名やもともと辞書が弱かった分野などは抽出に失敗している傾向も見れました。下記は弊社代表原のインタビュー記事Wikipedia の大谷翔平の記事の一部に対して適用したものです。

f:id:daynap1204:20210719174809p:plain
現行キーワード抽出器と次世代版キーワード抽出器の比較(原さんインタビュー & 大谷翔平

現行の辞書は主に動作の安定化のため、人名や社名を入れすぎないようにしたり、ドメインをある程度限定したりしています。そのため、苦手なタイプのキーワードやドメインがあります。今回学習したモデルも辞書あり抽出器の内挿モデルなので当然ですが、その特徴を思いっきり受け継いでいるようです。今後、辞書への語彙追加とさらなる学習が必要そうです。辞書に語を登録するのは本来はある程度慎重に行うべきものだと認識しているのですが、BERT 学習用途に限るのであれば、ある程度やんちゃに辞書登録しても大丈夫かもしれません。今後検証してみたいと思います。

次に先述の通り、今回は実は multilingual な BERT モデルを使っています。学習では日本語のコーパスのみを用いていますが、BERT モデルが multilingual に学習されている場合、日本語のコーパスでのキーワード抽出は他言語での挙動にどのような影響を与えるのでしょうか?個人的にはこれが一番学術的な興味があります。

まずこちらは弊社のメンバーページから弊社の創業者二名と私のプロフィール文を例に今回の BERT ベースのモデルを適用したものです。

f:id:daynap1204:20210719200048p:plain
日英プロフィールへの適用結果

日英ともに若干ばらつきはありますが、両者ともそれなりにキーワード抽出ができていそうです。まだアラが目立つので今後アノテーションなどを重ねて改善したいです。

つぎは wikipedia の 2020 年東京オリンピックについての記事の日本語版英語版に適用してみました。

f:id:daynap1204:20210719192904p:plain
日本語で学習した次世代キーワード抽出器の日英文での抽出結果

こちらもとくに英語版が取りこぼしも多いなという印象ではありますが、やはりある程度の抽出はできています。

日本語コーパスと辞書だけを使って fine tuning をしただけで、英語でもこの程度の抽出ができるというのは驚きでした。

※ なお、この英語版の結果ですが、実は tokenizer を sudachi のままにしてしまっているので、その点では全く正しくない tokenize をしている可能性はあります。スペース区切りの場合は経験的にほぼ単語単位に区切れてくれるので、まずはお試しとしてそのまま試しています。今後こちらも改善したいです。

最後に半分おふざけで同じ wikipedia の記事のアラビア語版で試してみました。さすがにアラビア語は読めないので、抽出結果(数字は出現回数)だけ Google 翻訳にかけてみました。

f:id:daynap1204:20210719200800p:plain
2020 年東京オリンピックアラビア語)での結果

おそらく結果は粗いと思うのですが、それでもそれっぽい結果がでていそうです。 今回の multilingual な BERT モデルは 104 言語に対応しているらしいので、今回の試みにより、我々は 104 言語に対応したキーワード抽出器(のベースライン)を作れてしまったのかもしれません!!!

さいごに

本記事では辞書ベースのキーワード抽出器の結果を mimic する BERT モデルを日本語コーパスを使って学習することで、どんなキーワード抽出器が得られるのかの検証を行いました。結果、既存の辞書ベースのキーワード抽出器よりもカバレッジの面で優れたモデルを作れたように感じています。また、多言語コーパスで学習された BERT モデルを使ったおかげで、日本語以外(104 言語!)でもそれなりの動作をするモデルができていそうなことも確認できました。今後、アノテーションをして評価データを作るなりして、数値的にも評価していきたいです。

まだまだ改善中でこれからプロダクトに載せようとしている次世代モデルなのですが、辞書を用いた単一コーパスのルールベースモデルからの蒸留で、これほど汎用性のあるモデルができるというのは新たな発見でした。辞書拡充していけば BERT モデルの精度も上がっていくと思えばとても気が楽です。非常に雑な学習しかしていないため、今後非常に育てがいがあります。楽しみです。

重ねてですが、今回の実験は弊社をお手伝いいただいている鈴木さん、神代さんによるものでした。やりたいことやらねばならないことが溢れていて目の前の仕事に追われがちな中で、このような思考をジャンプさせるような面白い成果をご一緒に出すことができてとてもうれしいです。いつもありがとうございます。

最後に、Beatrust では 人々の経験や強みを可視化して、自由に繋がり、協業・共創できる環境を作る という Mission を実現するためのサービスづくりとお客様への提供・活用促進活動を行っています。データの蓄積・活用はサービスのコアなのですが、それを一緒に実践してくれる方が圧倒的に足りていません!本記事もしくは Beatrust 自体にご興味持っていただけた方がいらっしゃいましたら是非ご一緒しましょう!私自身にもお気軽にお声がけください。

careers.beatrust.com twitter.com