スクレイピングとpykakasiとDragon Ashの歌詞で遊んでみた

# ■はじめに
先日、The BONEZ - Straight Up feat. Kj / THE FIRST TAKEがあまりにもよかったので、こちらの記事を書いた🦴

https://qiita.com/bashildon3843/items/2a20c2b7c9e3fe1f6284

そして昨晩、逆バージョンのDragon Ash - Straight Up feat. JESSE / THE FIRST TAKEもリリースされ、やはりサイコーだったので、こちらも無理やりQiitaのネタにすることにした。

https://open.spotify.com/track/27I0orFxmUBZb0Hcw1i7sk?si=FdfdUJtCTcyaP70PwSrHgw&context=spotify%3Aartist%3A2wDlv5Qp9pffOqnO4vdn8L

https://www.youtube.com/watch?v=qfmkYU8x8dA

Kjの歌詞アレンジがアツい。

「♪混ぜるな危険　悟空とベジータ」の「ベジータ」のとこで「オレ🙋‍♂️」ってやってるJESSEがかわいい。


# ■やること

スクレイピング、randamモジュール、pykakasi等を活用して、Dragon Ashのバイブスの短歌を生成する。

手順としては
・スクレイピングでDragon Ash全曲の歌詞を抽出
・歌詞の文章を、短歌のパーツとして使える形に分解
・ランダムに短歌を生成する関数を用意
・詠む
のイメージです。

# ■実装
## ①準備
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import pykakasi
import re
import random
```
## ②DAの歌詞をスクレイピング
```python
# 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
    })
```

## ③短歌関数を作ろう
```python
# 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
```
## ④詠むぞ詠むぞ
```python
# 短歌を格納するリスト
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にお願いした結果。

```python
短歌1: 鮮やかな とばしてみせる とりどりな いくぜ音楽 常に前進

   ♪ ♪      ~~~~~~
  (•ө•)   ~ Music ~
 <(   )>  ♪ Vibrant ~
  ^^ ^^     Birds   ♪
 ~~~~~~~~~~   ♪ ♪

短歌2: 一つだけ 毎日の日 刺激的 満たしたらそう 東からそう

     |\
    /  \     🌅
   /    \    Rising sun
  /_    _\   City below
     | |     A new day
  ~~~~~~~~

短歌3: まずはさぁ もう泣かないで 舵をとれ 揺れっぱなしの すれっからしの

   ~~~~~~~
   ~ o o ~   🌊
    |   |    Steer
  __|___|__  the ship
     / \     Through
    /   \    waves

それぞれ短歌のイメージをアスキーアートにしてみました！追加のリクエストがあれば教えてください。
```

# ■感想
生成AIがそこそこ嘘をつくとはいえ色んなことをやってくれる時代に、私はpykakasiで何をやってるんだろう。はやくMecabを使えるようになりたい。

本当に私自身にもよく分からない謎Qiitaですが、最後までお読み頂きありがとうございました🐲🦴