Ahogrammer

Deep Dive Into NLP, ML and Cloud

テキストの構造化を支える技術 -概要編-

最近、情報抽出、特にOpen Information Extraction(OpenIE)という分野について勉強しています。せっかく勉強しているので、学んだ内容について何回かに分けて紹介していこうと思います。第一回目の今回は、OpenIEという分野の概要について紹介し、OpenIEのきっかけとなったシステムであるTextRunnerとその仕組みについて説明します。

Open Information Extractionとは?

OpenIEについて述べる前に、まずは伝統的な情報抽出について述べておきましょう。情報抽出は非構造化データであるテキストを構造化された表現に変換するタスクです*1。情報抽出で抽出される情報は関係のタプルの形(arg1, rel, arg2)で表現されます。このタプルは関係を示すフレーズ(rel)とその対象であるエンティティ(args)から成ります。一般的な処理の流れとしては固有表現認識を行った後に、抽出された固有表現間の関係を推定します。

f:id:Hironsan:20181009135000p:plain
Relation Extractionより引用

情報抽出は質問応答や知識ベースの構築といった自然言語処理の様々なタスクに使うことができます。たとえば、「When was Gandhi born?」という質問に回答することを考えます。この場合、質問文を「(Gandhi, Born-In, ??)」という形式に変換できれば、関係を満たすレコードをデータベースから探すことで質問に回答することができます。

伝統的な情報抽出の課題として、ラベル付きコーパスを作成するコストが高い点とドメインに依存した少数の関係しか扱えない点が挙げられます。ラベル付きコーパスの作成は、固有表現のラベル付をした後、固有表現間に関係のラベル付をする必要があり、非常に時間のかかる作業です。また、手動でラベル付するため、多くの関係を扱うことは困難です。以下の画像はアノテーションツールであるbratを使ってラベル付している例です。

f:id:Hironsan:20181009140041p:plain
bratより引用

OpenIEでは、伝統的な情報抽出とは異なり、抽出する関係は事前に定義されません。伝統的な情報抽出では事前に定義された関係をあるドメインコーパスから抽出することに焦点を当てていましたが、OpenIEではWebからの情報抽出に焦点を当てています。そのため、ドメインを絞ったり関係を事前に定義することは基本的にできません。本記事で紹介するTextRunnerの論文内で著者らはOpenIEに求められる以下の3つの課題を提唱しました。

  • Automation
  • Corpus Heterogeneity
  • Efficiency

Automationは、アノテーションやルールを書く労力を最小化することを示しています。Corpus Heterogeneityは、ドメイン依存を避けるために、特定のドメインで訓練された固有表現認識や構文解析のような処理を入れたくないということです。Efficiencyは、OpenIEが対象とするWeb上の大規模テキストを処理するには計算効率の良さが求められるといっています。

OpenIEの歴史をざっくりと眺めると以下のようになっています。一般的に、OpenIEの研究は2007年のTextRunnerから始まったとされています。研究を積み重ねるにつれ、適合率・再現率はどんどん向上しています。最近の事情については、COLING 2018のベストペーパーの一つである「A Survey on Open Information Extraction」が参考になるでしょう。

f:id:Hironsan:20181009143539p:plain
Open Information Extraction Systems and Downstream Applicationsより引用

以降では、OpenIEという分野が始まるきっかけとなったTextRunnerについて紹介します。

TextRunnerとは?

TextRunnerはBankoらによって2007年に発表されたOpenIEのシステムです。少々ややこしいことに、最初に発表されたのは2007年なのですが、同じ著者が2008年に発表した論文のシステムのこともTextRunnerと呼ぶこともあるようです。(むしろ、TextRunnerというと後者を指すことが多い?) 論文としては以下の2つが該当します。

TextRunnerの入出力はそれぞれテキストと関係タプル(arg1, rel, arg2)です。たとえば、"EBay was originally founded by Pierre Omidyar." という文をTextRunnerに与えたとしましょう。このとき、TextRunnerの出力として期待されるのは (Ebay, Founded by, Pierre Omidyar) という関係のタプルです。

関係タプルを抽出するための仕組みとして、TextRunnerは以下の3つのコンポーネントから構成されています。

  • Learner
  • Extractor
  • Assessor

Learnerはコーパスから自動的に学習用データを生成し、分類器に学習させます。学習用データは関係タプル(arg1, rel, arg2)がもっともらしいか否かというデータであり、分類器はタプルを2値分類するために使われます。Extractorはコーパスからタプルを抽出し、Learnerで学習した分類器で分類します。分類結果がもっともらしければそのまま残します。AssessorはExtractorで抽出したタプルに対して確率を付与します。

イメージを掴むために、各コンポーネントについてより詳しく説明します。

Learner

