アイマスPなのでプログラムで最上静香を喋らせる

f:id:runaru_dearly1641:20180428012033j:plain

(マルコフ連鎖)あーそーゆーことね完全に理解した

はじめに

ミリ5thまさかのweb先行が当たってしまった…

もう行けないイベントのつもりでいた上に、当たったのが静香がいる2日目じゃなく初日だから本命日に参加できないのに東京まで交通費かけて行く必要があると考えると、嬉しいんだけど素直に手を上げて喜べない…

本題

経緯

これまでTwitterAPIでオタクブロックや懸賞漁りをしてきたのですが、ただ検索結果をちょっと見て処理するだけだから大した面白味もないし、他にAPI使った面白いことも思いつかない、ということで

h1dia.hateblo.jp

前々から興味のあったこの記事の内容に挑戦しようと思った次第です。

上記事の雰囲気から、台詞さえ集めることができればどんなキャラクターでも同じことができると感じたので、最上静香というキャラで同じことをやってみようとおもいます。

台詞集め

最上静香はアイドルマスターミリオンライブというソシャゲのキャラなので、ミリオンライブのwikiからテキストを集めます。ソシャゲはテキストの入手難易度が低めで良いですね。

最上静香 - ミリオンライブWiki

このページだけでは足りないかなと考えて、カードの台詞や一部チョコイべの台詞も少し加えたものがこんな感じ。全部で400行くらいになるまで集めました。

f:id:runaru_dearly1641:20180422230749p:plain

これで下準備完了です。

台詞生成プログラムを動かす

テキスト集めが終わったので、とうとう本番の台詞生成と洒落込みます!

初めに紹介したブログにプログラムのソースコードが載っているので、それをそのまま動かすだけです!


...と言いたいところですが、pythonしかわからない私にこのコードは読めません。

そこで[マルコフ連鎖 文章生成 python]、でググって見たところ、このサイトにうまくいきそうなソースコードが載っていました。

[Python]マルコフ連鎖で自動文章 | IT屋シミダイの頭の中

これならpythonで書いてあるのでそのまま動かせます!早速実行

実行結果

…え?点数をよく見ろ?わぁ…美也さんは、今日できることを子供扱いせずに真剣にやって、歌えるってことは、不安になった時に、見たままのものじゃないですか?もう、ふざけないでください!…個性的なメンバーだな、なにしてるんですよ? もっと近くに新しいおうどん屋さんが入るとチームに貢献できたみたい。時間は、アイドルなんですか?へえ…お仕事やレッスンの予定を確認するのに、便利そうですか?ええ、私のこと、信じて下さい!なんでアイドルが合戦なんですね!みんなの様子を見られたら、出発しましょうね…。私、頑張ります!プロデューサー…私、型通りに動くことにばかり気を遣ってくれませんでした…。私のことは、久しぶりにっ!前回と同じでちょっとなつかしいですね。それって、プロデューサー…? これからもずっと一緒に歌ってください。「私には、え…?ふきこぼれてるわよ、うどん!じゃあ、私の誕生日は、仲間ですから。今日のうちに、どうぞ!…み、みんなで力を合わせたから…嬉しいです。アイドルしながらでもありますから…!サッカーの基本的なメンバーだな、なんですか。美也さん、詳しいですね!脱走が成功したんですから…!
  (中略)  
昨日のお昼はきつねにします!…プロデューサー。あの、実は…。私、すごく厳しいことをしても平気なので…私も…よろしくお願いします。…仕事もやりきったような顔してくれるまで誰も帰しません!』…って。…やっぱり私がなんとかしてあげます。うどんにはレッスンの予定を確認するのに、どうしたみたいで…。かわいい私物をチェックします。うどんにしようと?プロとして全力を出し切りました。プロデューサーがそばにいたら、みんな驚いてくれたら、そのリアクションは!?…!私は大丈夫です。校門前の


なんやコレ一体…

中略してありますが、実際にはルイズコピペが霞んで見えるほどの長文が生まれてきました…その理由を知るためにはプログラムのコードと向き合うしかなさそうです…メンドクサイ…

君もプログラムと向き合う時なんだ

作成部分のコードに注目してみます。

    # 文章の自動作成
    count = 0
    sentence = ""
    w1, w2  = random.choice(list(markov.keys()))
    while count < len(wordlist):
        tmp = random.choice(markov[(w1, w2)])
        sentence += tmp
        w1, w2 = w2, tmp
        count += 1

wordlistは配列で、下準備で集めた台詞全部を単語ごとに区切ったその各単語が要素になっています。なんでlen(wordlist)は総単語数で、1づつ増やされていくcountがそれを超えるまでループされます。

つまり、whileは総単語数分実行されることになります。


実行で作成されたヴェノミナーガのテキストのような長文は、総単語数が膨大で、その膨大な総単語数の数だけ単語をを繋げて文章を作るように設定されていたせいで生まれてきたわけです。

len(wordlist)を10とか50とかに変えれば程よい台詞を作ってくれるハズです。

おわり

プログラムを読んでマルコフ連鎖とやらの仕組みをなんとなく把握したので気が向いたら続きを書く

文章の終わりが「校門の」と文としては不自然、その辺りの"文の自然さ"を少しでもマシになるように色々試したので気が向いたら続き書く