第二章 第四話 試作機を改良してみる
みなさんこんにちはプリンです。なろう系あらすじジェネレータの章の、第四話です。
第三話では、「御託はいらない! 動けばいい!」、という方針で、最終的に必要となるメモリ構造を、強引に人手で作成し、それを使って最終的にちゃんと動くのかの検証を行いました。
第四話ではさらにそれを、より複雑なあらすじを生成できるものに、改造してみました。下の画像が、synopsis_baseと、データ構造のツリーをいじった結果です。
実行した結果が、下の画像になります。前回より少しだけですが、バラエティーに富んだものになっているのが、おわかりいただけるでしょうか。
どうやったかというと、「誰」というのを、形容部分と本体部分に分離して、その組み合わせで「誰」を作れるようにしたんです。同様に「どこ」というのも、形容部分と本体部分に分離して、組み合わせで「どこ」を作れるようにしてあります。
「いつ」というのも、形容部分と本体部分に分離しようとしてるんですけど、「いつ」を形容しているサンプルが、今回は見つからなかったので、未使用になっています。
次に、前回やった、synopsis_baseをいじって、より複雑なあらすじを生成させてみるというのを、今回もやってみます。そのために行った修正は、下の画像の部分です。
結果は、下の画像のようになりました。結構複雑なあらすじも、作れるようになっています。内容的に、似たりよったりなものになっているのは、使ったサンプルが、私の書いた5つの小説だけなので、しょうがないですね(汗。私以外の人が作った小説もサンプルとして取り込んでいけば、結構面白いあらすじが、自動生成できるんじゃないでしょうか。
今回はここまでです。今回作ったプログラムは、このあと添付します。結構ややこしいプログラムになっています。ご質問などありましたら感想欄でご質問いただければご説明いたします。
なお次回は、①データを充実させる、②データの加工を簡単に出来るようにする、の2つのアプローチがありますが、どっちにするか決めかねています。また、③自動生成したあらすじを、AIに判定させてみる、というのも面白そうですが、残念ながら私はAIはまだ勉強不足でよくわかりません(汗。③はあまり期待せず、気長にお待ちください。
では次回またお会いしましょう。
(今回作ったプログラム、ここから)
# -*- coding: utf-8 -*-
import random
#synopsis_base = "%いつTOP% %誰TOP%が %どこTOP%で %どうするTOP%"
synopsis_base = "%いつTOP% %誰TOP%が %誰TOP%とともに %どこTOP%で %どうするsubTOP% しかし、%どうするTOP%"
s_def=["%いつTOP%","%誰TOP%","%どこTOP%","%どうするsubTOP%","%どうするTOP%",
"%いつ形容%","%いつ%",
"%誰形容%","%誰%",
"%どこ形容%","%どこ%",
"%どうするsub%",
"%どうする%"]
s_start=[0,1,2,3,4,
5,6, #"%いつ形容%%いつ%"
9,16, #"%誰形容%%誰%"
24,26, #"%どこ形容%%どこ%"
32, #"%どうするsub%"
35 #"%どうする%"
]
s_num=[1,1,1,1,1,
1,3, #"%いつ形容%%いつ%"
7,8, #"%誰形容%%誰%"
2,6, #"%どこ形容%%どこ%"
3, #"%どうするsub%"
6 #"%どうする%"
]
s_str=[
"%いつ形容%%いつ%","%誰形容%%誰%","%どこ形容%%どこ%","%どうするsub%","%どうする%", #TOP(0,1,2,3,4)
"", #いつ形容(5)
"とある時代","時は未来","時は現代", #いつ(6,7,8)
"","かわいい", "マスターである", "トラブルを起こした", "機械の大群に殺された" , "引っ込み思案の", "幽霊としてよみがえった",#誰形容(9,10,11,12,13,14,15)
"ベレー帽の少女","社長","猫耳少女","男性","ニート主人公","主人公","少女","天才小説家", #誰(16,17,18,19,20,21,22,23)
"","格差が問題となった", #どこ形容(24,25)
"異世界","ゲーム内仮想世界","リアル世界","地球","過去世界","都会のある町", #どこ(26,27,28,29,30,31)
"牢獄に閉じ込められる","何らかのトラブルによって過去に飛ばされる","霊体となる",
#どうするsub(32,33,34)
"ギルドの問題を解決する","商人となってお店を開く","ラスボスを倒す","機械を乗っ取る","人類を勝利に導く","作家デビューを目指して頑張る"
#どうする(35,36,37,38,39,40)
]
for n in range(10):
c=0
syno = synopsis_base
for s in s_def:
flag_end=-1
while flag_end==-1:
if syno.find(s_def[c])!=-1:
rep_target= s_str[random.randint(s_start[c],s_start[c]+s_num[c]-1)]
syno=syno.replace(s_def[c],rep_target,1)
else:
flag_end=0
c=c+1
print(syno)




