LoginSignup
3
3

More than 1 year has passed since last update.

【Python】マルコフ連鎖で東京事変風の歌詞を生成してみた

Last updated at Posted at 2023-01-23

きっかけ

最近はAIが書いたものと人が書いた文書の見分けがつかないくらい、精度が上がっていますね!
その技術を応用すれば、歌詞生成などクリエイティブなこともできるのでは・・・?と思い、
大好きな東京事変の歌詞を学習させて新しく歌詞を生成してみました。

環境

Google colabを使用しています。

歌詞のスクレイピング

スクレイピングについてはこちらの記事でまとめていますので、よかったらご覧ください。東京事変の全歌詞101曲を収集しています。
【Python】椎名林檎と東京事変の歌詞の意味をテキストマイニングでひも解いてみた
https://qiita.com/harunan0913/items/8f8f713b0a51f4b010bd

文書生成のメカニズム

どんな原理で文書生成できるのか自分で説明できる自信がなかったため、chatGPTに聞いてみました。
文書生成メカニズム.png

なんとなく分かったような・・・分からなかったような。
文書生成のコードについては下記ページを参考にしました。
https://axross-recipe.com/recipes/240

前準備

まずはモデル化する前に、集めてきたデータをクレンジングしデータを整形します。

#形態素解析を行なう janome と、マルコフ連鎖を用いるための markovifyをインストール
!pip install janome
!pip install markovify

続いて必要なライブラリをインポートします。

#必要なライブラリをインポート
from janome.tokenizer import Tokenizer
import markovify

次に、janomeで分かち書きし、単語ごとに半角スペースで区切り、文末は改行します。

def text_cleansing(text):
    # 改行、スペース、問題を起こす文字の置換
    table = str.maketrans({
        '': '.',
        '\n': '',
        '\r': '',
        '': '',
        '': '',
        '': '',
        '': '',
        '': '.',
        '(': '',
        ')': '',
        '[': '',
        ']': '',
        '"': '',
        "'": "",
    })
    text = text.translate(table)
    print(text)
    t = Tokenizer()
    result = t.tokenize(text, wakati=True)
    result = list(result)
    # 1単語毎に間に半角スペース、文末には改行を挿入
    splitted_text = ""
    for i in range(len(result)):
        splitted_text += result[i]
        if result[i] != '' and result[i] != '' and result[i] != '':
            splitted_text += ' '
        else:
            splitted_text += '\n'
    return splitted_text


with open('学習させたい歌詞ファイル', mode='r', encoding='UTF-8') as f:
    text = f.read()

# テキストを単語毎に分割して記号を除去
splitted_text = text_cleansing(text)

モデル作成

次に歌詞を生成させます。今回使用したのは2階マルコフ連鎖といわれ、ある単語の直前の2単語までを読み取るため、より自然な文章が生成されます。試行回数は100回としています。

# データセットの量が不足していると確率でnoneが返ってくるので、生成結果が返るまでループさせる
sentence = None
while sentence == None:
    # モデル生成
    text_model = markovify.NewlineText(splitted_text, state_size=2,well_formed=False)
    # モデルから文章を生成
    sentence = text_model.make_sentence(tries=100)

print(sentence.replace(' ', ''))
with open('生成した歌詞.txt', mode='a') as f:
    f.write(sentence.replace(' ', ''))
出力結果
果てしのない拍手やめていやだよ
追つては平穏なる感度を奪うわ
あなたの鏡だもの.とびきり美しい美しい美しい.
ねえ教えて既存の地図は交差点を描いて
鮮やかに広がっていく水面にて
言葉も忘れ苦悩しようもんか知りたいあらがえない
泳いでいこう.とか言われたくはない
油断なさいお忘れなさい繰り返すのが苦手なら
今度急に世界が真っ白け朝もや照らして
寝がえり三度で強盗をします

おお~!なんか、東京事変っぽいのではないでしょうか!?
思ったより簡単に歌詞が生成できました。
私が調べた限りでは、AIが作成した歌詞は著作権などひっかからないようですが、
間違っていましたらご指摘頂けたら幸いです。

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