2018年06月29日

架空世界のニュース記事を自動生成する新聞社風サイト『夜売新聞』

架空世界のニュース記事を自動生成する新聞社風サイト『夜売新聞』というものを作ってみました。



ニュース記事は単なるテンプレートなのですが、将来的にはもう少しインテリジェントに生成させていきたいと考えています。あと、ニュースと小説以外にも、いろいろ自動生成ネタをぶっ込んでいく個人的な実験場にしようかなと思っています。

posted by 妹尾雄大 at 16:15| Comment(3) | 夜売新聞 | このブログの読者になる | 更新情報をチェックする

2018年06月17日

伏線自動生成による物語自動生成の実現に向けて:補足

昨日の、

の、追加補足です。


■書きたいシーンが思いつかない場合

小説を書き始めるにあたって、まずは書きたいシーンを思い浮かべる必要があるのですが、この初手から思いつかない場合があります。その場合は、テンプレートを使います。穴埋め式とも言いましょうか。例えば、

・(人物A)が(人物B)を倒す

といったものです。既にキャラクターを思い描けている場合は、そのキャラ名を入れても構いませんが、そうでなければ、そのカッコの中に職業や役職などを入れます。

・勇者が魔王を倒す
・生徒会長が校長を倒す
・バイト店員が社長を倒す

などですね。この場合、「倒す」は物理的ではなく抽象的な意味で構いません。また、スタート時点での力関係は「人物A<人物B」の方が好ましいです。そうでないと、単なるイジメになってしまいますからね(笑)。


■その他のテンプレート

テンプレートとしては、他にも、

・(人物A)が(人物B)を助ける
・(人物A)が(人物B)の秘密を知る
・(人物A)が(人物B)の隠れた性格を知る
・(人物A)が(人物B)に仕事を依頼する
・(人物A)が(場所C)でバイトを始める
・(人物A)がこれまで住んでいた(場所C)を追い出される

等々、これまで読んだ本やアニメ・ゲームなどのストーリーから抽出して、リスト化しておくと便利です。


■原因・結果シーンテンプレート

上記のようなシーンテンプレートは、物語自動生成プログラムを作る場合にはとてもマッチしており、単に空欄をランダムに埋めるだけですみます。

ただ、1つのシーンがそれによって作られたとしても、物語にはなりません。前回の記事で説明したとおり、複数のシーンを結びつける必要があります。

そのために、前述のテンプレートを拡張し、原因テンプレートと結果テンプレートのセットを考えます。

原因:(人物A)が(人物B)を助ける
結果:(人物B)が(人物A)に好意を持つ

だとか、

原因:(人物A)が(人物B)の秘密を知る
結果1:(人物B)は(人物A)を殺害しようとする
結果2:(人物B)は(人物A)に口止めをお願いする
結果3:(人物A)は(人物B)に脅迫する

というように、複数の結果からどれかを選ぶというセットも考えられます。

また、その結果シーンを原因シーンとして、新たな結果シーンに結びつけていくことで、ストーリーがつながっていくことになります。

なお、原因シーンと結果シーンは、シナリオ上即時に連結する必要はなく、間に他のシーンを挟んでも構いません。


■それでも書きたいシーンが思いつかない場合

この段階で登場人物のイメージが出来上がってきていれば、あとはいくつかシーンを想像し連結していき、矛盾点を潰していけば1本のストーリーになると思いますが、それでもまだ想像力が喚起されない場合があります。

その場合は、キャラクターの個性を強化します。たとえば、先ほど職業・役職を割り当てると説明しましたが、1人に複数の職業・役職を割り当てます。

・小学生だけど総理大臣
・国王だけどパン職人
・教師だけどアサシン
・公務員だけどプロボクサー

等々、意外性のある組み合わせにすることで、二面性から独特なキャラクターを生み出しやすくなるかと思います。

また、職業でなくても、正確や特性でも構いません。


■複数職業割り当てにおけるAIの問題

上記の複数職業割り当てを物語自動生成で利用する場合、一つ問題が生じます。それは、世界観の設定を変更しても矛盾する組み合わせが生じる問題です。たとえば、

