2023.01.12

知識グラフをテキストデータ+NLPから構築する時のイロハ

はじめに

こんにちは、グループ研究開発本部 AI研究開発室のC.Wです。去年の2022年は知識グラフに愛があり、あちこちにある非構造化データから知識グラフを構築できればさぞかし美しいのではないかと思い色々と試しました。

前回の記事では、Open Information Extraction(OIE)のNLP技術を利用してニュースデータの非構造テキストから知識グラフを構築することを試していて、それ以前ではCoreference Resolution + Named Entity Recognition(NER) + Relation Extraction(RE)等のハイブリッドなやり方で試していました。今日は一年の集約として、Hand onの内容ではなくこれまでの私の学びと問題と感じたところを整理して、これからこの道に挑戦する皆様の糧になれればと思います。

改めて知識グラフとは

知識グラフとは「知識」と言う抽象的なものをグラフ構造に保存する様なデータベースです。さらにグラフ構造ではnodeとedgeの組み合わせなので、AとBとその関係性の知識をデータ化すれば知識グラフになれるだろうと考えていました。なので、当初思った応用例としては「知識が全くない人間でも見れば知識そのものを得られる」ようなものを想定していました。ただ実際にHand onして感じたのは知識として自立するにはまだ遠く、知識グラフから自立で説明できる情報はEdgeの関係性と時間性に大きく左右されるものであると実感しました。

Edgeの関係性

例えば、父と子の間にどのような関係があるのか考えてみます、なのでまず単純な親子関係があるので関係性に親子を作りました。そうすると状況に応じて養子の可能性もあり、生物学的な親と法律的な親の関係がうまく説明できなくなります。レアケースに思われる方もいるかと思いますが、知識が自立して情報伝達をしようとする時不可欠な情報になるとのことは発生します。

時間性

現在のグラフデータベースの制限的なところです。NodeでもEdgeでも、現実世界では基本的に時間に応じて大きく変化しているものですが、グラフデータベースではうまくその状態変化を取り込むことができないです。例えば法人の表現をしたい時、取締役会とか変わるような人間組織では、就任辞任のタイミングに応じて大量の変化が発生します。かつ、目的に応じて非常に大事なことなので必ずしもデータ上で表現がしたいです。なので実務的な方法では複数のedgeで説明をしますが、そうすると目視の時では一発で視認できなくなるような状態にまずなります。ただ例えば社名が変わるような誰とも関係が発生していなくnodeの属性自体の変化だと、現状どうしようもないこととなります。

 

NLPからの知識抽出

機械学習の実応用問題

よくある話しですが、Benchmarkや学習データでは高得点をしたが実応用ではうまくいかない、実データでFine tuningをしなければいけないがそもそもタスク自体が新しく実データも学習可能に整備されてない(し、整備する余裕もない)。NLP領域では学習データの準備は難しく、最近の論文でも数年前のデータセットをBenchmarkとして学習しています。さらにその数年前のデータセットでは設計された当初の時期で正確にパフォーマンスを測るため、難易度が比較的低いデータとなり、NLPで行くと簡単な語句がメインで、語句の長さが短いのが特徴です。一般的な解決法は事前学習のモデルを意図的に作った課題向けのデータセットでfine tuningをしてこの問題の克服をしていますが、データセットを作ること自体は非常にtime consumingの作業です。

その上に、ACE04のデータをご覧したことのある方はご存知かと思いますが、基本的に小学レベルの英語です。それをいきなりBloombergレベルの英語を突っ込んでハードルがあるような文章を入力したので、いいアウトプットは正直あまり期待していなかったが、ここまで解釈性が低かったのは予想外でした。

関係性抽出

Relation Extractionの制限

Relation Extractionの教師あり手法の特有問題であり、学習するため何かしらのラベル付けが必須ですが、「何をどれまでラベルをつけたらいいか」の判断により出てくる違うデータセットのバイアスです。例えばNamed Entity RecognitionやObject Detectionでは、どの単語/物をどうラベル付けするかで解像度とかが異なりアウトプットに影響を施します。その一方で、Relation ExtractionはもしN個単語があるとするとNの二乗の関係性が存在していて、その関係性が2単語だけで説明できるとも限らなく、非常にラベル付けがしにくいタスクでもあります。

また、特にNLPを使ったグラフ構築ではRelation Extractionのモデルに大きく依存している現状もあります。REのデータセットはデータセット別で独自の関係性を表示するようにラベル付けをしていて、意図的に汎用性の高いように設定されているので関係性の説明解像度がイマイチ感がある。例えばWebNLGとかはTripletの形式で、単純に3個の単語(か語句)が関係しているを示していて、ACE04とかはORG_AFFとかで違うEntityの関係を示している。そういう制限を前提にしてしまうと曖昧な関係のみが見えていて知識というレベルに落とせないことになりうる。

Open Information Extractionの精度

一方で、OIE (Open Information Extraction)のようなオープン関係性のNLPモデルも試してみましたが、悲惨な結果でした。意味の抽出が出来てない訳ではないですが、OIEの中での関係性は単語との制限がなく、基本的に語句そのものを突っ込んできます。それを単語の数でフィルタリングしても残るは曖昧なis, a のような見ても関係性の意味不明の単語ばかりになります。一方で語句そのものをrelationとして入れても人間解釈ができないような状態になっていて、カオスでした。それに加え、現在OIEの技術はあまり発展されていなく、文字の関係性判読は基本Relation Extraction一択になっています。古典的な手法ですがその限界を肌で感じました。

NLPの前後処理

代名詞がグラフ上のHubとなっている

これはNER(Named Entity Recognition)の困難点でもあり、人が書いている文章を機械が認識をするための問題だと思っています。NERとは、概念的に言うと文章全体を理解しながら単語にEntityがあるかどうかを判断しつつ抽出するプロセスです。それでEntityを判断する作業ですが、今回のタスクでは語句ではなく文章となると語句の間を跨ぐ認識が上手くできなく、例えば: “That is my house. I lived in there. “の2句だとthereが場所と判断されがちな状況になっています。それを解決するためにCoreference Resolutionの手法は効果的なので、入れておくことは意識しておきましょう。

同じ名前の個体でも違うEntityに認識されている

これは間違いとは言えない状況ですが、知識抽出の視点としては望ましくない状況です。文章や文法によって確かにEntityは変化しますが、それは全知識グラフとして残すのかというと違うのかと思っています。なので今回の解決法としてはVoting的なやり方で、全文章から抽出した同じ名前を持つEntityに対して、認識されたEntityの回数が一番多いEntityを該当名前のEntityとして扱います。

抽出された単語の中で類似しているものが多い

自然言語処理でよくある問題ですが、時制(tense)や複数形(plurals)などの単語を同じく認識するために、今回はStemminの手法を使ってstem wordをEntityとして抽出します。ここで注意すべき点としては、学習のデータでは生データを使っていてstem wordではないため、NER/REモデルで推論する時も生文章のままで推論して、後処理でEntityをstem wordに変換する処理をしています。

まとめ

今回はNLP技術を利用してニュースデータの非構造テキストから知識グラフを構築することをの一年の集約として、自分の学びを整理しました。これからこの道に挑戦する皆様の糧になれればと思います。

最後に

グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。皆さんのご応募をお待ちしています。

 

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事