表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
Pythonに「なろう系タイトルジェネレータ」を移植し、さらにいろんなツールを開発してみる物語  作者: 超プリン体
第一章 なろう系タイトルジェネレータを移植する
10/20

第十話 確率を設定しやすく変更して確率をいじってみる ~3分間で倒せないセクシーレイヴの惑星のモンスター

 みなさんこんにちは。なろう系タイトルジェネレータ開発の第十話です。


 第九話では、さぼって入れてなかったすべてのキーワードを入れて、文法を考慮してのタイトル生成に再チャレンジしてみたものの、あまりピンとくるタイトルが得られないという、残念な結果に終わりましたね。


 そこで今回は、文法を簡単に調整できるように、コードを手直しして、その上で、文法のルールを少し緩和してあげることにします。またそれに加えて、生成したタイトルを、自動でファイルに出力する機能、ボタンを押した時にだけファイルに出力する機能、クリップボートにコピーする機能、などを追加してみました。


 コードはあとでご覧いただくとして、まずいつものように、10回自動生成させてみた結果を、ご覧いただきますね。


ハムスターで満員電車ユートピア

生まれ変わったら培養なので大好きだから焼かれるもえるパネルと浴びて

忘れた頃に晒すだからね!強くワイパーと走れ甘いツンデレからイケメン

サウンドでキングでレイジ守って

王女様にハッピーエンドとスピリチュアルだったらチャネラーと強く生産

君にして大地のリベンジだったらサイレントジャックと黒い機械

土星のポーズで死亡

こじらせたがオークにラプラスなので光る初めての冷たい聖杯に性的に戦う

霊感小さく輝いて流れ星

好き晒すコンピュータなので性的にあがなう


う、うーーーん……(笑)。ちょっと微妙ですけど、まあ、少し改善されたということにしておきましょう(笑)。


なお上のリストは、今回追加したファイルへの出力機能で、下の図のように出力させたテキストを、コピペしたものです。結構便利になりました。


挿絵(By みてみん)


色々変更したので、実行画面もだいぶ変わっています。


挿絵(By みてみん)


「生成したタイトルを自動で……」にチェックしておくと、実行フォルダにテキストファイルを自動作成して、そこに生成したタイトルを、どんどん追加していきます。


「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()という関数で、次にどの品詞をセレクトするかを決定します。そのセレクトの確率は、引数で与えるのですが、この確率を、前回までから若干緩和しています。これによって、前回のコードよりは、自由なタイトルが作られるようになっている、はずです(汗。


 といった所で、今回はここまでとなります。やりたかったことはだいぶ実現できたので、今後は何かご質問とか、ご要望などがあった場合の更新とさせていただく予定です。よかったらお気軽にご連絡ください。


 それではまたいつかお会いしましょう、ご覧いただきありがとうございました。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