2017.08.16
第4回 自然言語処理
第1回で、人狼知能にはプロトコル部門と自然言語部門があることを紹介しました。第2回では人狼知能エージェントの作り方を紹介しました。第3回では、人狼知能エージェントを作るとは対話システムを作るということであること、対話システムとは何かを紹介しました。今回は、対話システムを構築する際に必要になる「自然言語処理」について簡単に紹介します。
電子書籍『人狼知能で学ぶAIプログラミング 欺瞞・推理・会話で不完全情報ゲームを戦う人工知能の作り方』をマナティで発売中!
(上の書籍画像をクリックすると購入サイトに移動できます)
1. 自然言語処理とは
「自然言語処理」とは、英語や日本語といった人間の言葉である「自然言語」を、コンピュータで処理することです。コンピュータに会話をさせるには、プログラムによって自然言語を処理して「理解」させる必要があります。しかし、そもそも「理解」とは何かという問題もあるので、「解析させる」といったほうがいいかもしれません。
自然言語処理では、多くの場合、異なる処理を行うツールを組み合わせて、「ツールA」→「ツールB」→「ツールC」というようにパイプライン的な処理(この場合は、いわゆる「パイプ」と呼ばれる手法で、ある処理が行われた出力を次の処理の入力とすること)を行います。その際、最初の入力は、通常はテキストそのもので、ツールで処理をするたびにテキストに対して追加的な情報が付与されていくことになります。そうした処理を順を追って説明します。
2. コーパスとアノテーション
システムの入力としてだけではなく、学習や評価に用いるリソースとして、「コーパス」(corpus)が用いられます。コーパスとは、電子的に記録された言語情報のことで、テキストの場合が多いですが、音声などの場合もあります。テキストだけであれば「生テキスト」(raw text)と呼ばれます。一口にテキストといっても、新聞記事、ブログ、Webページ、書籍、講演や会話の書き起こしなど、その内容や性質はさまざまです。
テキスト(あるいは言語情報)には、潜在的に多様な情報が含まれています。そうした情報を取り出すには、テキストに対して、以降で説明する言語学的な解析が前段階(前処理)として必要です。言語学的な解析については、とりあえずは「主語」「述語」などを思い浮かべてもらえればよいでしょう。こうしたテキストへの追加的な情報を「アノテーション」(annotation)あるいは「タグ」(tag)などと呼びます。生テキストに加えて、アノテーションが付与されたコーパスを「アノテーション付きコーパス」(annotated corpus)あるいは「タグ付きコーパス」(tagged corpus)と呼びます。アノテーションを付与する作業をする人を「アノテーター」(annotator)と呼びますが、自動的にアノテーションを付与するツールもアノテーターと呼ぶことがあります。
3. さまざまなレイヤの自然言語処理
3.1 文境界解析
入力がテキストだとすると、コンピュータにとっては単なる文字列にすぎません。それゆえ、ある程度の長さに切ってからでないと処理が難しいものです。切るとなると、「文」がよさそうな区切れ目に思えます。
新聞記事などの「きちんとした」書き言葉では、文の境界には句点(。)があるため、「。」を検出するだけでよく、わざわざ文境界を解析するまでもないように思うかもしれません。しかし、句点(。)ではなくピリオド(.)を使う人もいます。また、発言の引用などで、カギカッコの中に複数の文が入ることがありますが、その場合、カッコ内で分割してしまうと、たとえば「首相は『解散するとは言っていない。明日かもしれないが。』と話した。」という文は途中で区切られ、外側の文の解析が難しくなります。ブログやツイートなどの「くだけた」文になると、改行を文末代わりにしたり(しなかったり)、顔文字を文末にしたりする例を見かけます。さらに話し言葉を考えると、そもそも文の区切りがどこなのか明確ではありません。事情は他言語でも同様です。
このように、文の境界は必ずしも簡単に判断できないのですが、とにかく何かの単位で区切らないと処理が難しいのです。以降で説明しますが、自然言語処理では、文脈、つまり前後の情報を見ないと判断ができない処理が多くあります。前後をどこまで見る必要があるのかを仮にでも決めておかないと、入力された全テキストを対象としなくてはならず、プログラムでの処理はより難しくなります。文の区切りは、そうした文脈の依存関係の切れ目であることが多いため、一般に文区切りをしてから、各文の範囲内で処理います。
こうした理由から、一般的な自然言語処理では、まず入力文に対して文境界解析を行います。日本語の書き言葉の場合、単に「。」「.」「!」「?」「!?」のいずれかがあれば文末とみなすという設定でもそれなりにうまくいくかもしれません。しかし、ピリオドは小数点や略語にも使われるため、専用の「文境界解析器」を用意したほうが性能が上がるでしょう。書籍で詳細を説明しているように、機械学習を用いれば、より性能の向上が見込めます。
3.2 形態素解析
「形態素」(morpheme)は単語のようなものですが、おおむね単語よりも小さな「意味を持つ最小の単位」と考えればよいでしょう。実際には、誰もが認める形態素の唯一の定義があるわけではなく、研究者によってさまざまな長さ、基準の形態素が提案されています。
日本語の形態素解析器はたいてい、形態素分割をすると同時に品詞や基本形の判定をしてくれます。有名なオープンソースの日本語形態素解析器としては、「MeCab」と「JUMAN」があります。
この例では、MeCabを使って、「機械学習を使えるようになりましょう。」という入力を解析しています。その結果、分割された形態素ごとに1行1行出力され、最初に表層形(もともとの文字列そのまま)、品詞、品詞詳細……などが並んで出力されています。
3.3 係り受け解析
「係り受け」とは言葉と言葉の間の関係で、「係り元」から「係り先」への方向性を持っています。係り受けの出力ができる構文解析器としては「KNP」があります。実際に試してみましょう。KNPは同じ研究グループで開発されている形態素解析器JUMANの処理結果を入力に取るので、次のように実行できます。ここではコマンドの後に、「係り受けとは、言葉と言葉の間の関係です。」を入力しています。
最初の行はヘッダ情報で、「S-ID」は文ID(Sentence ID)で、続いてKNPのバージョン、実行の日付、解析結果の確信度スコアが順に表示されています。そのあとからEOSまでが一文の解析結果です。JUMANのデフォルトでは、「。」「.」「!」「?」「!?」などの文末記号が現れたときを文境界とみなしています。解析結果は、形態素を1つ以上まとめた文節と呼ばれる単位を基本に、文節間の係り受け関係を線で示しています。「係り」が「受けとは、」に係り、「受けとは、」がさらに「関係です。」にかかっています。「言葉と」と「言葉の」は並列関係のため、「<P>」と「PARA」という表示が出力されています。本来は、「係り」と「受けとは」は分割されないのが正しい結果でしょう。これは「係り受け」を1つの形態素とみなすか、この間の文節区切りがなくなれば解決できます。
4. 自然言語処理アプリケーションとしての対話システム
書籍内では、このほかにも詳細を紹介していますが、「述語項」「照応」「共参照」など、さまざまな言語学的解析が可能です。こうした自然言語処理ツールの結果を用いて対話システムなどのアプリケーションを構築していくことになります。
2017年3月には、GAT(Game AI Tournaments)2017の1つとして、「人狼知能プレ大会」が開催されました。このときに初めて自然言語部門を開催し、機械対機械、機械対人間の対戦を自然言語(日本語)で行いました。5チームの参加があり、それぞれ異なる手法で構築された、バラエティに富んだ対話システムが揃いました。以下に挙げたのは、その際の対戦ログの一部で、行頭の番号はエージェント番号を表しています。5人人狼で、村人2、占い師1、人狼1、裏切り者1という構成でしたが、さっそく多数の占い師カミングアウトがあり、お互いに嘘をつき、推測しあっていることがうかがえます。
さて、最終回となる次回は、8月30日にCEDEC2017のセッションとして発表会を開催する、第3回人狼知能大会のセッション見どころを紹介します。プレ大会からさらに進化した自然言語エージェントが見られるのではないでしょうか。