Fintan

辞書ベース固有表現認識ライブラリseqlabelの公開

CONTENTS

  • arrow_forward辞書ベース固有表現認識ライブラリseqlabelの公開
     

    NLP

はじめに

戦略技術センター (STC) で自然言語処理関係の研究開発をしている谷口です。本記事では、我々が開発したseqlabelの紹介をします。seqlabelは辞書データから固有表現認識用のデータセットを自動構築するためのライブラリです。ライブラリを実装するに至った背景、既存ライブラリの課題等を説明します。また簡単に利用方法の紹介もします。実装の詳細などを詳しく知りたい方はこちらのGitHubレポジトリをご覧下さい。

背景

固有表現認識とは

固有表現認識は、所与のテキストから固有表現を抽出し、組織名や人名といったラベルを付与する技術です。ラベルは、ドメインに応じて事前に定義しておく必要があります。例えば、金融ドメインならROIやPERなどを表す「金融指標」といったラベルが必要になるでしょう。タスクによってはROIとPERにそれぞれ別のラベルを割り当てることもありえます。自分の興味のある固有表現を認識できるので、情報抽出や質問応答などの要素技術として応用されています。

固有表現認識の手法

固有表現認識器の構築は、ルールベースと機械学習ベースで大きく2つのアプローチに分かれます。ルールベースは、人間が考えたルールを使って認識を行うアプローチです。例えば、「TIS株式会社」という文字列には組織名ラベルを付与する、といったイメージです。これ以外にも品詞や構文木を活用した様々なルールが考えられます。機械学習ベースは、データから自動獲得できるルールを使って認識を行うアプローチです。ここでデータとは、認識対象のテキストのことです。機械学習ベースのアプローチは教師あり学習と教師なし学習の2つがあります。教師あり学習はテキストに正解ラベルが付与されている場合のアプローチ、教師なし学習は付与されていない場合のアプローチです。「正解ラベルが付与」とは、対象のテキストに出現する固有表現とそれに対応するラベルが与えられている状態を指します。

ルールベースと機械学習ベースの手法をそれぞれ整理すると以下のようになります。

手法 メリット デメリット
ルールベース 場合によっては教師あり学習より高い性能を得られる ルールを作るのが難しい場合がある
教師あり学習 多くの場合に高い性能を得られる データ構築にコストがかかる
教師なし学習 データ構築する必要がない 高い性能を得にくい

固有表現認識器は、機械学習ベースの中でも教師あり学習を用いて構築されることが多いです。ルールベースや教師なし学習と比較して、多くの場合に高い性能が得られるからです。ルールベースのアプローチは、ルールに適合しないパターンの取りこぼしによって、性能が低下してしまいます。例えば、「TIS株式会社に組織名ラベルを付与する」とルールを定義しても、必ずテキスト中に「TIS株式会社」と出現するわけではありません。「TIS」とだけ出てきた場合は、認識できないことになります。ルールを加えることも考えられますが、考慮すべきパターンが多すぎる場合に利用することは、現実的ではありません。一方で、パターンが少ない場合は現在でも有効なアプローチと言えます。教師なし学習は正解ラベルが利用できないため、一般的に教師あり学習より性能が低くなります。

教師あり学習の課題

教師あり学習では、アノテーションのコストが高いという課題があります。アノテーションとは、認識対象のテキスト中に出現する固有表現に対して、対応するラベルを付与する作業のことです。アノテーションを行うためには、ガイドラインを用意しておく必要があります。ガイドラインでは、認識対象のラベルや、ラベルを付与するか否かの判断基準を定義します。様々なケースを考慮しておく必要があるので、ガイドライン作成はコストがかかります。さらに、ガイドラインに基づいて、ラベルを付与する必要があり、この作業自体もコストのかかるものです。

Distant supervisionによる固有表現認識

コスト軽減のために、Distant supervisionと呼ばれる手法が利用されます。Distant supervisionは以下の図の流れで行われます。固有表現と対応するラベルがペアになった辞書を用いて、自動でデータにラベル付けを行うことで、コストを軽減します。ラベル付けは辞書に登録されている固有表現とのマッチングにより行います。自動でアノテーションするので、当然データの質は下がります。しかし、Shangらの研究によると、通常の教師あり学習に匹敵する性能を出すことも可能です。この手法については解説しないので、興味のある方は論文をご確認下さい。

図1. Distant supervisionの概要 (論文を元に著者が作成)

課題

既存ライブラリの課題

