LoginSignup
3
2

More than 1 year has passed since last update.

【いよいよ作詞】Pythonで歌詞を集めて軽く分析してみた話#3

Posted at

前回
https://qiita.com/kuroge/items/e4b2e08108d9ffbb254b

前回より変わったこと

プログラムを微妙に変えました。

変更後(コード汚くてすみません)
import requests
from bs4 import BeautifulSoup
import sentencepiece as spm
import os

dic = "2000-2010"
net = range(43000,43000 + 23000)

for i in net:
    kasi = ""
    memory = ""
    load_url = f"https://www.uta-net.com/song/{i}/"
    html = requests.get(load_url)
    soup = BeautifulSoup(html.content ,"html.parser")
    for element in soup.find_all(id="kashi_area"):
        memory = element.text
    kasi += memory
    path = f"{dic}/歌詞{str(i)}.txt"
    if not(os.path.isfile(f"{dic}/{path}")):
        with open(path,"w",encoding="utf-8")as file:
            file.write(str(kasi))
    print(i)

count = {}
for a in net:
    path = f"{dic}/歌詞{str(a)}.txt"
    if os.path.isfile(path):
        with open(path, "r", encoding="utf-8")as readfile:
            kasi = readfile.read()
        if not(kasi == "[]" or kasi == None or kasi == ""):
            TEXT = kasi
            # 学習済みモデルの読み込み
            sp = spm.SentencePieceProcessor()
            sp.load('trained_model.model')
            # 分割した結果を表示
            result = sp.EncodeAsPieces(TEXT)
            #result = "".join(result)
            print(result)
            for c in result:
                if c in count:
                    count[c] = count[c] + 1
                else:
                    count[c] = 1
    print(a)

new_count = {}
jogen = 1000
for d in count:
    if count[d] <= jogen or str(d).isascii() or len(str(d)) <= 2:
        pass
    else:
        new_count[d] = count[d]

new_count = sorted(new_count.items(), key=lambda x:x[1])
print(new_count)

new_count = str(new_count).replace("('","").replace("',",":").replace(",","\n").replace(")","").replace("["," ").replace("]","")

with open(f"{dic}/結果 {dic}.txt","w",encoding="utf-8")as file:
    file.write(new_count)

変更点
1 歌詞のtxtデータをフォルダー分けした
2 同じ数値が出る場合は変数に格納
あと色々追加されたので、見ていってね

作詞をしてみた

作詞手順
1 歌詞データを一つのtxtデータに集める
2 それをAIに学習させる
3 AIに歌詞をある程度出させる
4 最後は人の目で不適切性がないか確認して、いい歌詞だけ別txtに保存

細かい手順

1 歌詞データを一つのtxtデータに集める
これはある程度分かる思いますが、一応コードを載せておきます

集約.py
import os
dic = "2000-2010"
net = range(43000, 43000 + 23000)

text = ""
for a in net:
    path = f"{dic}/歌詞{str(a)}.txt"
    if os.path.isfile(path):
        try:
            with open(path, "r", encoding="utf-8")as f:
                text += f.read()
        except Exception:
            pass
    else:
        pass
    print(a)

text = text.replace(" ", "\n")


with open("結果メモ.txt","w", encoding="utf-8")as f2:
    f2.write(text)

これで大まかに歌詞を一つのファイルに入れておきます。

2 それをAIに学習させる & 3 AIに歌詞をある程度出させる
今回は、「markovify」というモジュールを使いました。

インストール
pip install markovify
または
python3 -m pip install markovify

とりあえずコードを見せておきます

歌詞生成.py
import markovify

# Get raw text as string.
with open("結果メモ.txt", "r", encoding="utf-8") as f:
    text = f.read()
# Build the model.
text_model = markovify.NewlineText(text, state_size=4)
# Print five randomly-generated sentences

count = 0
while(1):
    sentence = text_model.make_sentence(tries=1000)
    if not(sentence == None) and len(sentence) >= 200:
        with open("歌詞メモ.txt","a+",encoding="utf-8")as sf:
            sf.write(f"{sentence}\n\n")
        count = count + 1
    if count >= 10:
        break

200文字以上の歌詞を10個生成します。
なお、時々Noneと出てしまうため、それを弾くようにもしています。

4 最後は人の目で不適切性がないか確認して、いい歌詞だけ別txtに保存
そのまんまです(
やっぱり最後は人の目が一番良いです。
あとは、歌詞を改行して、見やすくします。

こんな作業をして、作られた歌詞がこちらです。

作詞 / AI

倖せだから
汗ばむ身体はずむ息
この神聖な熱いコートで意識と爪を研ぎ澄まし
遥かな場所へと羽ばたけ絶望に心震わせ
叫ぶ魂
抑えられぬまま許せずに全て壊した
ゼロから始めよう

さあ進め
今!築き上げろ
俺たちのHistory
戻る場所など
どこにもないさ見えるだろう
明日へ続く
Victory Road

この瞬間を抱きしめて越えて行こう
俺たちのDestiny
振り返らず
ただ先を見つめひとりじゃない
明日へ続く
Victory Road
この思い抱きしめて
Take you…
Together!

追いかけよう…
過ぎて行く季節を何度も
追いかけて時に埋もれ
いつか君は瞳を閉ざした
かじかんだ心をあたためてあげるよ
どんな夜も忘れないで僕等は
いつでも一緒さあの風の中で永遠を浴びて
生まれ変わる
小さな鳥のように
僕等の想いも
いつかよみがえる フェニックス

今

なかなか良いんじゃないですか?
AIも捨てたもんじゃないですね
これで作曲もできたらなぁ(

まとめ

なかなかいい歌詞が作れました。
まだまだ、この企画は続けるので、お楽しみに!

ご視聴ありがとうございました!

3
2
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
3
2