BERTによるニュース記事の構造化:企業名抽出

Tags
BERTによるニュース記事の構造化:企業名抽出
Page content

はじめに

Machine Learning部門の近江です。ストックマークでは、自然言語処理技術の研究開発を行っています。

先日、弊社のTech Blogにて弊社が公開している言語モデルを紹介しました。

ストックマークが公開した言語モデルの一覧と振り返り

今回は、言語モデルがプロダクトにおいて実際にどのように利用されているかについての一例を紹介します。

ニュース記事の構造化

マーケティング、新規事業開発などの調査業務では、調査を行う人が書籍、ニュース記事、ホームページなどの情報を網羅的に調べ、整理し、報告書などにまとめていきます。その際に扱う情報は膨大であり、そのため調査業務には多くの時間と労力がかかります。

弊社のプロダクトである「Astrategy」は機械学習を用いてニュース記事から特徴となる情報を抽出し、構造化することで、大量のニュース記事を効率的に俯瞰し、さらに新規事業開発などに繋がりうる情報の発見を促進することを目的としたものです。

Astrategyではニュース記事の構造化の一つとして、ニュース記事に現れる企業の名称を抜き出すということを行っています。これは、市場調査において市場にどのようなプレイヤー(企業)が存在するのかという情報は、非常に重要であるからです。今回は、この「ニュース記事からの企業名抽出」を例にして、言語モデルを用いた機械学習についての弊社の取り組みを紹介します。

企業名抽出の難しさ

機械学習でニュース記事から企業名を抽出すると聞いて、多くの人は「これは簡単なタスクだ」と思うのではないでしょうか?このタスクは人間にとっては非常に簡単です。しかしながら、以下でわかるように、これをコンピュータにやらせるのは意外と難しいものです。

