■はじめに
先日、The BONEZ - Straight Up feat. Kj / THE FIRST TAKEがあまりにもよかったので、こちらの記事を書いた🦴
そして昨晩、逆バージョンのDragon Ash - Straight Up feat. JESSE / THE FIRST TAKEもリリースされ、やはりサイコーだったので、こちらも無理やりQiitaのネタにすることにした。
Kjの歌詞アレンジが激アツ🐲
「♪混ぜるな危険 悟空とベジータ」の「ベジータ」のとこで「オレ🙋♂️」ってやってるJESSEがかわいい。
■やること
スクレイピング、randamモジュール、pykakasi等を活用して、Dragon Ashのバイブスの短歌を生成する。
手順としては
・スクレイピングでDragon Ash全曲の歌詞を抽出
・歌詞の文章を、短歌のパーツとして使える形に分解
・ランダムに短歌を生成する関数を用意
・詠む
のイメージです。
■実装
①準備
import requests
from bs4 import BeautifulSoup
import pandas as pd
import pykakasi
import re
import random
②DAの歌詞をスクレイピング
# DAのページURL
url = 'https://www.uta-net.com/artist/257/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 曲のリンクを格納するリスト
song_links = []
# すべての曲のリンクを取得
for link in soup.find_all('a'):
href = link.get('href')
if href and '/song/' in href: # 曲へのリンクを確認
full_link = f'https://www.uta-net.com{href}'
song_links.append(full_link)
lyrics_data = []
# すでに定義されているsong_linksリストを使用
for song_link in song_links:
song_response = requests.get(song_link)
song_soup = BeautifulSoup(song_response.text, 'html.parser')
# 曲のタイトルと歌詞を取得
title = song_soup.find('title').text
lyrics = song_soup.find('div', id='kashi_area').text.strip() # .strip()で前後の不要な空白を削除
# 曲のタイトルと歌詞をリストに追加
lyrics_data.append({
'title': title,
'lyrics': lyrics
})
③短歌関数を作ろう
# pykakasiの初期化
kakasi = pykakasi.kakasi()
kakasi.setMode('J', 'H') # 日本語をひらがなに変換
conv = kakasi.getConverter()
# 歌詞から短歌を作成する関数
def create_tanka(lyrics):
# 歌詞を文節に分割(日本語のみ対象)
phrases = re.findall(r'[ぁ-んァ-ン一-龥]+', lyrics)
# 各文節のよみがなの長さを計算
phrase_lengths = [(phrase, len(conv.do(phrase).replace(' ', ''))) for phrase in phrases]
# 長さが5または7の文節を抽出
phrases_5 = [phrase for phrase, length in phrase_lengths if length == 5]
phrases_7 = [phrase for phrase, length in phrase_lengths if length == 7]
# 短歌を作成(ランダムに抽出)
if len(phrases_5) >= 2 and len(phrases_7) >= 3:
random.shuffle(phrases_5)
random.shuffle(phrases_7)
tanka = phrases_5[0] + ' ' + phrases_7[0] + ' ' + phrases_5[1] + ' ' + phrases_7[1] + ' ' + phrases_7[2]
return tanka
else:
return None
④詠むぞ詠むぞ
# 短歌を格納するリスト
tankas = []
# 各歌詞から短歌を作成
for data in lyrics_data:
tanka = create_tanka(data['lyrics'])
if tanka:
tankas.append(tanka)
# 短歌のリストを表示
for tanka in tankas:
print(tanka)
■どうだ!
生成されたのはこちら!
・ してぇなら 気分は毎度 着こなして 遠くてもほら ぼやけてもほら
・ 鮮やかな とばしてみせる とりどりな いくぜ音楽 常に前進
・ 奮わして 自分の価値と 枯れ朽ちた 痛い苦悩の 洗い流した
・ のじゃねえ 闘志を灯し 降り注げ とアライアンス ドもう伝統
・ 連なって 我物顔で 自販のコ 携帯とシガ 俺らあくまで
・ 叩き出す グランド飛ばす 暗がりを 光あるステ つねに連動
・ 目を覚ませ そう止めないで 目を覚ませ 我が誇らしき そう止めないで
・ 半端なく 朝焼けにほら 半端なく 上げかん高く 語らえばほら
・ 全て込め どデカくそうさ 過去なんざ どう描くのシ 虚勢張って
・ 夢ならば 受け入れた耳 友との輪 我が誇らしき そう止めないで
・ しなリスナ 援交かカス 巻き起こす 嘘臭ぇし さらにテリトリ
・ もらったぜ 響け向こうに とんでもね 明日の方に いざ出陣
・ 急かすそう 手叩き渡れ 急かすそう 鼓動明日ヘ 湯立つ先は
・ さあ共に さあ奏でよう な寝覚め 一人一人の 一人一人の
・ 待ち受ける 底抜けるまで 瞬かせ そうそれぞれの 瞬かせよう
・ 友との輪 点取り返す 夢ならば 一晩中 混ぜんな危険
・ カチ込みな 咲かす大輪 飛び乗りな 今高く上げ とりどりな増す
・ を夕凪 帆を晒しさあ 消す帳 窓辺に百合を あやふやに擦れ
・ 一つだけ 毎日の日 刺激的 満たしたらそう 東からそう
・ 響かせた 今高く上げ 飛び乗りな 咲かす大輪 とりどりな増す
・ ねぇリリィ 水を注ぐよ ねぇリリィ 水を注ぐよ 咲き誇れそう
・ 消す帳 あやふやに擦れ 塗りつぶす 運べ水色 窓辺に百合を
・ もらったぜ 押し寄せるパワ サヨナラね 明日の方に な事気にせず
・ 即乗らす 流れ出た船 今一度 雨雲破り 突き立て扉
・ まずはさぁ もう泣かないで 舵をとれ 揺れっぱなしの すれっからしの
・ エンドレス 提尋ねない は解けない 週も見たな 週も見たな
・ プして今 トキメク旅に プして今 味わいながら キラメク時を
シュールな短歌が量産されて大笑いした。
結構、日本語としての区切り位置がいまいちなものが多い。pykakasiではなくMecabやjanomeを使ったらもっといい感じにできるのだろうか。
なお、筆者のお気に入りは
「鮮やかな とばしてみせる とりどりな いくぜ音楽 常に前進」
「一つだけ 毎日の日 刺激的 満たしたらそう 東からそう」
「まずはさぁ もう泣かないで 舵をとれ 揺れっぱなしの すれっからしの」
の3つです。
◼おまけ
私のお気に入りの短歌のイメージでアスキーアートを描いてとchatGPT4oにお願いした結果。
短歌1: 鮮やかな とばしてみせる とりどりな いくぜ音楽 常に前進
♪ ♪ ~~~~~~
(•ө•) ~ Music ~
<( )> ♪ Vibrant ~
^^ ^^ Birds ♪
~~~~~~~~~~ ♪ ♪
短歌2: 一つだけ 毎日の日 刺激的 満たしたらそう 東からそう
|\
/ \ 🌅
/ \ Rising sun
/_ _\ City below
| | A new day
~~~~~~~~
短歌3: まずはさぁ もう泣かないで 舵をとれ 揺れっぱなしの すれっからしの
~~~~~~~
~ o o ~ 🌊
| | Steer
__|___|__ the ship
/ \ Through
/ \ waves
それぞれ短歌のイメージをアスキーアートにしてみました!追加のリクエストがあれば教えてください。
■感想
生成AIがそこそこ嘘をつくとはいえ色んなことをやってくれる時代に、私はpykakasiで何をやってるんだろう。はやくMecabを使えるようになりたい。
本当に私自身にもよく分からない謎Qiitaですが、最後までお読み頂きありがとうございました🐲🦴