・小学生だけど中学生

といったものです。

解決方法としては、職業リストの組み合わせテーブルを手作業で作っておく方法がありますが、職業が100あるとすると100×100=10000通りになり、人海戦術でやるとしても、それなりの分量になります。

プログラム的にこれを排除するためには、

・中学生は小学校の卒業資格を保有している必要がある
・小学校の卒業資格を保有している者は小学生になれない

といった論理式を記述しておいて処理する方法もありますが、これもまた前回の記事の話と同様に、どこまで書いておけばいいのかと、これですべてを網羅できるわけではない問題があります。


■まとめ

前回含めて、小説の書き方入門とAIの話が混じって、読んでいる方にはややこしかったかもしれませんが、あくまで個人的な目標は物語自動生成の実現です。

現状の課題としては、自動生成過程で発生した矛盾をどうやって判定して修正するかなのですが、知識や概念を記号で表現するオントロジー工学の延長線上に実現の可能性があるのかは、個人的には少し疑問に思っています。

記号で表現すると、どうしても抜け落ちる情報があり、また論理的な矛盾ではなく、感情的にしっくりこないといった判定が困難です。そのあたりはニューラルネットワーク系のコネクショニズムの方面から新しいアイディアが出来ていたらいいなぁと思う次第です。
posted by 妹尾雄大 at 13:31| Comment(0) | 物語自動生成 | このブログの読者になる | 更新情報をチェックする

2018年06月16日

伏線自動生成による物語自動生成の実現に向けて

以前、ブログに投稿した

で、物語自動生成プログラムを作ってみましたが、ああいった人工無脳的なアプローチではなく、トップダウン方式に物語を生成する方法に挑戦してみようかと思います。


■伏線とは何か?

まずその前に、物語を作る上で重要な「伏線」について考えてみたいと思います。Wikipediaによると、

伏線(ふくせん)は、物語や作劇上の技術のひとつで、物語上において未来に起こる重要な出来事を、些細なかたちで前もって暗示しておく手法である。

だそうです。うん、まあ意味は分かるのですけど、具体的にどうやって「伏線を張る」のかがいまいちよく分からないので、試しにラノベ1冊分程度の量の小説を書いてみました。


■実際に小説を書いてみた

出来上がったものは、上記サイトで公開しておりますので、お暇な方は読んで頂ければと思います。なお、このブログ記事ではネタバレは含んでおりませんし、以下の記事内容とは全然関係ありませんので、特に読まなくても構わないです(笑)。

ちなみに、小説をまともに書いたのは人生でこれが初めてだったので、小説の書き方を構築するところから始めました。


■シーンの作成と連結

まず、書きたいシーンをいくつかイメージし、それを時系列につなぎ合わせていくという手法をとりました。とりあえず、誰もが知っているであろう『桃太郎』を題材に説明していきたいと思います。

たとえば、「主人公(桃太郎)が鬼を退治する」というシーンを思いついたとします。次に、そのシーンを「原因→結果」という関連性における「結果」だと仮定し、対応する「原因」のシーンを想像します。

ああ、その前に、全体的なテーマをある程度決めておくと、各シーンを想像しやすくなります。今回は「子供向け」「勧善懲悪モノ」ということにしておきます。

そうなると、「桃太郎が正義で、鬼が悪」になりますので、鬼がいかに悪い奴なのかを説明するシーンを作ります。ここでは「鬼が村人に悪さをしていたという話を桃太郎が聞く」というシーンにします。

元の『桃太郎』の話に合わせる必要がなければ、「桃太郎の家族または友人等が鬼に殺される」などでも構いませんが、「子供向け」の作品なので生々しいのは避けたいと思います。

このように、あるシーンの原因となるシーンを、時間をさかのぼって配置することが「伏線を張る」方法の一つとなります。逆に時間の進行方向に向かって伏線を張る方法もあります。

先ほどは「桃太郎が鬼を退治する」を結果シーンと位置づけましたが、今度はこれを原因シーンとします。すると、「鬼が宝物を差し出してきた」「村に平和が戻った」という結果シーンが考えられ、それを時間方向の先に配置することが出来ます。


