AI・機械学習

【自然言語処理】Awichの歌詞を分析してみた

palm

こんにちは!Palmです。
今回は自然言語処理で今話題のラッパーAwichの歌詞を分析してみました!

分析方法はAwichの歌詞を単語に分けて、Word Cloudで頻出単語を多く表示させます。

歌詞データをExcel(csvファイル)に書き込む

まず分析するためには歌詞データが必要となります。
https://www.uta-net.comからデータを拾いました。

15行目あたりの # Awichの歌詞一覧ページURL のところに好きな歌手を埋め込んであげてください。

#歌詞ページより、曲名、歌詞、発売日、教示回数を取得##
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import time
import re

# 取得したデータを格納するデータフレームを作成
Awich_songs_df = pd.DataFrame(columns=['song_name', 'lyrics', 'release_date', 'impression'])

# Uta-Net先頭URL
base_url = 'https://www.uta-net.com'
# Awichの歌詞一覧ページURL
url = 'https://www.uta-net.com/artist/23115/'

# 歌詞一覧ページのHTML取得
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
links = soup.find_all('td', class_='sp-w-100 pt-0 pt-lg-2')

# 歌詞ページより、情報を取得
for link in links:
    a = base_url + (link.a.get('href'))
    
    # 歌詞ページよりHTMLを取得
    response_a = requests.get(a)
    soup_a = BeautifulSoup(response_a.text, 'lxml')
    
    # 曲名取得
    song_name = soup_a.find('h2').text
    # 歌詞取得
    song_lyric = soup_a.find('div', itemprop='lyrics').text.replace('\n', '')
    # 発売日取得
    detail = soup_a.find('p', class_='detail').text
    match = re.search(r'\d{4}/\d{2}/\d{2}', detail)
    release_date = datetime.strptime(match.group(), '%Y/%m/%d').date()
    # 表示回数を取得
    impression_text = soup_a.find('p', string=re.compile(r'この曲の表示回数:'))
    if impression_text:
        impression = re.search(r'(\d+)回', impression_text.text).group(1)
    else:
        impression = '情報なし'
    
    # 取得したデータフレームに追加
    temp_df = pd.DataFrame([[song_name, song_lyric, release_date, impression]], columns=Awich_songs_df.columns)
    Awich_songs_df = pd.concat([Awich_songs_df, temp_df], ignore_index=True)
    
    # Uta-Netのサーバーに負荷を与えないように「2秒待機」
    time.sleep(2)

# csv出力 (UTF-8で書き込む)
Awich_songs_df.to_csv('Awich_songs_df.csv', encoding='cp932', errors="ignore")

このようなExcelファイルが生成できたら成功です。

ライブラリーをインストールする

コンソールでこちらを実行してください!

pandas:

pip install pandaspip 

janome:

install janome

wordcloud:

pip install wordcloud

matplotlib:

pip install matplotlib

Pillow (PILはPillowという名前で利用可能です):

#Pillowのバージョンを9.5.0にダウングレードすることで、textsizeメソッドの問題を回避することができます。
pip install Pillow==9.5.0

ライブラリをインポートする

import pandas as pd
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import ImageFont, ImageDraw, Image

CSVファイルを読み込む

今回はcsvファイルの15行目「GILA GILA feat. JP THE WAVY, YZERR」の歌詞を読み込みたかったので、15行目を抽出しました。

# CSVファイルを読み込み
file_path = 'Awich_songs_df.csv'
df = pd.read_csv(file_path, encoding='cp932')

# 'lyrics'列の15行目を抽出
senno = df.loc[15, 'lyrics']

歌詞データを形態素分析

この部分で歌詞を分析していきます。
word_list に ’名詞’, ‘動詞’, ‘形容詞’, ‘形容動詞’のみを追加します。

# トークナイザーの初期化
t = Tokenizer()
tokens = t.tokenize(senno)

word_list = []
for token in tokens:
    word = token.surface
    partOfSpeech = token.part_of_speech.split(',')[0]
    partOfSpeech2 = token.part_of_speech.split(',')[1]

    if partOfSpeech in ['名詞', '動詞', '形容詞', '形容動詞']:
        if partOfSpeech != "記号":
            if partOfSpeech2 not in ["非自立", "代名詞", "数"]:
                word_list.append(word)

words = " ".join(word_list)

結果をファイルに書き込む

プログラム上で output.txt を作って結果をそこに書き込んでいきます。

# 結果をファイルに書き込む
output_file = 'output.txt'
with open(output_file, 'w', encoding='utf-8') as f:
    f.write(words)

ファイルを読み込む

# ファイルを読み込む
with open(output_file, 'r', encoding='utf-8') as f:
    text = f.read()

WordCloudの生成

GILAGILAが一番多いはずなのに目立つのが「GILAGIN」になってたりするところが惜しいです。

# WordCloudの生成
stop_words = ['し', 'さ', 'れ', 'ない']
fpath = '/System/Library/Fonts/ヒラギノ角ゴシック W5.ttc'  # 適切なフォントパスを指定


wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=600,
    background_color="white",
    stopwords=set(stop_words),
    max_font_size=100,  # フォントサイズを大きく設定
    collocations=False
).generate(text)

plt.figure(figsize=(15, 12))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.savefig("senno.png")
plt.show()

フォントの設定

OSによってフォントの設定の仕方がわかれます。

# フォントファイルのパスを確認し、適切なフォントを使用する
fpath = '/usr/share/fonts/truetype/noto/NotoSansJP-Regular.ttf'  # Linuxの場合
# fpath = '/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc'  # macOSの場合
# fpath = 'C:/Windows/Fonts/msgothic.ttc'  # Windowsの場合

AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’について

Pillowのバージョンを9.5.0にダウングレードすることで、textsizeメソッドの問題を回避することができます。

【手順】
現在のPillowをアンインストール
Pillow 9.5.0のインストール

以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip uninstall Pillow
pip install Pillow==9.5.0

まとめ

ちょっと流行りも遅れてしまいましたが、自然言語処理の実装をしてみました!
うまく成功してよかったです。

最後まで読んでいただきありがとうございました!

スポンサーリンク
ABOUT ME
Palm
Palm
東京通信大学3年生
私はpalm(ぱるむ)です。お花や自然が大好きです。専門学校でWeb開発を学び、東京通信大学に編入しました。得意分野は、ウェブ開発(フロントエンド、バックエンド)や機械学習(自然言語、データ分析)です。趣味で色々デモ開発をしています。
記事URLをコピーしました