word2vecを使った謎かけ作成アルゴリズムの刷新

データベースを大きく改良したので、それに応じて、謎かけシステムを大幅に改良する。まだ、未完成だが、メモがわりに以下に基本的な手続きを書いておく。データベースとしては、国語辞典、類義語辞典、wikipediaの語彙、wikipedia日本語全文から作ったword2vecベクトル、2500万のツイートコーパスから作ったword2vecベクトルをつかう。どれも、mariadbでデータベース化している。raspberrypi3にも入れることができている。

あまりいい謎かけになっていないが、お題が「ロボット」の例で記述する。まず、出力を示して、のちに説明する。まだ、システム自体も荒削りなので仕方がない。

定義が [ 22 ] ありました
関連性ウェイトの計算に [ wikipedia ] を使います
最良定義 [ ロボット ] => (6:0.83665484)[ 自立歩行する小型ヒューマノイドロボット ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 自立 => 0.47648025
(1) 歩行 => 0.61083984
(2) 小型 => 0.5767887
(3) ヒューマノイド => 0.83665484
(4) ロボット => 1.0000004
同音異義語を探します word = ヒューマノイド yomi = ひゅうまのいど
最良候補に同音異義語がなかったので、セカンドベストを試みます base:歩行 yomi:ほこう
同音異義語を探します word = 歩行 yomi = ほこう
kokugo word0:歩行 yomi:ほこう ==> word1:浦項
kokugo word0:歩行 yomi:ほこう ==> word1:補考
kokugo word0:歩行 yomi:ほこう ==> word1:補講
Wikipedia word0:歩行 yomi:ほこう ==> word1:葆康
同音異義語を解析します
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 浦項 ] => [ ポハン ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) ポ => 0.2070303
(1) ハン => 0.32192305
語:歩行 読み:ほこう 同音異義語:浦項 句:ハン スコア:0.32192305
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補考 ] => [ 本論を補足する考察 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 本論 => NaN
(1) 補足 => 0.29759088
(2) 考察 => 0.3297671
語:歩行 読み:ほこう 同音異義語:補考 句:考察 スコア:0.3297671
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補講 ] => [ 補充のための講義 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 補充 => 0.22250648
(1) 講義 => 0.15278976
語:歩行 読み:ほこう 同音異義語:補講 句:補充 スコア:0.22250648
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 葆康 ] => [ 中華民国・満州国の政治家 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 中華民国 => NaN
(1) 満州国 => 0.16425252
(2) 政治家 => 0.121589884
語:歩行 読み:ほこう 同音異義語:葆康 句:満州国 スコア:0.16425252
-------------------------------------
謎かけに使えそうな同音異義語とその定義文
同音異義語:補考 定義:本論を補足する考察
-------------------------------------
<<謎かけ>>
[ ロボット ] とかけて [ 本論を補足する考察 ] とときます
そのこころは
どちらも [ 歩行 (補考:ほこう) ] がつきものです

まず、お題のロボットの定義文は、先に記載のデータベースの中には、22個もある。ロボットと題するチャペックの小説もあり、いろいろだ。ただ、どれを選ぶかが非常に重要だ。お客さんからお題をロボットともらっても、チャペックの小説のことと受け取ったら駄目である。

そこでどうするのか。22個のそれぞれの定義の中に、ロボットという言葉とword2vecで測って、一番近い距離を有する名詞を含んでいる定義を、定義として採用する。ここでは、6番目の定義が、distanceが0.83665484となって一番高く、ロボット一般というよりも、ヒューマノイドロボットの定義になっている。

次に、このロボットの定義の中にある6個の名詞に注目する。その中で、word2vecで測って、最も近い距離の名詞を取り上げる。ただし、お題のロボットと同じ名刺は距離1.0になって一番近くなることは明らかで、謎かけにならないから外す。

そうすると、ヒューマノイドという言葉が、最もロボットと近親性を持つ言葉であることがわかる。そこで、この言葉と同音異義語の言葉を探す。すなわち、先のデータベース全体の中で「ひゅーまのいど」という読みを持って、意味が異なる言葉を探すのである。

もちろん、そんなものはありそうにない。実際、なかった。そこで、セカンドベストで、先の6個の名詞の中で、次に良い、というかロボットとの距離が0.6以上のことばを調べる。すると「歩行」であることがわかる。そこで「ほこう」という同音を持つ異議語をデータベースの中から探す。

すると、4つあることがわかる。この中でまたどれを選ぶかが問題になる。本当は、私としては、大学の講義の補講を選んで欲しいが、その根拠をなかなか作れない。まずさしあたって、各同音異義語の言葉と、定義の中にある名詞の関係が強いものを選び出すというアルゴリズムにした。すなわち、同音異義語が定義の中にある最も高い関連性を持つ名詞の、その距離が一番近いものが、一番、世間的にありそうなもので、共感を得やすいだろうということである。この計算をすると、結局補講ではなく、補考がそれだということになる。

で、結局、最後に次のような謎かけになるわけである。

<<謎かけ>> [ ロボット ] とかけて [ 本論を補足する考察 ] とときます そのこころは どちらも [ 歩行 (補考:ほこう) ] がつきものです

講義を選べばもっと面白くなるが、これではあまり面白くない。ただ、講義の定義「補充のための講義」の補充も、講義も、補講との距離がそれほど近くないために選ばれなかった。もし選ばれたら、

<<謎かけ>> [ ロボット ] とかけて [ 補充のための講義 ] とときます そのこころは どちらも [ 歩行 (補講:ほこう) ] がつきものです

こちらも大して面白くないか(笑)

word2vecのベクトルをwikipediaのものばかりになっていて、それが補講が選ばれない理由のような気がする。wikipediaはある意味、フォーマルなものが、関連性が高くなるが、twitterは、より普段に使われることばを踏まえた関連性スコアになる。まあ、その辺りも改良の余地がある。

Word2vecをraspberrypiに組み込む方法

M-1が明日なので、ここまでのシステムで挑戦することにして、その後のことを考えている。

今回、他の辞書やwikipedia関連のデータはraspberrypiのmariadbデータベースに組み込めたが、word2vecは色々形を変えて組み込もうとしたが、結局うまくいかず断念した。

冷静に考えると、80万語ものword2vecデータを、ある語の類似の言葉を探すために、ベクトル計算を全体にわたってやるというのがそもそも無理がある。word2vecがやっていることは、例えば、一つの後を200次元のベクトルにして、ある語が与えられた時に、同じように200次元のベクトルを持つ80万語との間の距離をベクトル積で計算して、あたいの大きい20語を選び出すという計算である。こんなことを、パワーのないraspberrypiでせいぜい1秒以内、100m秒くらいで計算させようとするのがそもそも無理なのである。

そこで考えたのは、(1)wikipediaから作ったword2vecのベクトルにも、twitterから作ったそれにも、言葉ではない、ほぼ記号のようなもの、とか、「の」「が」などの助詞系などが結構入っている。どれかはわからないが、それらを除外すること。ただ、大した数ではない可能性がある。

それよりも(2)に、そもそもそんなことをその場で、たとえネタの本番で計算させようとすることに無理があるので、類似語を、80万語の全部にわたって、事前に計算しておいて、それを組み込むといのがある。計算さえて着れば、mariadbに組み込むことができるだろう。そうすれば、近隣語の抽出は、ほぼ、即座にできるはずだ。

そのようなことをやっていけば、もっともっとロボットの漫才は面白くなると思う。基本的な、方向がすでにわかってきたので。

ロボット漫才の台本作成用のプログラミング言語(1)

M-1の日程が、9月23日(2018年)、約3週間後になりそうなので、少し余裕ができて、現状の記録を書いておくことにする。

お客さんからお題をもらってサリーに謎かけをやらせるというネタを始めてから一年半以上たった。ロボットお笑いのレベルをもう一つあげたいと思っていたが、どうするかをずっと考えあぐねていた。夏休みに入って、ロボット漫才についての研究があることを知って関係論文を結構読んだが、その中で行われている試みが使えそうだということがわかった。

主に参考にした論文をリストアップしておく。全てネットからダウンロードできる。
真下遼、2016、「Webニュースを用いた真名井台本自動生成にも続くコミュニケーションロボット」。
青木晢、梅谷智弘、北村達也、灘本明代、2017、「Word2vecを用いた対立後に基づく漫才台本の自動生成」、DEIM Forum 2017-F7-3。
真下遼、青木晢、秋山和寛、考橋一稀、「Webニュースを基にした漫才台本自動生成によるコミュニケーションロボットの開発」(特別賞)。
竹越哲也、萩原将文、2015「ロボット漫才自動生成システム--動作が漫才に与える影響の考察」、日本感性工学会論文誌。
吉田祐介、萩原将文、2012、「漫才形式の対話文自動生成システム」、日本感性工学会論文誌 Vol.11,No.2、pp265-272。

これらを参考にすると、基本的にボケとツッコミのフォーマットを先に用意しておいて、あとでキーワードなどをそれに当てはめるという方法が適切だということがわかった。これを応用すれば、お客様からお題をいただいて、その場で即興で漫才をロボットにやらせることができる。

そのフォーマットをまず用意してみると、この言葉に対して説明文を入れるとか、キーワードと無関係で、音が良く似た言葉を入れるなどの指示をさせる必要がある。これらは、一つのコンピュータ言語として作っておくととても便利に思えた。すなわち、ロボット漫才台本自動生成用のプログラミング言語である。

プログラミング言語の文法の作成はそれほど難しくないというか、初歩的なものはすぐに作れる。ただ、その言語の指示に基ずいて、言葉や文章を用意するインタープリターないしはコンパイラが必要になる。それのためには、実際に言語データや文章のデータベースを用意し、それをコントロールすることが必要になる。

それで、この間、まず、データを用意する作業をしてきた。用意できたものは次の4つだ。
(1)word2vecで解析可能なデータを、日本語wikipediaから作成する。これは、mecabのNeolog辞書を用いたものを作成した。これで、wikipedia上で、関連している言葉をリストアップできるようになった。データは1.02Gバイトある。これは、javaで類語をリストアップすることができるのでemilyに組み込みやすい。
(2)wikipediaのタイトル、読み、ローマ字、その概念の定義、さらに基本的説明をデータベース化してmariadbに乗せた。データの個数が500万以上(正確には5114451個)になった。mariadbはraspberrypiのjavaで制御可能である。
(3)シソーラス辞書データを、mariadbに乗せた。どのように載せるかが色々考えたが、結局ある語とその類語を一対にして読みやローマ字とともにデータ化するのが一番使いやすいと思ってそうした。一つの後にたくさんの類語があるときは、それぞれ一対にしてデータベースに載せるのである。mariadbから、それらをリストアップすることを細かく制御できる。38万個の対をデータベース化した。
(4)日本語辞書をmariadbに乗せた。タイトル、読み、ローマ字、基本説明、対語(あれば)をデータベース化した。約72万タイトルになった。

次に、これらを用いて、漫才スクリプトの処理プログラムを作成することが次の作業になる。

人工無脳の会話ボットとGoogle Cloud APIの接合

「pythonプログラミングパーフェクトマスター」のマルコフ連鎖の応答部分を、WikiPediaからの情報に基づいたものにするという、ほぼ、目的どうりの人工無脳会話ボットができた。
人工無脳は、ほぼお笑いのボケの一種となる。つっこめるのだ。
一方、お題についてのWikipedia情報は、人工知能的なもので、そのギャップが笑いになる。
これをGoogle Cloud APIのスピーチシステムに接合すれば目的のものが出来上がる。

ロボット漫才2『ロボット禁止法』

今から20年後の未来を想定し、ぴっきーとのっきーが漫才をします。国会に「ヒューマノイドロボットの禁止法案」が上程されたという緊迫した状況。なぜそんな法律が・・・・、人に似過ぎたロボットは、人間社会と相いれないのか・・・・

今回は、コマンドモードで作成した一連の動作(登場と退場)の実行を、Dialogのトピックファイルに組み込んだ。位置がずれてしまった。
トピックファイル(台本)はこちらからで見ることができます。

ロボット漫才1『ロボットの時代』


テレパシー機能を使って、ロボットに漫才をやらせてみた。「ロミオとジュリエット」のように、動きを挟んではいない。他の記事で書いたが、一つのトピックファイルで、二つのロボット交互的な機能を果たす、ひとつの、最初のサンプルともなっている。
この台本のトピックファイルをご覧になりたい方は、以下にあります。
ロボット漫才「ロボットの時代」台本
ただし、このトピックファイルは、Choregrapheなどでは、そのまま使用できません。最新のiBotシステムのライブラリがロボットに組み込まれている必要があります。