ライブの感想をプログラムに書かせて楽したい!(嘘です)
本記事は地下アイドルアドベントカレンダー2023の19本目の記事として執筆したものです。
みなさんは大型の対バンライブに行くとき、お目当て以外のグループのライブをどれくらい見ますか?
筆者はチケット代の元を取りたいのでライブを見るのが好きで、見聞は広いに越したことはないので、できるだけ頭から終わりまでライブを見て、かつ感想を最低ひとことずつ𝕏にポストするようにしています。
以下は9月18日に品川インターシティーホールで観た「DDD」の感想ツリーの例です。
このようにイベント単位でツリーを残しておくことで、後で別のライブで同じグループを見た時などに「前回はどこで見たんだっけ」「第一印象はこんなことを思ってたけど今日は〜〜だったな」「このメンバーさんは毎回パフォーマンスが良いな」のように感想に有機的なつながりを持たせることができて有益です。書いておかないとすぐ忘れるので。
でもこの感想を一つ一つ丁寧に書くのは結構大変です。そこで今回はプログラムの力を借りて楽してライブの感想を書きたい!というチャレンジをしてみます。
感想ポストのデータを集める
こんなこともあろうかと、感想ツリーのトップにするポストには必ず「本日」というワードを含めるようにしています。これにより、過去の感想や参加したイベントの記録を遡りたいときには、自分のポストを「本日」で検索すれば簡単に一覧で見ることができます。えらい。
少し前であればTwitter APIをどうにかこうにかするとこれを簡単に取得できたのですが、誰かさんのせいでTwitter(𝕏) APIが要重課金の富豪のおもちゃになってしまったので、今回は𝕏「データのアーカイブをダウンロードする」機能から入手したデータをなんやかんやしていきます。
「データのアーカイブをダウンロード」メニューからリクエストを送信すると24時間くらいで6GBくらいあるzipファイルが返ってきます。6GBもあるのは筆者がツイ廃だから
解凍したデータの中にある「tweet.js」というファイルに、リツイートを含む自分のアカウントの全ツイートのデータが入っているので、これを使います。というかこの辺まだtweetとかいう用語残ってるんですね。そういうとこやぞ。
このデータをPythonで書いたプログラムにいい感じになんやかんやしてもらいます。
プログラムがなんやかんやしてくれて見事テキストファイルに感想ツリーのポストの文章だけを抽出することができました。
ついでにポストの数も出してみました。
「本日」をつけたポスト: 119
感想ポスト数: 542
ときどきライブの感想じゃないポストに「本日」と書いていることもあるので多少ノイズが混じっていますが、2023年の1年間でざっくり119のライブイベントに対して感想を書き、そのポストの合計が542件ということになります(ツリートップの「本日」のポストは感想ポスト数の集計から除外しています)。
得られたテキストファイルには筆者の感想の書き方の癖が存分に含まれていますので、続いてはこれを使ってそれっぽい感想文を生成していきます。
マルコフ連鎖で感想を生成しよう
マルコフ連鎖という仕組みがあります。
例えば「推しメン」というワードが来たらその次には「かわいい」というワードが来る確率が高い気がしますね。でも「かっこいい」もあるかもしれません。「尊い」の時もあれば「レスくれた」とかもあるでしょう。
そういう風に「あるワードに続きそうなワードを、続きそうな確率に応じてつなげる」という処理を連鎖的に行うと文を作ることができます。
「ワードAにワードBが続く確率」はデータとして与える元の文章の癖によるので、この仕組みを使えば「与えた文章の雰囲気に似た文」が作れるわけです。
ということで、さっき得られた感想ポストのテキストデータをもとにまたPythonでいい感じになんやかんやします。
そしていざ、出力!!
NANIMONO水色の背の高いレベルをクリアしてるかもしれませんか?
かわいい曲が良くないのでカケラキックした🙌ド下手から見た気がするけど、
それを全面に出せる心の余裕が既にあるの知らなかったけどフロアの統率感・一体感があったからです!!!
Roadもなかったすごい
Onephony2で田島櫻子さんは凄いですねもえちゃんの笑顔見るとより身長のインパクトあった
左3~4席くらい誰もいない環境だとはまたベクトルの違った雰囲気になりますように、
ミが卒業するの好きな事を、私の想い以上に好き曲多めセトリ組みました
好きっぽい曲も比較的シティポップ/ダンスより路線の方の歌がブレないんだけど箱の問題かな
O-EAST本当にいちばん後ろまでぎっしり埋まってて優しくて好きだった
星島ゆいさんやっぱりかっこいい…!と感心してて楽しかったですね
一つ一つ最後の方だけチラ見アスター良い曲すぎる!!Overture出てきた水瀬さちさん🫶
っぽい!!!とても、っぽい!!!
あくまでもプログラムが「ぽい」でつなげているので日本語は崩壊していますが、かなり「自分っぽい」文章が生成できています。多分筆者の𝕏のフォロワーの方には「ぽさ」がわかってもらえるかと思います。
ということでここからはひたすら生成を繰り返し、なんとなくいい感じに感想っぽくなったものに対してツッコミを入れていきたいと思います。
(改行は読みやすいように筆者が追加しています)
なんキニ!
好きセトリで好き曲多めセトリ好きでした
Flashback回収嬉しー!な事務所イベントでした
ブーケトスおもろ
PRSMIN
並行物販から後半だけ、楽しかった!緑の子の歌が上手い
音程的な意味では白栖さんの人間的な意味では髪の1Aかな~
IWAS~も綺麗だ。も聴けたのでふだんあまり見られない真横とか真後ろからの全員で終盤畳み掛け、
みんな噛まない上にMCの自己紹介もあって好き。
サビのミの高笑い指差しお互いに指しあえて嬉しかった
完璧主義良い曲過ぎる、色んな人が多いなぁ
ラス2の曲が良すぎる
バチュン
人多すぎ盛り上がりすぎワンマンかと思った
Joint練習しときます……
夜宵やむさんのソロがあまりにも美しくて鳥肌
#2i2
最近鬼のような表情の豊かさがわかってきたな、ダンスが溌剌としていて本当にすごい
表情がお上手
つららさん歌良い…!
赤の子がかわいかった
かすみ草とステラ
最近月に最低1回は見てたように感じた、めちゃくちゃかっこいいですね
もえちゃんの歌い上げがすごかった
いろんな声出しオタクたちが頑張っててすごかった……
husky
1年ぶり!塩野さん歌声よすぎる~素敵です
曲の良さがとても良くて、素敵!
リンワン
undeadのアウトロの5人曲を覚えたの!?笑
脚つらないように~!
てことで彩りが違ってこちらはこちらでまた良いですね……
白栖さんのスマホ奪って自撮りしてそう
MADMEDiCiNE那月邪夢さんのファンの方かっこよかったです
スーパーベイビーズ
2回目
山田さんみたいなビジュしててかっこよかった
条件を与えてライブの感想を書かせてみる
今回の目的は観たライブの感想を書くことなので、完全に適当に書かせるのではなく、最低限使うワードの指定をして生成してみます。
筆者の主現場であるRingwanderungの最近のライブのうち、自分が実際には参加していない以下のライブを観た想定で感想を書かせます。
使用しているマルコフ連鎖のライブラリでは、開始ワードを指定することもできるのですが、データが少ないためかうまくいかなかったので、「大量に生成した中から指定ワードを含むものを抜き出して出力する」方針でいきます。
例えば指定ワード「歌声」で生成するとこんな感じ。
Ringwanderung陽凪ちゃんの強い歌声が活かされてみればだけど
以前よりももっとずっと楽しそうでよかったな~と思いました、
通ってる現場のalma、
良くも悪くももっと浮くかと思ったっていうのと同じようにduoでアイコンドールでしたね……
IIIIIIDIOMホワイトのジェームズりほさんと観ていたので今日はかわいい系!
もっと切ない気持ちになれていて、鹿目さんが最前のお客さんの最強の歌声も好き
なんキニ!好きセトリだった笑パンパンパンパンポケモンパン、パンパン!↑やっぱおもろい
ずずずの真中まなさんのダンスが良いらしい曲全く聴いたことあるけどライブハウスなら
今日くらいのダンスの感じや表情の表現力が存分にできそうな顔をしていたと自負する閻魔ちゃんの
転生ぜんぶライブ見てるなやっぱり歌声が活かされてたので個人的にできそうなので良いんですが
トクントクンは良い曲すぎる……
翡翠キセキ仲谷さんがエフェクターの相談とかを真緒さんの最強の歌声もかっこいいですよね
後攻バチュンドリンク交換してた気がするけど凄かった柏綾菜さんと西野愛望さんの歌声好きです
条件で設定したグループ名やセトリの曲名を使って生成した文章の中から、いい感じのものを一部削ったりつなげたりしてまとめてそれっぽくしたのが以下です。
Ringwanderung
陽凪ちゃん今日もソロがとてもかっこよくキマッてて良かったな~と思いました、
ナタリーさんまたこういう感じのよろしくお願いします
メロドラマの振付とフォーメーション本当にかわいい。超楽しかった、狂う見る度激しくなってるよね
てことで人生初の世界めっちゃよかった
柱の陰は誰もいないのでカケラキックしたパワーの共存する声良い、
ビジュとか表現のベクトルと幅の広さが底上げされます笑
すごい盛り上げ力!
ド楽曲派じゃないなぁと思いきや、追いパルスからの全員で終盤畳み掛け、
みんなスタイルいいから映えるな~と思った
それっぽい!!!(本当か?)
結論
感想は真面目に自分で書きましょう。
まとめ
ライブの感想を逐一グループごとに書くようにしているのは、もちろん自分用の記録というが一番なのですが、
「初見の知らないグループだったとしても、ライブ見ていいなって思うところがあったら書いて、エゴサで見つけたアイドルさん本人のモチベに少しでもなればいいな」
と思っているのもあります。よく知っている、通っているグループなら尚更そうです。
ここ最近大きめの解散や脱退のニュースが相次いでいる気がしますが、できるだけたくさんのアイドルさんにできるだけ長くアイドルを続けてほしいと思っているので。
ここまで読んでくれ賛同してくれた方は、ぜひ「良いと思ったことはネットなりなんなり見えるところに書く」を一緒に実践してくれると嬉しいです。
ついでに今回の記事よりもよっぽどもっと真面目に書いた感想の書き方も、未読であれば読んでみてください。
コード
Pythonのプログラミングに関しては本業(?)じゃないので粗や非効率な箇所があっても温かい目で見逃してください。もしくはコメントにてご指摘ください。
tweet.jsから「本日」を含む2023年のツイートとその下にあるリプライツリーを抽出し、テキストファイルに書き出すプログラム
※tweet.jsの冒頭にある、
window.YTD.tweets.part0 =
という部分を削除して.json形式に変換したものを入力データとして使用しています。
実際のコード
import json
with open('tweets.json') as file:
data=json.load(file)
todays=[]
trees={}
tweets={}
#対象tweetがRTではなく、「本日」というワードを含むかどうか判定する関数
def check_string_condition(input_string):
if input_string.startswith("RT"):
return False
if "本日" in input_string:
return True
return False
reply_list={}
counter=0
#全データを検索して、2023年に投稿された「本日」を含むtweetを抽出
#同時に、リプライツリーの対応関係をリスト化
for tweet in data:
tweet_full_text=tweet['tweet']['full_text']
id=tweet['tweet']['id']
date=tweet['tweet']['created_at']
if('in_reply_to_status_id' in tweet['tweet']):
replyto=tweet['tweet']['in_reply_to_status_id']
else:
replyto=""
reply_list[id]=replyto
tweets[id]=tweet_full_text
if(check_string_condition(tweet_full_text) and date.endswith('2023')):
trees[id]=[]
todays.append({"id":id,"text":tweet_full_text})
counter+=1
print("「本日」をつけたポスト:",counter)
id_list = [today.get('id') for today in todays]
#辞書配列の値からキーを取得する関数
def get_keys_from_value(d, val):
return [k for k, v in d.items() if v == val]
#全ての「本日」ツイートににぶら下がっているリプライツリーを一番下まで辿ってリスト化
for root_id in id_list:
target_id=root_id
inSearch=True
while inSearch:
if(target_id in reply_list.values()):
keys = get_keys_from_value(reply_list, target_id)
trees[root_id].append(keys[0])
target_id=keys[0]
else:
inSearch=False
output = open('./output.txt', 'w', encoding='utf-8_sig')
import re
#画像や引用のurlは邪魔なので除外処理
def remove_urls(text):
url_pattern = re.compile(r'https?://\S+|www\.\S+')
without_urls = re.sub(url_pattern, '', text)
return without_urls
#全てのリプライツリーを辿って、テキストファイルに書き込み
counter=0
for root in trees:
for branch in trees[root]:
tmp=remove_urls(tweets[branch])
output.write(tmp.replace('\n',''))
output.write('\n')
counter+=1
output.write('\n')
print("感想ポスト数:",counter)
output.close()
マルコフ連鎖で文章を生成するプログラム
import markovify
import MeCab
text_file = open("output.txt", "r")
text = text_file.read()
mecab = MeCab.Tagger('-Owakati')
#テキストファイルを成形
output = open('./input.txt', 'w', encoding='utf-8')
for line in text.split('\n'):
splittedLine = ' '.join(mecab.parse(line).split())
output.write(splittedLine)
output.write('\n')
output.close()
#モデルを作成
input = open('./input.txt', 'r', encoding='utf-8')
input_text=input.read()
text_model = markovify.NewlineText(input_text,state_size=2)
#文を生成
for i in range(1000):
#1000回試行
sentence = text_model.make_short_sentence(300, tries=100).replace(' ', '')
if("歌声" in sentence):
#指定ワードを含むものを抜き出して出力
print(sentence)
print('\n')
input.close()
参考記事
この記事が気に入ったらサポートをしてみませんか?