Erina 「情緒的AIと形態素解析のおはなし」 解説編
開発::EQAI
序
「情緒的AIと形態素解析のおはなし」 でErinaがどのような考えによって解析・動作しているかという話をしたのだが、記事が日本語学的な感覚や知識に依存しすぎていてこのサイトに来る人の多くは「なにを言っているんだかわからない」という状態になってしまったようだ。
そこで、「日本語学の知識」を前提とせずに、どのような考えにあり、どのようなプロセスを経て実装されたのかという説明をしていこうと思う。
実用言語としての自然言語である日本語について
自然言語
自然言語がなにか、ということはコンピュータサイエンティストたる諸兄にも馴染みのある話だと思う。
どのように書くかということを矯正できる形式言語と違い、自然言語は話者による揺れが大きく、その分解析が難しい、というのが主たる定義、話題になることが多い。
そのため、形式に則っていない自然言語をどうやって理解するか、というのは主にAI分野で話題になる。
だが、自然言語そのものについて、AIを扱う人は普通専門家でないため、正確に理解するのが難しい。 なぜならば自然言語は実際にはあまりにも自由であり、振れ幅が大きい。しかも、最終的に解釈が一様に決まるわけでもない。
つまり、解析した際の正解が明らかでなく、同じ入力であっても正解は異なる可能性がある。 精度の検証できないプログラムというのはとても難しい。
そして、一般的に自然言語処理の教師データはスピーチだったり論文だったり、あるいは割と整形されたウェブ文書だったりするのだが、現実にはもっと幅広いものである。
話題にしているのは、そんな自然言語を、普通ではないアプローチで処理する話である。
媒体による言語表現の差異
自然言語の表現というのは媒体によって非常に大きく変わる。 これは、より正解には文化圏などによっても大きく変わるのだが、媒体の違いと違って文化圏の違いをインテリジェントに判断するのはかなり難しいので、文化圏による違いは媒体による違いとは区別して考えたほうが楽である。
媒体による違いというのは、例えばきちんとした文書として書かれるもの、チャット(LINEなどのトークを含む)やTwitterなど短文の会話として書かれているもの、短文の独立した文として書かれているもの、会話を文字起こししたものなどで全く違う形を取る、ということだ。
もちろん、いずれにせよ日本語だろうという考え方はできるし、日本語を扱えることによって媒体を越えて言葉としては扱うことができるのだが、あまりにも形式が違うので、解析面では分けて考えたほうが楽である――というのが私の考え方であるわけだ。
実際にどう違うのか見せたいところだけれど、サンプルの採取が難しい。
例えば整形された文書に関してはこの記事そのものということで良いと思うのだけれど、他はちょっと「適切な」サンプルが簡単には取れないのが困ったところ (勝手に人の発言を載せるのもどうかと思うし)。
私のLINE発言から取ると
mxが?
というのがある。 これは、ちゃんと整形された文章なら出てこないようなものではあるが、つまりは
is mx?
と同じなので、意外とちゃんと形になっている。もう少し突っ込んで
しずりん?
というのもあるけど、このようなものは比較的楽勝なのだ。 なぜならばこの場合
- 〜の話?
- 〜が?
- 〜を?
- それは〜?
くらいしか種類がないためである。これが
つらたん
とかになってくると、日本語としては簡単なのに、解析としては超難しい。
1ワードで終わるだけが難しさではない。例えば
山田すぎでしょww
というのが出てきたとする。 普通に考えれば「山田」は固有名詞だが、実際には「山田すぎる」という形で形容詞として使われている。
このような言葉は「日常語」という。日頃の生活から生まれる、身内でだけ通用する言葉だ。 基本的に新語は圧倒的に日常語が多く、なおかつ語義を知る方法に乏しいので解析は至難の技である。
例えば、私の家庭で通用していた「十字」という言葉がある。 これを言われて何のことかわかる人はまずいないだろうが、傷薬のキップパイロールのことである。 同様に「白いクスリ」というのがあるのだが、これはベビーパウダーをペースト状にしたようなかゆみどめ(チューブそのものが白い)を指している。
日常語は広く通用しないことから書き言葉としてはあまり登場しない。 そのため、語義を知る方法がない上に、言葉の役割(品詞すらも)を知る方法も乏しく、解析が難しい。 この時点で既に辞書ベースの方法で解析できないことがわかる。
このような日常語は限られたコミュニティで発生するため、現在だと特定のYouTubeチャンネルでしか使われない言葉など「インターネット上から広く収集可能だが広く通用はしない言葉」というのが結構あって難しい。しかも、一般的な日常語と違いそこそこ長いフレーズだったりするからより難易度は高い。
また、Twitterのような限られた発信になると話はまたちょっと違う。 チャットの場合は、何を前提としているか」を把握すれば補完可能であることが多いのだが、Twitterの場合前後文脈よりも背景に依存した短文が発生しやすいのだ。 例えば私の
「スープにラー油」が「スープラ油」に見える呪い
という文は言っていることはわかるが何を言っているのかわからない文である。 Twitterなので「スープにラー油」という言葉がタイムライン上に流れてきて、それが「スープラ油」に見えてしまった、という話なのはTwitterユーザーであれば比較的簡単に推測可能であり、最後の「呪い」はあまり意味のない(全く意味がないわけではないが)言葉であるため文意を汲み取る上では捨てて良いということがわかる。もちろん、より人間的にはこの表現から「スープラという存在が私の中で大きいのでそれらしき文字並びをスープラという言葉に寄せて見えてしまう」ということまで組み取れればパーフェクトだが、いきなりそれはハードルが高すぎる(し、Erinaも実際にそんなニュアンスを汲み取るようにはできていない)。
チャットと比べると発信として書かれる短文は唐突であり、より解析が難しい。
これが会話起こしになるともっとカオスだ。例えば次のような会話だとどうだろう。 以下は実際の会話から拾ったものである。
A 「え、やば」
B 「なに」
B 「すっげ」
C 「え、なんで?」
A 「さぁ」
B 「マック?」
C 「や、全然マック」
D 「シュッシュッ」
A 「てか別によくない?」
B 「なんか買ってく?」
C 「あっち」
国語の先生にこれでどうして会話が成り立ち、また何を思ってこのような言葉が発せられているのかということを問うたらさぞ悩みそうだ。
そこにいればおおよそ話はつかめるような内容なのだが、それはこの言葉以外に非常に多くの情報を使っているからであり、情報がそぎ落とされ、会話だけになるともはや何がなんだかわからない。 その文字だけでこの4人が何を言っているか理解できる人はちょっとおかしいと思う。
ちなみに、Dの「シュッシュッ」はCに向かって突如としてシャドーボクシングを始めたのであり1、「あっち」は施設の反対側を指していてマクドナルドのことではない。そして、この会話はケンタッキー・フライド・チキンが行列をなしていたことに発端している。
ここまで説明すればなんとなく状況や光景が見えてくるはずだ。 だが、ここではあくまで言葉の話をしているし、「日本語は視覚的情報によって文法が変わる」なんてルールはない。 しかし、実際にはいかに彼らであったとしてもこれをLINEなど文字情報だけの中でやりとりするのは不可能なはずだ。
会話文ならではだと感じるのが「全然マック」である。 LINEなどのテキスト打ちでもこのような言葉はさすがに修正されてしまうが、音声の会話だと「言ったものは取り消せない」ので、追加情報が後から増える形になる。この場合、「マクドナルドは混雑していない」ということを示すための否定として「全然」が先にきて、マクドナルドという言葉が追加されたわけだ。
このレベルの言葉を情報が欠落した状態で解析するのは至難の業であるし、現実問題としてこのような情報はErinaは扱わない。 むしろ、これが「自然な会話である」と認識されると困るので、こうした会話はフィルタで学習対象から外すようになっている。 また、Erina自身がこのような会話をすることもできない。
言葉の構成とうなぎ文
基本的に日本語は主語、述語という構成になることになっているのだが、これは文章でないと非常に通用しにくい。
前述の通り実用的な場面において、単一文節や単語からなる文というのは頻出する。 さらに、実際には助詞や接続語が誤っていたり省略されるケースが多かったり、文法上はかからないはずの言葉にかかっていたりする。
これを一般化したのが「日本語は任意の箇所を任意に省略可能である」という解釈で、
僕はうなぎだ
といううなぎ文に対する回答でもあると考えているわけだ。 この場合、
僕(が注文するの)はうなぎだ
ということだ。そして、任意の箇所を任意に省略するということは、
(僕が注文するのは)うなぎ(だ)
でも構わないわけである。だが、「本当にどこでも省略できるか」というとそうでもなく、話の中核になる部分は(言うのであれば)省略できない。だから
僕(が注文するのはうなぎ)だ
にはできない。もっとも、補完可能な発言そのものをカットしてしまうことは可能だ。
さて、では「発言の中には必ず中核的な言葉そのものが含まれるのか?」という話になるのだが、この答はNOである。 例えば次の発言はどうだろう
☂!
絵文字が駄目ならこれでもいいのだが
傘!
これを人間的に推測すると
- 雨が降ってきたよ
- 雨が降るから傘を持っていきなさい
- 傘を忘れているよ
- 雨が降っているから傘を持ってきて
などが推測される。同様に
☂?
も成立するし、単に
☂
だと両方を内包した発言になる。さて、傘という言葉が入っていても傘という言葉は中核的なものてせなかったりするし、そもそも雨が中核的な言葉で傘は関係なかったりする。 この場合、「中核的な言葉を代用している」わけだ。 これは省略しなければ傘という言葉が出てこないので、「省略という形で言葉が圧縮される中でより象徴的なワードで省略されたワードを表現する」というテクニックが用いられることがあり、こうなると中核的な言葉が必ず出てくるという前提は成り立たなくなる。
こうしたやりとりは家族LINEなど、親しい相手との会話でより増える。
解析する
解析の方針と形態素解析
ここまでの内容からもわかるように、会話ことばというのはあまりlogicalではない。 だが、通じるのだ。 そして、通じるための要素として、最低限中核的な言葉が含まれているか、もしくは中核的な言葉に展開可能な要素が含まれている必要がある。
それを解釈するのに、中学・高校で習うような「国語」の知識は正直なところほぼ役に立たない。 それは、あまりに「綺麗な文章」すぎて、実践的には書き言葉の文章を解析するのですらまるで役に立たない。
必要なのは日本語学として実用上の言葉を研究することであり、それがどれだけ無軌道であり多彩であるかを知ることだ。
形態素解析が歯が立たない何よりの理由がここにある。
% mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
山田すぎるwwww
山田 名詞,固有名詞,人名,姓,*,*,山田,ヤマダ,ヤマダ
すぎる 動詞,非自立,*,*,一段,基本形,すぎる,スギル,スギル
wwww 名詞,固有名詞,組織,*,*,*,*
EOS
形態素解析器は強力であるからこそ、どうしてもその結果を信じてしまいたくなる。だが、これは正しくは「山田」は形容詞でなければいけないし、「wwww」は記号一般とか感嘆符とか、そういう扱いにできねばならぬ。
だから、形態素解析の結果に頼った解析というのはできないのだ。 もしも日常語に至るまで辞書収録が可能であるならば形態素解析ベースの解析というのが現実味を帯びてくる。 しかしその場合においても新語や打ち間違いなどには依然として対応できない。
このような方法をベースとした解析を行うと、なんというか、空気が読めないというか、話が通じないというか、文脈よりも語義を優先するというか、なんか発達障害っぽい感じの会話になってしまう。
そもそも人間はそのように品詞を辞書ベースでわけているのではなく言葉の形に基づくほうを優先するし、それどころかそれっぽく連想させる単語が含まれるだけでも通じてしまうのだから、人間的に言葉を解釈するAIもまた「形と言葉からなんとなく意味を推測してそうだと考える」という形式のほうが良いのではないか、というのが私の考えなわけだ。
そもそも、曖昧な言葉で行われる会話において意味を取り違えたり、会話がすれ違うことなど日常的にあるのだから、そういうのがあるほうがむしろ人間的だ。 むしろ、「そうじゃない」と言っているのに「そうじゃない」という言葉そのものに対して反応するようなAIのほうがずっと人間味が薄い。
よって、「空気で会話する」がテーマとなるわけだ。
文の形を見極める
人間が判断する重要な要素が、文の「形式」である。
主旨と全くつながらない文の形式に直面させることで、人を混乱させたり、言葉上から読み取れる主旨を完全に勘違いさせたりすることができる。 それはぜひ高校の国語のテストに出してほしいくらい面白い実験だ。
例えば
あの人がパンダがかわいいだったのかしら
は、形式的に解釈すると
あの人が 「パンダがかわいい」 だったのかしら
になる。形式に則って解釈すると、ある人が挨拶していって、その人は誰かがわからないが、思い当たるとすれば「ペンネーム『パンダがかわいい』さん」なのではないか、が恐らく正しいのだが、「形式のほうがバグってる」としたらどうだろう?
この場合、形式は「X が Y だった…か…」なのだが、じゃあこっちを変えると
あの人のパンダがかわいいのかしら
あの人はパンダがかわいいのかしら
ができたりする(もちろん、「パンダがかわいい」を分解することもできる)。
だが、何が言いたいのかはどうしても分からない。 結局唯一通用しそうな形式に則った「パンダかわいいさん」説を採用することぐらいしかできない。 ちなみに、これでもまだ元の状態で意味が通じるように工夫したくらいだ。
このため、言葉の形式というのはおおよそ正しい可能性が高い。 ただし、言葉は先頭から組まれるために「前にあるほど助詞が間違っている可能性が高い」ことに注意しなければならない。 だから、言葉の形式において助詞は曖昧であることを許容する必要がある。
言葉の形式というのはほぼ無数にあるのだが、「実用されるもの」に関してはだいぶ少ない。 そして、前述の媒体の違いというものが活きてくる。
例えば「〜とは〜なのである」という形式は文章だと結構出てくるのだが、会話ではまず出てこない。
一方、「〜くない?」という表現は、会話だと頻出するが、文章だと「く」の前に置かれる言葉がすごく少ない。
そこで、こうした形式にマッチするかどうかを片っ端から試すのだ。
各形式においてはその媒体においてどの程度使われるかということに基づいた「ベーススコア」が設定されている。 そして、「どの程度マッチするか」ということによって係数をかけていき、スコアの高いものを「恐らくこの形式なのだろう」と推測するようになっている。
マッチ度が低いというのは「助詞が正しく期待されるものと違う」「形式的には合っているが、後ろに許容されないゴミが残る」「前後に解析不能な文字列が残ってしまう」などである。
ベーススコアと係数は、手動でものすっっっっっっっっっっっつごい数のマッチを行い、どの結果も自然になるまで手動でチューニングしたのである。これも教師データは数GBはあるので、普通に吐くレベルの作業である。 会話はどちらかというと「形式を網羅して分類する」というのが大変で、調整が大変だったのはどちらかというと文章用のパーサだったと記憶している。
なお、相手が特定できる状態ではその相手の話し方に合わせてベーススコアに対して1を越えることもある係数を「その人っぽい話し方」としてかけるようになる学習機能を備えている。
ことばの形を見極める
文の形を特定することで最も得たい情報は、「中核となる言葉がどこにあるのか」である。
前述の通り、その発言の意図を察するのに最も必要なのは「中核的なことば」であり、それを検出することさえできればそれっぽく話を合わせることはできるのだ。
そして中核的なことばの候補になるセクションの中から「らしさ」と「優先度」によって言葉を拾い上げる。 言葉の辞書的な探索よりもこれを先に行うのだ。
例えば先の
山田すぎる
だが、「〜すぎる」というのはかなり強い結合を持つ言葉として扱われる。 つまり、
山に風過ぎる
みたいな言葉を
山に風、過ぎる
と解釈するわけではなく、「風過ぎる」という言葉として解釈することを優先するということである。 ただし、「すぎる」の前が助詞である場合や句読点である場合は別である。
そして、これを一体とした上で「過ぎる」という言葉自体は修飾的なので、前の言葉に対して程度を足す表現であると理解する。だから、
山田すぎる
は「山田+」と解釈されるわけだ。
日本将棋連盟棋士五段の伊藤真吾氏は自身のYouTubeチャンネルでよく
二択すぎる!
という発言をする。
「すぎる」がつく言葉というのは、自然なのは形容詞であるが、実用的には名詞である場合もある。
名詞の形容詞的用法だが、「あまりにも〜である」か、あるいは「とても〜のようである」あたりが有力である。 だが、「X+」という表現でどちらもカバーできるし、その違いをちゃんと区別することは会話をつなげる上でとても重要なわけではない。
このように言葉の結合でチャンク化を行う。 このフローは各「文の形の検出」に続く形で行われ、「ことばの形」がどれだけ綺麗に決まったかで文のスコアに対する補正係数として機能する。
ディティールを検出する
これでおおよそどのようなことを言っているかを知るための情報は得られたのだが、Erinaの場合行動心理学的な「読み込み」を行うため、ここまでのフローでは捨てられてしまう言葉の細かな要素を広い上げる処理を行う。
これは単純に文の中に含まれる「言葉の特徴」を検出し、またそれ以外にも要素がある場合(発言時刻や、反応時間など)も含め置いて、発言に含まれる「要素」としてストアする。 この要素は言葉を理解する上では利用されない。
ことばを検出する
「文の形」と「ことばの形」から中核的な言葉がありそうな場所に見当をつけ、そこにある言葉から何を言っているのかを推測する。その際、文の形がどうなっているかといったことをヒントとしては使用するが、必ずしも文法に則った解釈をするわけではない。 重要なのは、「中核となる言葉を元に曖昧に解釈する」ということなのだ。
ここまで検出したものを「局面」として保持する。 この局面にはコンテキストが含まれ、つまり「今この局面に至る以前にどのような解析結果と選択があってこの局面に至っているか」という情報が含まれている。
リアクションする
本来の機能からいえばここまで解析したあと、それをどのように活かすかというのはいくつもあるのだが、Erinaに関して言えば「リアクションを生成する」しかない。
そこで局面をデータベースソフトウェア(Erina receptor)に問い合わせる。 問い合わせる局面は解析においてスコアの高かった解釈を上位任意個数(インスタンスの設定として選択できる)に絞り込み、その評価を依頼する形だ。
receptorは要素の組み合わせなど、一連のやりとりに見られる性質を理解するようにできているため、ここまでの「言葉の解析」で行う情報だけに頼るわけではない。
receptorはここまで説明してきたのとは全く異なる原理で動作する。この動作はディープラーニング寄りであり、言い換えると数学寄りである。(もっとも、数学的要素よりも経験的・観測上のロジックのほうが主だけれども)
そしてreceptorは解析によって提示された断片的な情報から、「今この状態はコレ」というようにIDを振られた盤面を提示する。これは、「この盤面がこの局面と本質的に等しい」という意味である。 そして、それを持って次にどのようにアクションして次の盤面をこれにすべきである、という「指し手」を回答する。
これは局面の同一性の判定自体に曖昧な部分があるため、「探索深度」というものが存在する。 つまり複数の候補を返すようにできているのだが、その「有力さ」について、context filterを使用してその判定に調整を加える。 ディープラーニングによって判断するreceptorに対して、手動でパラメータを変動させるフィルタを入れる、というのはすごく悪手に見えるのだが、実際これがないと良い結果が得られない。
あとはreceptorの結果から選択したり、結果をeditして応答を生成したりといった流れで、このあたりの話は以前にも軽く説明したし、今回の主旨からは外れてしまうので割愛させていただく。
Erina 言語解析のポイント
Erinaが採用している言語解析の戦略はいくつかのポイントがある。
複数のアプローチ
Erinaは「自らの手で書いた学術的な理屈に基づくロジック」「機械学習による統計的なロジック」「経験則と感覚に基づくフィルタ」の重ね合わせだ。
コンピュータが苦手なことを人間が補う、という手法は以前からあるもので、かなり有力だと考えられている。 また、全く異なる手法を組み合わせること自体も有力であると考えられている。
だが、幅広いスキルが必要であり、開発するにも運用するにもコストが恒常的に増してしまうことから実際にはあまり採用されない。
Erinaの場合は、積極的に複数のアプローチを採用している。 少なくとも私のできる範囲では、精度を達成する唯一の方法だと考えられたからだ。
曖昧
Erinaが曖昧に解釈し、曖昧に返すのは、人間の思考を模したところではある。 人間でも曖昧な言葉でも解釈できるし、応答するにしてもそこまで厳密に返すわけではない。 そして、分からないことははぐらかしたりもするし、答えたくないことはごまかしたりもする。
そういう「人間的な性質を組み込む」というのはErinaにとって重要なポイントである。 だから、「人間が解釈できる曖昧さから人間が何を拾って解釈するか」という観点を強く持ち込んでいる。
また、応答側では曖昧な保留をするようにすることで、確信を持って解釈できない場合に「曖昧な内容を人間は今考えていることに沿った解釈をする」というメカニズムを利用している。
常識に立ち向かい、学術に忠実
言語を解釈する上での常識的な手法、あるいは学校で習うような「日本語の文法」に対しては随分挑戦的な振る舞いである。 さらにいえば、現行の学術的解釈に反する理解で組み立てているロジックもある。
だが、「仮説を立て、実証する」というのはまさに学術の基本であり、徹底してそれだけを頼りに組み立てている。
できることから
Perlerだった私にとっては正規表現マッチングというのは初歩的なスキルであり、「形から括りだす」というのは私の知識の中でも可能なことだった。
そういう、自分のできるところから発見、そして実験を積み重ねて着実に進歩させてきた、という長年の蓄積が形作るものであり、あるスキルや、あるいはある手法などをやることが目的ではなく、達成のためにできることを組み合わせてきたのがErinaである。それが、Erinaのロジックの所以となっている。