ChienomiChienomi情緒的AIと形態素解析のおはなし序Erinaは情緒的AIである。当然ながら「会話する」という機能は重要であり、Surtrにとっても「相手の言っていることを理解する」ということは非常に重要な要素であり、実のところ「一番最初に実装された機能」である。私がErinaを「文系AI」と呼ぶ最大の理由がこの解析機能である。Erinaは大した統計機能を持っていない。その理由は、私に統計学に関する十分な知識がないためだ。そこで、私は膨大な会話や文章を読みながら、「片っ端から触れたテキストを解析できるように」解析エンジンを改良していったのである。ここで紹介するのは実装ではなく、考え方やアプローチについてだが、ここに書いてあることを元にすれば(労力を厭わなければ)Erinaと同じようなエンジンを実装することが可能である。Erinaと形態素解析いきなりタイトル詐欺のようだが、実はErinaに形態素解析が使用されはじめたのは2016年からで、それまでは「形態素解析は」行っていなかった。これは、(Erinaが非ディープラーニングであるように)特別な意図を持って形態素解析を排したわけではなく、単純に形態素解析の精度に満足しなかったためである。2016年からは、複数の解釈がどちらも同じスコアで成立するような場合に形態素解析を行うようになったほか、パート分け後の精度を上げるために使用している(特に、名詞と助詞を検出したい)。使用しているのはMeCab/ipadicである。他の選択肢としてはChaSenも試したのだが、MeCab/ipadicのほうが「使いやすかったので」この構成で使用している。形態素解析が万能でないことは例えば次の例でわかる。名詞,一般,*,*,*,*,*とだいぶ甘い。名詞,一般,*,*,*,*,魔手,マシュ,マシュとやはりチャットで使うような崩し方には対応できない。動詞,自立,*,*,五段・サ行,基本形,しす,シス,シスと、「かわゆい」を認識するのは良いが、「くるしす」は解釈できない。小波さんは見てて苦しくなるというより悶えるような可愛さである。"連語"EOSだが、もっとスランギーだったりすると結構厳しい。問題なのは、MeCabから提示される情報は、喉から手が出るほど欲しいということだ。そのため、形態素解析を使う前提にすると、MeCabが提示する情報を信じ切ってしまい、かなり特徴的な間違え方をするようになる。使って解析する方法は自分の望む目的を達成できなかったため、断念したのである。Erinaの文章解析まず根本的な話として、テキストは形式的な文章として書かれたものコラム記事など口語的文章として書かれたものチャットなど口語を表現したのも音声を文字起こししたもので全く違う構造を持っている。このことから、それぞれに合わせて「実用上出現する」言葉の構造を正規表現を用いて解析する手法を採用した。これは、形態素解析エンジンを自前で実装するのに近い作業だが、手法が邪道もいいところである。原則としてこの解析器は句読点を信じる。実際には特に統合失調症患者の書いた文章など、句読点がランダムである可能性もあるのだが、解析の余地がある限り句読点を信じて解析することになっている。次のような正規表現を使うのである。/.*?は.*?だ(?:[。..\s.....]*|$)これによってその文が「〇〇は△△だ」の形式たりえるかどうかを判定する。実際にはこのケースにおいては「だ」の言い換えで構造が変わらない言葉があり、また終助詞がつく場合も構造は変わらないと考えられるから/.*?は.*?(?:だ|です|じゃ|である)(?:わ|ね)?(?:[。..\s.....]*|$)のようになる。実際はもっと幅広い表記ゆれに対応しているため、ここまで単純なパターンを利用しているわけではない。これで用意された構造のパターンすべてに対してマッチを行う。マッチしたパターンをストアする。場合によっては読点を挟まずに複合文になっている可能性があるため、このような場合はパターンの複合としてストアされる。この状態から、文を起り部、目的部といった形に分割する。あるものではなく、Erinaの動作上それを確定させるのに必要な形式である。ここで例えば「〇〇は△△だ」の形式に当てはまるものの、あまりらしくない認識になるもの(例えば「綺麗は僕だね」)には低いスコアがつき、自然なもの(「君は綺麗だ」)には高いスコアがつく。この分類時にそのパートにおける核となるもの(特に名詞)を抽出するようになっている。この段階ではものすごくマッチングインデックスを使うのだが、マッチングインデックスを使った操作というのは私が書いた中ではほとんど経験がなく、私としては「マッチでインデックスを利用したコード」というとこのコードが一番に思い浮かぶ。細かい言葉の違いというのはこのタイミングでは一旦捨てられる。高いスコアとなった構造がこの文における構造であるとみなす。これにつづいて、意味的な認識を行う。これは例えば「君は綺麗だからね」といった場合、単純に受け取れば賛辞なのだが、ひょっとしたら皮肉かもしれないし、そもそもこの文は「君」のことを言っているわけではないかもしれない。次の会話を考えみよう。「君は綺麗だからね」この場合、「君は綺麗だから大したことないと感じるのかもしれないが、君でなければ十分可愛いと感じられるだろう」という意味合いとなり、話題にしているのは「そのアイドルの可愛さ」についてであり、「君の綺麗さ」についてではない。この解析器はこのような「取りうるニュアンス」を推定するようになっている。解析器自体がどのようなニュアンスが正解であるかということを確定するわけではない。これは、文脈を解釈する部分でexpectedとかaboutといった項目があり、それに基づいて「予期される話の流れとして最も自然なもの」を選択するという方法になっている。(わからない時は素直な理解を選択する)ちなみに、推定される言語的感情というパラメータもあるが、これは一般的なAIの挙動に近いものである。一番には、Erinaが扱うものの中心にあるのが綺麗な文章ではない、という点が大きい。そもそも話者が怪しい日本語を話す可能性はかなり高く、であれば日本語的な正しさに基づく判定というのは実用性に乏しい。感情の3要素に分離できるので、分離された3アプローチをそれぞれ(解析結果を利用しつつも)別のパラメータとすることによりどういう観点から行動が連続しているのかということが理解できるようになっている。「意味」においては、言語を「正しく」認識する必要はなく、正しき認識しようとするとハマってしまうような問題を、「認識できればそれで良い」と考えれば怪しい日本語も比較的理解できるようになる。これは、人が言葉を「意味的に近い語群」「音的に近い語群」に分類し、その近い語群をコレクト対象にした上で、記号化して解釈するからだ。“あなたのことを今まであまり良く見ていなかったけど、こうして改めてみるととても綺麗な人だとわかった。(update)”で良いのである。AD+というのは「とても」「すごく」「大変」など程度を増やす形容詞のことで、ここでのbeは実際にbeが入るかどうかはおいといて、「左辺の定義を右辺で行う」ということを意味している。それ以外の箇所は、「従来の定義を捨てて、新たな定義を獲得する」ことを意味する言葉であるから、updateであるということが分かればそれ以上の情報は必要ない。これはあくまで意味的理解の話である。意図としては評価を改めたことをYOUに伝えるというのは、YOUに対する接し方の変更を通知するものである可能性が高い。与えられた文はこれだけだが、ここからさらに続くのであれば、これは全体をもって動機の説明である可能性がある(つまり、意味的にはbecauseであり、構造的には前置きである)。した解釈は「意図的解釈」とするわけだ。このような手法を採用する最大の理由は、「日本語が任意の箇所を省略できる言語である」という私の理解による。うなぎ文であるが、形態素解析に頼るとうなぎ文(「僕はウナギだ。」)というのは完全にハマる。これを「任意の箇所を省略できる」と定義すると「僕(が注文するの)はウナギだ。」と解釈することができ、解決する。同様にこんにゃく文も「コンニャクは(食べても)太らない(食べ物だ)」と解釈することができる。ここで問題になるのが、「省略される/登場する助詞、接続詞が登場している言葉についているか否かは一定でない」ということである。Yというのは、Xが主体となる動詞の目的語としてYがあるという意味である)。この場合、こんにゃくの定義として「太らない」が与えられているという情報があるだけなので、こんにゃく自体が太らないのか、こんにゃくが太らないという属性を持っているのかというのは分からないのである。太らない”という情報は“こんにゃく”が参照されたときに含みおくことで十分なのである。した「言葉に対する曖昧な理解」を適用することで、「安定して会話がだいたい通じる」AIが出来上がる。私が考えるに、結局のところこれが一番まともに言葉を理解するメソッドだし、そもそもこのメソッドは人間の言語認識・思考組み立ての手順にかなり近いのでAIの思考ロジックとしても適当である。実際にこれを正解にするまでには、サンプルになったテキストに対してすべて正解できるようになるまで、繰り返し構造の追加、スコアリングの調整などを行った。(もちろん、手間はよりかかるが)。言葉の正しい認識と定義は言葉単独ではできない、と考えているので、この解析はあくまで文脈機能と組み合わせることを前提としている。これがErinaの出発点となる実装であり、このアプローチをとったことがErinaがうまくいく原動力となった。このアプローチは単純な人工無能によるマッチングアプローチに対して発展的に到達できるというのもポイントだ。このように構造だけを切り出して、結果が論理的に整合するように切り出していくと、捕らわれがちなディティールを切り落として本質だけをまとめることができ、そうすると「意外とパターンは少ない」ということに気づくことができる。これは、複数の全く異なる語義が与えられていると思われている単語が、いずれの語義も底では共通しているということに気づくことができるのに似ている。様々な手法やツールが、「正しい定義」に基づいているために実用上のものを処理できないという問題を抱えていることにも直面する。Erinaの解析器が文章タイプによって異なる複数のメソッドを持っているのはこのためである。文章タイプによって「実際に使われる言葉」が違うので、「想定される期待値と言い回しの一般性」が大きく変わってしまう。有力視する順序を変えなければならないし、中には文章タイプによってまず登場しないために無駄にひっかかってしまう構造もあったりするので、それらを除外するために異なる定義が使用されている。会話起こしテキストに対して処理を行う場合、文脈依存や前提知識依存が激しいため、単独の文で意味を確定することはほとんどできない。これは、余人が聞いたときに話の内容が理解できないとの同じ問題であるため、言葉をより外形的にとらえてストアしていくことが必要になる。