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) | 物語自動生成 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください