第十話 確率を設定しやすく変更して確率をいじってみる ~3分間で倒せないセクシーレイヴの惑星のモンスター
みなさんこんにちは。なろう系タイトルジェネレータ開発の第十話です。
第九話では、さぼって入れてなかったすべてのキーワードを入れて、文法を考慮してのタイトル生成に再チャレンジしてみたものの、あまりピンとくるタイトルが得られないという、残念な結果に終わりましたね。
そこで今回は、文法を簡単に調整できるように、コードを手直しして、その上で、文法のルールを少し緩和してあげることにします。またそれに加えて、生成したタイトルを、自動でファイルに出力する機能、ボタンを押した時にだけファイルに出力する機能、クリップボートにコピーする機能、などを追加してみました。
コードはあとでご覧いただくとして、まずいつものように、10回自動生成させてみた結果を、ご覧いただきますね。
ハムスターで満員電車ユートピア
生まれ変わったら培養なので大好きだから焼かれるもえるパネルと浴びて
忘れた頃に晒すだからね!強くワイパーと走れ甘いツンデレからイケメン
サウンドでキングでレイジ守って
王女様にハッピーエンドとスピリチュアルだったらチャネラーと強く生産
君にして大地のリベンジだったらサイレントジャックと黒い機械
土星のポーズで死亡
こじらせたがオークにラプラスなので光る初めての冷たい聖杯に性的に戦う
霊感小さく輝いて流れ星
好き晒すコンピュータなので性的にあがなう
う、うーーーん……(笑)。ちょっと微妙ですけど、まあ、少し改善されたということにしておきましょう(笑)。
なお上のリストは、今回追加したファイルへの出力機能で、下の図のように出力させたテキストを、コピペしたものです。結構便利になりました。
色々変更したので、実行画面もだいぶ変わっています。
「生成したタイトルを自動で……」にチェックしておくと、実行フォルダにテキストファイルを自動作成して、そこに生成したタイトルを、どんどん追加していきます。
「narou_title_generator_out.txtに出力」というボタンを押すと、ファイルに手動でタイトルを追加することが出来ます。
「クリップボードにコピー」ボタンを押すと、Windows OSのクリップボードにタイトルがコピーされます。ですがこの機能を使うには、Pythonの環境にpyperclipという、コンポーネントをインストールしておく必要があります。
ソースコードはこちらになります。
(ここから)
# -*- coding: utf-8 -*-
import tkinter
import random
import pyperclip as pc
title_str = ""
n_depth = 0
depth_max = 0
outfile="narou_title_generator_out.txt"
use_encode='utf-8' #shift-jis or utf-8
def read_word_list(filename):
read_data=[]
list_return=[]
with open(filename,mode="rt",encoding=use_encode) as f:
read_data = list(f)
for i in read_data:
list_return.append(i.replace('\n',''))
return list_return
list_word_top=[]
list_word_top = read_word_list("word_list_top.txt")
list_word_meisi=[]
list_word_meisi = read_word_list("word_list_meisi.txt")
list_word_keiyou=[]
list_word_keiyou = read_word_list("word_list_keiyou.txt")
list_word_jyosi=[]
list_word_jyosi = read_word_list("word_list_jyosi.txt")
list_word_dousi=[]
list_word_dousi = read_word_list("word_list_dousi.txt")
list_word_keidou =[]
list_word_keidou = read_word_list("word_list_keidou.txt")
list_word_bottom =[]
list_word_bottom = read_word_list("word_list_bottom.txt")
#ウインドウ設定
tk=tkinter.Tk()
tk.title(u"なろう系タイトルジェネレータ")
tk.minsize(640,240)
#ウインドウ表示
win=tkinter.Canvas(bg="black",width=640,height=240)
win.place(x=0,y=0)
btn_quit = tkinter.Button(tk, text='終了')
btn_quit.place(x=130, y=80)
btn_create = tkinter.Button(tk, text='自動作成')
btn_create.place(x=50, y=80)
bln = tkinter.BooleanVar()
bln.set(True)
cb_append2file_auto = tkinter.Checkbutton(tk, variable=bln, text="生成したタイトルを自動でファイル("+outfile+")に保存する")
cb_append2file_auto.place(x=80,y=120)
btn_append2file = tkinter.Button(text=outfile+"に出力")
btn_append2file.place(x=50, y=160)
btn_clipboard = tkinter.Button(tk, text='クリップボードにコピー')
btn_clipboard.place(x=50, y=200)
txt_title=tkinter.Label(text=u"ここにランダムで作成したタイトルが表示されます。")
txt_title.place(x=0,y=0)
def select_keyword(keyword_list):
n=len(keyword_list)
return keyword_list[random.randint(1,n)-1]
def select_hinsi(v_top,v_keiyou,v_meisi,v_keidou,v_dousi,v_jyosi,v_bottom):
v_sum=v_top + v_keiyou + v_meisi + v_keidou + v_dousi + v_jyosi + v_bottom
p_top=v_top/v_sum
p_keiyou=v_keiyou/v_sum
p_meisi=v_meisi/v_sum
p_keidou=v_keidou/v_sum
p_dousi=v_dousi/v_sum
p_jyosi=v_jyosi/v_sum
# p_bottom=v_bottom/v_sum
p=random.random()
if(p<p_top):
gene_top()
elif(p<(p_top+p_keiyou)):
gene_keiyou()
elif(p<(p_top+p_keiyou+p_meisi)):
gene_meisi()
elif(p<(p_top+p_keiyou+p_meisi+p_keidou)):
gene_keidou()
elif(p<(p_top+p_keiyou+p_meisi+p_keidou+p_dousi)):
gene_dousi()
elif(p<(p_top+p_keiyou+p_meisi+p_keidou+p_dousi+p_jyosi)):
gene_jyosi()
else:
gene_bottom()
def make_title_start():
global title_str
global n_depth
global depth_max
title_str = ""
n_depth=0
depth_max = random.randint(2,5)
select_hinsi(3,30,47,20,0.5,1.0,1.0) #top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_top():
global title_str
title_str=title_str+select_keyword(list_word_top)
select_hinsi(0,40,30,30,1.0,1.0,1.0)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_meisi():
global title_str
global n_depth
global depth_max
title_str=title_str+select_keyword(list_word_meisi)
n_depth=n_depth+1
if(n_depth<depth_max):
select_hinsi(0,1.0,2,6,4,87,1)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_keiyou():
global title_str
title_str=title_str+select_keyword(list_word_keiyou)
select_hinsi(0,30,100,1.0,1.0,1.0,1.0)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_jyosi():
global title_str
title_str=title_str+select_keyword(list_word_jyosi)
select_hinsi(0,30,30,40,30,1.0,1.0)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_dousi():
global title_str
global n_depth
global depth_max
title_str=title_str+select_keyword(list_word_dousi)
n_depth=n_depth+1
if(n_depth<depth_max):
select_hinsi(0,45,45,1.0,1.0,1.0,10)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_keidou():
global title_str
global n_depth
global depth_max
title_str=title_str+select_keyword(list_word_keidou)
select_hinsi(0,0.5,1.0,1.0,100,1.0,1.0)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def gene_bottom():
global title_str
global n_depth
global depth_max
title_str=title_str+select_keyword(list_word_bottom)
n_depth=n_depth+1
if(n_depth<depth_max):
if(random.random()<0.2):
select_hinsi(3,20,27,1.0,1.0,1.0,0)#top,keiyou,meisi,keidou,dousi,jyosi,bottom
def display_title():
make_title_start()
txt_title["text"]=title_str
print(title_str)
if(bln.get()):
append2file()
btn_create["command"]=display_title
def destroy_tk():
tk.destroy()
btn_quit["command"]=destroy_tk
def copy2clipboard():
global title_str
pc.copy(title_str)
btn_clipboard["command"]=copy2clipboard
def append2file():
global title_str
with open(outfile, 'a') as f:
print(title_str, file=f)
btn_append2file["command"]=append2file
tk.mainloop()
(ここまで)
詳しい説明は省きますが、select_hinsi()という関数で、次にどの品詞をセレクトするかを決定します。そのセレクトの確率は、引数で与えるのですが、この確率を、前回までから若干緩和しています。これによって、前回のコードよりは、自由なタイトルが作られるようになっている、はずです(汗。
といった所で、今回はここまでとなります。やりたかったことはだいぶ実現できたので、今後は何かご質問とか、ご要望などがあった場合の更新とさせていただく予定です。よかったらお気軽にご連絡ください。
それではまたいつかお会いしましょう、ご覧いただきありがとうございました。




