はじめに
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)
種類ごとに色分けされて見やすいですね。
ところで、普通の人は一文で全部の情報が入った発言をしてくれません。
例えば、こんな感じ。
音声エージェントやチャットボットでは、こういう場合、コンテキストに「トランプ: 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社のスピーカは、娘が「おっけー、ぐるぐる」と呼ぶと動いてくれます
*6: Dialogflowでは、Intentと呼ぶようです