企業名をテキストから抽出する最も単純なアプローチは、企業名を集めた辞書を用意しておき、辞書に含まれている企業名が文章中に含まれていれば、それを企業名と見なすというものです(辞書方式)。企業名の辞書としては、国税庁が公開している日本に存在する全ての法人を登録したデータベース(https://www.houjin-bangou.nta.go.jp/)があります。これを用いて、実際に次の文章に対して辞書方式の企業名抽出をしてみましょう。

「ストックマーク株式会社では現在、エンジニアを募集しています。」

これを見た時、多くの人は「ストックマーク株式会社」が企業名であり、それ以外に企業名は含まれていないということは簡単に分かるでしょう。しかし、実際に辞書方式を用いると、

  • 「ストックマーク株式会社」、「エンジニア」、「集」、「てい」、「ます」

の5つが抜き出されます。「ストックマーク株式会社」は正しく抽出されている一方で、「エンジニア」、「集」、「てい」、「ます」のように、このような名前の企業は実際には存在するものの、この文章では企業名ではない文字列まで誤って抽出してしまっていることがわかります。これは企業名として、ありとあらゆる言葉が使われているため、文章中の企業名以外の文字列が辞書に存在する企業名に意図せず一致してしまうことで起こります。このように、辞書方式だと企業名を正しく抽出できる場合もある一方で、人には企業名ではないと容易に判断できる文字列まで誤って抽出してしまい、結果としてうまくいきません。

また別の例ですと、米IT企業のAppleの動向を追いたい人が、企業名の「Apple」が含まれている記事を集めるとします。この時に各記事から辞書方式で「Apple」を抽出した記事を集めてくると、「Apple」が食べ物のりんごの意味で使われている記事まで含まれてしまい、全く関係のない記事まで含まれるというような問題も起こってしまいます。

さらに、辞書方式の別の欠点として、辞書に存在していない未知の企業は原理的に検出できないという問題もあります。しかしながら、まだあまり知られていないスタートアップ企業などの動向を認知することはビジネス上とても重要であり、未知の企業名を正しく抽出することは重要な課題です。

辞書方式に形態素解析やパターンマッチングを組み合わすことで幾分精度は向上するでしょうが、様々な文脈や表記の揺らぎなど多様な状況に網羅的に対応できるようになることは期待できません。

機械学習を用いた企業名抽出

辞書方式の問題は与えられた文字列のみから、それが企業名かどうかを判断する点です。それに対して、人は文脈(周辺の単語)に基づいて、それぞれの文字列が企業名かどうかを判断しています。コンピュータに文脈を読ませることは最近まで非常に難しい問題でしたが、近年、機械学習を用いて文脈を考慮する手法の研究が大きく進みました。機械学習を用いて企業名抽出を行う場合には、事前に文章と、文章中のどの箇所が企業名なのかをラベル付けした大量のデータをまず用意します。そしてその学習データを用いて、パターンをモデルに学習させることで、企業名抽出モデルを構築します。

一般に、文章に現れる人名、組織名、地名などの「固有名詞」を抜き出し、分類する問題は「固有表現抽出」と呼ばれています。Googleは汎用の固有表現抽出を行うためのAPIを有料で提供しており、デモは無料で試すこともできます。

https://cloud.google.com/natural-language?hl=ja#natural-language-api-demo

このGoogleのAPIを用いて、先ほどの「ストックマーク株式会社では現在、エンジニアを募集しています。」という文章を解析してみると、めでたく「ストックマーク株式会社」のみが組織名として抽出されました。(下図)



BERTを用いた企業名抽出に関する私たちの取り組み

今回、私たちはGoogleのAPIのような汎用の固有表現抽出エンジンではなく、企業名抽出に特化した機械学習モデルの開発を行うことで、企業名抽出を高い性能で行えるようにすることを目指しました。

私たちが用いた言語モデルは汎用モデルの「BERT」です(原論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding)。ここではBERTについては詳しくは説明しませんので、詳しく知りたい方は、自然言語処理の王様「BERT」の論文を徹底解説「イラスト付き解説」BERTとELMo等(NLPはどうやって転移学習を突破できたのか)などを参考にしてください。

BERTを用いた文章の解析では、まず文章をトークンと呼ばれる文字列の単位に分割します。例えば「ストックマーク株式会社では現在、エンジニアを募集しています。」をトークンに分けると

  • 「ストック」, 「マーク」, 「株式会社」, 「で」, 「は」, 「現在」, 「、」, 「エンジニア」, 「を」, 「募集」, 「し」, 「て」, 「い」, 「ます」, 「。」

のように分割されます。BERTはトークンの列を入力として与えると、それぞれのトークンを他のトークンを考慮して何らかの数値ベクトルに変換するようなモデルだと思ってください。図で表すと以下のようになります。(簡単のため[CLS], [SEP]などの特殊トークンは除いています。 )



次にBERTを用いて、どのように企業名抽出を行うかを説明します。このための方法としては色々なやり方が考えられますが、ここでは単純に以下のような方法を用いました。それぞれのトークンに対するBERTの出力(ベクトル)に「0」または「1」のラベルを出力する識別器を新たに付けます。ここでラベルが「1」のトークンは企業名に含まれており、ラベルが「0」のトークンは企業名には含まれていないことを表すことにします。そして、ラベルが連続して「1」であるトークンをひとまとまりとして、それを1つの企業名として扱います。下の図の例では、「ストック」, 「マーク」, 「株式会社」の連続する3つのトークンのラベルが「1」になっているので、それを連結した「ストックマーク株式会社」が企業名として抽出されます。



実際には、BERTは最初から企業名を正しく抽出できるわけではありません。 そのため、BERTが正しく企業名を抽出できるようにするために、BERTの学習(Fine-tuning)を行います。 BERTを学習させるために、まず大量の文章に対して、企業名のトークンを「1」、それ以外のトークンを「0」とラベル付けした学習データを用意します(次節参照)。 そして、学習データをもとにBERTができるだけ正確にラベルを出力できるように、つまり企業名のトークンに対して「1」をそれ以外のトークンに対しては「0」を出力するように、モデルのパラメータを更新していきます。 学習が進むにつれて、BERTは正しくラベルを出力できるようになり、正しく企業名を抽出できるようになります。 この学習が終われば、企業名抽出モデルの完成です。

今回は下の4つの例を試してみたいと思います。

文章例
1ストックマーク株式会社 では現在、エンジニアを募集しています。
2ことし10月を予定していた、ヤフーLINE の経営統合が遅れる見通しになりました。
3クーマクットス では現在、エンジニアを募集しています。
4ことし10月を予定していた、アハハハハENIL の経営統合が遅れる見通しになりました。

それぞれ太字が企業名を表しています。2番目の例は実際のニュース記事(出典:NHK NEWS WEB)を用いた例です。3と4番目の例は未知の企業名に対しても文脈から判断して正しく抽出して欲しいという要請から、それぞれ1と2番目の例から企業名を架空の企業名に置き換え、さらに「株式会社」という分かりやすい企業名の目印がない状況でも対応できるかを調べるために、「株式会社」を取り除きました。

今回、私たちが開発したモデルはいずれの例に対して正しく企業名を抽出でき、文脈を正しく読むことができていることが推察できます。参考までに、学習データには含まれないメディアの100記事のデータを用いて性能の評価を行った結果、適合率91%、再現率92%であり、高い確率で企業名抽出を正確に行えていることがわかります。

学習データのアノテーション

BERTのパラメータを学習するためには、ニュースの記事と記事中のどの箇所が企業名なのかをラベル付けした学習データが必要になります。このために、約5000のニュース記事を収集し、アノテーションを行い、それを学習データとしました。

学習データの作成においても、できるだけ効率的にアノテーションを行えるような工夫を行いました。アノテーションを500記事行うたびに、その時点で利用可能な学習データを用いて、暫定的なモデルを作りました。そして、次の500記事に対しては、このモデルの予測(つまり、まずモデルにアノテーションをさせる)の結果を参考にしながら、アノテーションを行うという方法を取りました。学習データが増えるにつれて、正しく抽出できている割合が増えていき、アノテーションにかかる時間も大幅に減っていきました。

また、経験的に学習データを雑に作るとパフォーマンスがあまり出ない傾向にあります。そのため、今回はアノテーションを丁寧に行い、質の高い学習データを作ることを心がけました。

おわりに

今回はニュース記事からの企業名抽出を題材にして、言語モデルが弊社のプロダクトでどのように利用されているかということについて解説しました。

企業名抽出に関してはある程度の精度が出るようになった一方で、実際にプロダクトで運用していく上で、以下のような課題もあり、今後このような課題にも取り組んでいきたいと考えています。

  • モデルの精度が高いと言っても完全ではないので、有名な企業でも抽出から漏れてしまうということも起こってしまいます。そこで辞書方式と機械学習を組み合わせて使うような方法を現在、試しています。

  • 学習データでは記事から本文のみを抽出して、整形したテキストのみを用いました。その一方で、実際にプロダクトで用いるデータでは、記事本文だけでなく見出し、箇条書き、記事のヘッダー・フッター、箇条書きなどの学習データにはない構造のテキストが含まれており、それが誤作動につながることがあります。このような整形されていないテキストからでも正しく動作するようにする方法についても今後模索していきたいと考えています。

参考文献