■シーンの想像方法

なお、あるシーンから他のシーンを想像できない場合は、とにかく自問自答を繰り返します。どういう自問自答をおこなうかを、あらかじめリスト化しておいて、そこからランダムに選択して考えるという方法もおすすめです。たとえば、

◎対人物
・人物Aは人物Bをどう思っていますか?
・人物Aは人物Bに対して心理的物理的にどのような影響を与えますか?
・人物Aと人物Bの関係はどのように変化しますか?
・人物Aは人物Bとの関係に満足していますか?また、変えたいと思っていますか?
・人物Aは人物Bから誤解されていることはありますか?また、それは解消されますか?
・人物Aの望みを人物Bは手伝ってくれますか?
・人物Aの欠点は人物Bに被害を与えていますか?

◎人物(ストーリーを通して)
・人物Aの考え方は変化しますか?
・人物Aの望みは満たされますか?

◎人物
・人物Aが日々継続してやっていることはありますか?
・人物Aが守りたいものはなんですか?
・人物Aはこの職業に満足していますか?
・人物Aは今の居場所に満足していますか?
・人物Aの望みは何ですか?
・人物Aの考え方は何か間違っていますか?
・この人物の性格的特徴Cはストーリー上プラスに働きますか?
・この人物の身体的特徴Cは本人にとってコンプレックスに感じていますか?

こういう感じの質問に答える形で、登場人物の設定を作り込んでいき、そこからその人物ならどのような結果を生み出そうとするのかなどを考え、それをシーンを作るヒントにしていきます。


■シーンを増やす

話を『桃太郎』に戻します。「桃太郎が鬼を退治する」シーンを「桃太郎が仲間と共に鬼を退治する」シーンへと少し変更を加えたいと思います。

そうなると、「桃太郎に仲間が出来る」シーンが原因シーンとなり、時間軸の逆方向に配置します。さらに「なぜ仲間は桃太郎に付き従うことになったのか?」を考えてみます。桃太郎と同じ理由でも構わないのですが、それだと物語として幅が広がらず、またそれならば別の人物として登場させる理由があまりなくなってしまいます。なので、「金品または物で買収された」ということにしておきましょう。

もちろん子供向け作品なので、生々しくならないように、特別な食べ物=きびだんごというアイテムを出すことにします。そうなると、さらに「桃太郎がきびだんごを入手する」シーンが原因として必要となり、さらに「人物Xがきびだんごを作る」シーンも数珠つなぎ的に必要となってきます。


■まとめ

ここまでで、ひとまず一から小説のストーリーを作り出す思考パターンを定義できました。あとはこれをプログラムに落とし込めば、無限にストーリーが生成できるはず……と言いたいところですが、現代のAI技術ではそれは極めて困難だったりします。

なぜかというと、原因と結果のつながりに矛盾がないかを判定するのが非常に難しいからです。そのあたりは、


このあたりを見てもらえると解りやすいかと思いますが、人間が常識だと考える情報をすべて記号的な式で表現する必要があるからです。しかし、たとえば「家来」とはどういう人間関係なのかを記号で記述することだけでもなかなか厄介です。仮に、

人物A 可能(命令する) 人物B(家来)
人物A 不可能(命令する) 人物B(主君)
人物A 可能(お願いする) 人物B(すべて)

こういう定義が出来たとしても、他にも褒美に関してや、家来同士の上下関係、家来の子供との関係、それだけでなく心理的な関係性まで含めていくと、きりがないからです。

ただし、世界観や社会構造、行動パターンなどを限定すれば、上記のようなスクリプト記述の量をある程度抑えて処理できるかもしれません。でもまあ、それで面白いストーリーが生成されるかは怪しいのですが。どちらかというと、物語自動生成よりもシムピープルのようなゲーム向けエンジンの方が向いているかもしれません。


↓補足書きました。


posted by 妹尾雄大 at 17:26| Comment(0) | 物語自動生成 | このブログの読者になる | 更新情報をチェックする