1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-11-21

■はじめに

先日、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ですが、最後までお読み頂きありがとうございました🐲🦴

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?