調和技研 技術ブログ

調和技研で取り組んでいる技術を公開していきます

GiNZAでNLP - Named Entity

はじめに

GiNZA (spaCy)によるNLP、前回*1構文解析やその可視化を行ってみました。 今回は固有表現抽出 (Named Entity Recognition) *2を使ってみたいと思います。

Named Entity Recognition

固有表現抽出はEntityを抽出し、それにタグをつけてくれる機能です。 タグには、人名 (PERSON)、地名 (LOC)、日付表現 (DATE)、時間表現 (TIME)、金額表現 (MONEY)、などいくつかあり、GiNZA (spaCy)では 以下のようなタグが付くようです。 https://spacy.io/api/annotation#named-entities

抽出

では、実際にやってみましょう。前回同様、Google Colaboratoryにサンプル全体*3を置いておきます。

情報抽出の例文としては、音声エージェントにスケジュール設定をお願いするようなシーンを想定してみましょう。

import spacy
nlp = spacy.load('ja_ginza')
doc1 = nlp('おっけー、ぐるぐる。来週、月曜日の午後1時からトランプ大統領との打合せを北海道大学のクラーク会館で設定して')
for ent in doc1.ents:
    print(ent.text, ent.label_)

先頭の呪文*4は雰囲気作りです。 上記を実行すると、以下のような結果が出ます。

来週 DATE
月曜日 DATE
午後1時 TIME
トランプ PERSON
北海道大学 ORG
クラーク会館 LOC

「来週」「月曜日」はDATE、「午後1時」はTIMEなどと分類されています。 単なる辞書で動いているわけではないので、辞書的には普通名詞-一般である「トランプ」もPERSONと判定しています。 また、「クラーク」(固有名詞-人名)、「会館」(普通名詞-一般)を合わせて1つのエンティティとしてくれています*5

可視化も、前回同様簡単にできます。

from spacy import displacy
displacy.render(doc1, style="ent", jupyter=True)

f:id:chowagiken_takamatsu:20190725143625p:plain 種類ごとに色分けされて見やすいですね。

ところで、普通の人は一文で全部の情報が入った発言をしてくれません。 例えば、こんな感じ。 f:id:chowagiken_takamatsu:20190726194952p:plain

音声エージェントやチャットボットでは、こういう場合、コンテキストに「トランプ: PERSON」と「クラーク会館: LOC」 を保持し、そのタスクに不足する情報を問い合わせる、といったことをします。 例えば、スケジュールの設定にはDATEやTIMEが必須ということであれば、以下の質問をしてみることになるでしょう。 「何時に設定しますか?」

必要な項目に応じて、質問も変えることになります。 LOCを聞く場合は「どこで設定しますか?」のように。

タスク判定

さて、普通、音声エージェントは1種類のタスク*6だけをするわけではありません。 タスクが起動する条件を設定する必要があるでしょう。

ここでは「打合せ」を「設定」するという文を起動条件としてみます。 ただ、「打合せ」と「設定」が含まれるという条件では、例えば以下のような文にも反応してしまいます。

おっけー、ぐるぐる。来週、月曜日に菅原さんにPCの設定に関する打合せの電話して

「打合せ」と「設定」の関係性を考慮するには、、、前回使った構文解析の結果を用いるとうまくいきそうです。

def is_scheduler_task(doc):
  for sent in doc.sents:
    for token in sent:
      if token.lemma_=='打ち合わせ' and token.head.lemma_=='設定':
        return True
  return False

こんな感じで、タスクの起動判定ができました。なお、「打ち合わせ」は「打合せ」の原型です。 もちろん、本物のエージェントに組み込むには言い換えなどに対応する必要があります。

まとめ

GiNZA (spaCy)による固有表現抽出(Named Entity Recognition) ですが、可視化も含めて簡単に利用できるがのよいですね。

*1:https://blog.chowagiken.co.jp/entry/2019/07/12/GiNZA%E3%81%AB%E3%82%88%E3%82%8BNLP%E4%BA%8B%E5%A7%8B%E3%82%81

*2:https://spacy.io/usage/linguistic-features#named-entities

*3: https://colab.research.google.com/drive/1uVT4lppR4MmwJLULoIp_Y0e5_fnz03W5

*4:ウェイクワードなどと呼びます。我が家に置いてあるG社のスピーカは、娘が「おっけー、ぐるぐる」と呼ぶと動いてくれます

*5:因みに、クラーク会館は北海道大学の敷地内にあります。

*6: Dialogflowでは、Intentと呼ぶようです