Distant supervisionのラベル付きデータ構築では、spaCyのEntityRulerを利用できます。spaCyはExplosion社の開発するオープンソースの自然言語処理ライブラリです。spaCy内に実装されているEntityRulerは、辞書を与えると、辞書とのマッチング処理とフィルタリング処理を一括で実行します。詳しい利用方法は公式ドキュメントを御覧下さい。

spaCyのEntityRulerはフィルタリング処理が抽象化されていない、という課題があります。フィルタリング処理は、自動構築したデータの質を左右する重要な処理です。EntityRulerでは必ずマッチした最長の固有表現が選択され、その他のマッチした固有表現は除外されます。しかし常に最長の固有表現を残すのが良いかはタスクによって変わります。例えば、「東京都知事」という文字列から固有表現を認識する場合、1単語で「東京都知事」としたい場合もあれば、2単語で「東京都」と「知事」を分けたい場合もあるでしょう。もしくは3単語すべてを認識したい場合もあります。

課題の解決

フィルタリング処理を抽象化したseqlabelを開発しました。フィルタリング処理を抽象化したことで、処理の内容を切り替えたり、処理を組み合わせることが可能になっています。また辞書とのマッチングを取る際には、spaCyと同様にTrieベースアルゴリズムを利用しているため、高速に動作します。マッチングアルゴリズムに関しても抽象化されているので、変更は容易に実現できます。

seqlabelを使って、ラベル付きのデータ構築してみます。まず必要なクラスをインポートします。Textは処理対象のテキスト、DictionaryMatchはマッチング処理、LongestMatchFilterMaximiedMatchFilterはそれぞれフィルタリング処理を表します。

from seqlabel import Text
from seqlabel.matchers import DictionaryMatcher
from seqlabel.entity_filters import LongestMatchFilter, MaximizedMatchFilter

処理対象のテキストを以下のように用意します。これ以降のコード中に出てくるtextは以下を指すことにします。

text = Text("今の東京都知事は誰ですか。")

マッチング処理は以下のように行います。DictionaryMatcher.addで辞書の登録を行います。辞書はHash Map (Pythonのdict) で表現し、keyが固有表現、valueがラベルに対応しています。DictionaryMatcher.matchでマッチング処理が行われます。

matcher = DictionaryMatcher()
# 辞書データの登録
matcher.add({"東京都知事": "役職", "東京都": "地名", "知事": "役職"})
# マッチング処理
entities = matcher.match(text)

マッチングの結果は以下となります。マッチした結果は文字オフセットで表現されます。最初の要素が「東京」、次が「東京都知事」、最後が「知事」を表します。

[
  Entity(start_offset=2, end_offset=4, label='地名'),  # 東京都
  Entity(start_offset=2, end_offset=6, label='役職'),  # 東京都知事
  Entity(start_offset=5, end_offset=6, label='役職')   # 知事
]

次に、マッチした固有表現のフィルタリング処理を行います。例として、LongestMatchFilterMaximiedMatchFilterを用いたフィルタリング処理を説明します。フィルタリング処理は任意の処理になります。例えば、マッチした結果をすべて活用したい場合は不要となります。

ラベルの範囲が重ならないように、選択される固有表現の長さを最大化したい場合は、LongestMatchFilterを利用します。 ここで固有表現の長さとは、固有表現の文字数のことです。

filter1 = LongestMatchFiler()
filtered_entities = filter1(entities)  # 「東京都知事」が選択される

ラベルの範囲が重ならないように、選択される固有表現数を最大化したい場合は、MaximizedMatchFilterを利用します。

filter2 = MaximizedMatchFilter()
filtered_entities = filter2(entities)  # 「東京都」と「知事」が選択される

以上が簡単な利用方法になります。最終的には何らかの形式で保存する必要がありますが、その処理や細かい利用方法はGitHubのREADMEを御覧下さい。

おわりに

本記事では、Distant supervisionと自動的に固有表現認識のラベル付きデータを構築するライブラリであるseqlabelを紹介しました。ラベル付きデータの構築コストの高い固有表現認識において、Distant supervisionは有効な手法になります。特にラベル付きデータがなく、ラベル自体を自身で定義した場合は、選択肢の1つになりえます。また、seqlabelを利用することで、データの質をコントロールするフィルタリング処理を柔軟に行うことができます。

参考


本コンテンツはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

このエントリーをはてなブックマークに追加


TIS株式会社
個人情報保護方針 個人情報の取り扱いについて 情報セキュリティ方針 当サイトのご利用にあたって

Copyright 2021 TIS Inc.keyboard_arrow_up