ブログ

風林火山 – 下町ディープラーニング #15

 みなさんこんにちは。dottの清水です。

 さて、前回の「行きは良い良い帰りは怖い」では、「固有表現抽出(NER)」の基本の「き」についての説明と、AIシステムを作る上でのメリットとデメリットについてお話ししました。

 今回は自分たちで作成した固有表現抽出(NER)のAIモデルを用いて、自然言語であるニュースの記事などから情報を抽出する際にどんなことをやっているのかというお話です。なぜ自分たちでNERのAIを作らなければならないのか、どのようなことを考えなければいけないのか、という内容を話していこうと思います。

 そして今回の記事には、2019年の台風19号の被害に関する文章を例に用いています。この台風ではdottの郡山オフィスがある福島県郡山市をはじめ、東日本のさまざまな地域に大きな被害をもたらしました。被害に遭われた皆様に、謹んでお見舞い申し上げます。

種類と規模

 あれこれと説明する前に、百聞は一見にしかずということでまずは例からお話ししていきたいと思います。

 同日23時ごろ、神奈川県川崎市沖合3キロほどの東京湾上で、パナマ船籍の貨物船「JIA DE ジア・デ」(1,925トン)の乗組員が漂流しているのが見つかった。中国人7人、ミャンマー人3人、ベトナム人2人の合計12人の乗組員のうち4人が救助され、7人が死亡、1人が行方不明となっている。(引用「令和元年東日本台風」Wikipedia)

 この情報から「どんな」被害が「どれだけ」あったか、という情報を抽出するとします。それぞれをここでは「どんな => 被害種類」「どれだけ => 被害規模」という名前で呼ぶことにします。

 被害種類と被害規模が記載されている箇所だけ抜き出すとこのようになります。

 これらの情報を抽出することができれば、とりあえずはなんとか情報を整理できるような気がしてきますね。

汎用システムでは何が難しいのか

 ここでは前々回も例に出した、Goolgleの「Natural Language API」の結果を例にとってみてみます。

 この結果を見る限り「乗組員」という項目と、「数字」は認識していることがわかります。被害種類の中でも「行方不明」のみが「OTHER」として抽出されています。一般的なNERでは「時間表現」「金額表現」「割合表現」という3つの数字が抽出する数字となっているので、それよりは十分に素晴らしい機能を持った自然言語解析システムだと思います。

 しかし前々回では「PERSON」として抽出された「死者」が、今回の例文では抽出されていなかったりと、少し不安定な動きも見られますね。

 ただ、実はその不安定な動き自体が問題ではありません。

臨機応変なヒトの脳みそ

 まず思い出していただきたいことは、「コンピューターは命令の通りに動き、その通りにしか動けない」ということです。

 当たり前すぎて呆れられてしまいそうですが、日本語の文章のような自然言語の処理を行う上で、私たちが普段忘れてしまいがちなことがもう一つあります。

 それは「ヒトが文章を読むときに、いかに高度な処理を行なっているか」ということです。

 下の図は、先程の例に挙げた文章で、僕が「被害種類と被害規模が記載されている箇所だけ抜き出すとこのようになります」とさらっと説明した処理を行わなかった場合の例です。

 なんの疑問もなく「救助された方は4人で、亡くなられた方が7人、行方不明者は1人」ということを僕たちは理解すると思います。

なんでわかるんですか?

 ではなぜ、そのように判断できるのか、根拠を論理立てて説明するゲームをしてみましょう。特になぜ前半の人数が、被害の規模ではないのか判断できるのかという点を説明することが目的です。そこまで難しくはないと思います。

 ただ考え始めると頭で瞬時に理解している労力に比べ、意外と難しいことに気づいていただけるかなと思います。

 僕も少し説明にチャレンジしてみます。

  • 「救助」「死亡」「行方不明」という単語は被害種類を表すものである。
  • 「被害種類を表現する単語が、数字に関する説明を行なっている」部分が、被害規模を表している。
  • そのほかの数字は「被害者の国籍を表現する単語」を説明するものであり、被害種類についての規模規模を表す数字ではない。
  • 合計というのは、被害者の数の合計を表す言葉であり、それに紐づく数字は被害種類に関する数字ではない。

 こんなところでしょうか。

 少々回りくどい言い方になっていますが、コンピューターに命令するためには、もっと厳密に書く必要がありそうですね。

言語の処理はつらいよ

 この箇所をGoogle Natural Language APIで処理すると以下のようになります。

 今回の記事では複雑になりそうで割愛していますが、災害情報は発生した場所も大事なので、「中国人」が場所としての「中国」と「人」に分けられるような、少し扱いづらい結果となりました。

 ただこの箇所が正確に「中国人」と読み取られて、例えば「PERSON」や「OTHER」と抽出されたとしても、それが被害種類を表さない言葉だと判断するにはどうすればよいでしょうか?

 辞書に登録しておくのもよいかもしれません。

ルールベースはやっぱり大変

 ただし文章は色々なバリエーションがありますから、「7人が死亡」ではなく「死者は7名」「7人が亡くなりました」「7名の乗組員が逝去しました」のようにさまざまなパターンが出てきますから、第2回の「火事と喧嘩は江戸の花だが」でも話したように「ルールベースで作ることの難しさ」が当然存在します。

 ここまでくると、今回のような目的のために、いかに自分たちが都合の良いように固有表現を抽出することができるAIモデルが必要かということを知っていただけたかと思います。

 ただし、思い通りに情報を抽出できたとしても、まだまだ人間の脳みそがやっている高度な処理をシミュレーションするためにはやることがいっぱいあるのです。

 人間の脳みそは、時として風のように素早く柔軟に動きつつも、山のように一貫した理論のもとに動いていることに驚かされます。

 その話はまた、次回の記事で。