Learnerではまずテキストを解析して関係タプルがもっともらしいか否かというデータを生成します。たとえば、"Before the war, when Oppenheimer taught at Berkeley and CalTech"というテキストから、正例として(Oppenheimer, taught at, Berkeley), (Oppenheimer, taught at CalTech)、負例として(war, when, Oppenheimer)のようなデータを生成します。

データを生成するために、テキストを構文解析し、得られた名詞句(NP)をエンティティ、そして各名詞句のペアをつなぐ単語列を関係フレーズとします。こうして得られたタプルに対して、いくつかの構文的制約を満たす場合は正例、そうでない場合は負例とします。制約としては、各名詞句が代名詞でないとか、各名詞句をつなぐパスが文の境界を超えないといった制約を使います。

f:id:Hironsan:20181011103314p:plain
Machine Reading & Open Information Extractionより引用

最後に、生成した学習データを特徴表現に変換し、ナイーブベイズ分類器で学習させます。特徴としては関係フレーズの単語数、ストップワード数、名詞句が固有名詞か否かといった特徴を使用しています。

Extractor

Extractorでは、まずテキストから関係タプルを抽出します。そのために各単語に対して品詞タグ付けを行い、名詞句を抽出します。そして、各名詞句のペアの間にあるテキストを関係フレーズとします。

注意点は、重要ではない単語をヒューリスティックに削除する点です。たとえば、エンティティの修飾語(例: "Scientists from many universities are studying ..." → "Scientists are studying...")や副詞(例: "definitely developed" → "developed")は削除します。

こうして得られた関係タプルは、Learnerで学習した分類器に与えて正しい関係か否かを判断します。そして、正しい関係であれば得られた関係タプルをそのまま残しておきます。

Assessor

最後にAssessorを使って抽出したタプルに確率を割り当てます。確率を割り当てるために異なる文から得られた同一のタプルのカウントを求めます。抽出されたタプルに対して以下のように確率を割り当てることができます。

f:id:Hironsan:20181011125212p:plain
Machine Reading & Open Information Extractionより引用

おわりに

第一回の今回は、Open Information Extraction(OpenIE)の概要とTextRunnerについて紹介しました。TextRunnerはOpenIEの記念碑的なシステムであり、OpenIEの文脈では必ず登場するため、ここを押さえておくと次回以降の理解も深まるのではないかと思います。次回は、ReVerbと呼ばれるシンプルながら強力なOpenIEのシステムについて紹介する予定です。ブログを購読していただけると見逃しがないのではないかと思います。

私のTwitterアカウントでも機械学習自然言語処理に関する情報をつぶやいています。

この分野にご興味のある方のフォローをお待ちしています。

参考文献

固有表現認識器に言語モデルを組み込んで、性能を向上させる

最近の自然言語処理では言語モデルを使って転移学習をしたり、性能向上に役立てたりするようになってきました。言語モデルの1つであるELMoでは、言語モデルから得られる分散表現を他のタスクの入力に使うことで、質問応答や固有表現認識、評価分析といった様々なタスクの性能向上に役立つことを示しました。ELMoについては以下の記事で詳しく紹介されています。

kamujun.hatenablog.com

本記事では、以前書いた記事で構築したディープラーニングベースの固有表現認識器の性能をELMoを使って向上させる方法を紹介します。ELMoの学習から始めるのは大変なので、今回はAllenNLPで提供されている学習済みのELMoを使用します。ちなみにAllenNLPとは、自然言語処理をするのに便利な機能を提供しているライブラリです。

記事の構成は以下の3部から成っています。

  • 実装するモデルの説明
  • モデルの実装
  • モデルの学習

全体のコードは以下のGitHubリポジトリに置いてあります。スターしていただけるとうれしいです。m(_ _)m

github.com

では、実装するモデルについて説明していきます。

続きを読む

教師なしで作る評価分析器

評価分析は自然言語処理の基礎技術でありながら実世界に広く応用されている技術です。たとえば、顧客の声を拾うために商品レビューを評価分析して肯定的なのか否定的なのか判断するのに使われています。また、情報抽出の技術と組み合わせて、文書のどの部分が肯定的/否定的なことを言っているのかを判定することもあります。

f:id:Hironsan:20180914094939j:plain 参照: An online form with built-in Sentiment Analysis

評価分析を行うためによく使われるのは教師あり学習による手法です。教師あり学習を用いた手法では、評価分析をする対象のテキストとその評価のマッピング機械学習アルゴリズムに学習させます。したがって、教師ありの手法を使うためにはラベルの付いたテキストを用意する必要があります。

本記事では、教師なしで評価分析器を作成する方法を紹介します。教師なしの手法のメリットとしては、ラベル付与済みのテキストを用意する必要がない点を挙げられます。記事は以下の内容で構成されています。

  • 実装するモデルの説明
  • モデルの実装

では、実装していきましょう。

続きを読む