【自然言語処理】あいみょんの歌詞を分析してみた。Pythonで日本語の形態素分析に挑戦!

Python

*記事に掲載されているコードは2024年4月現在問題なく起動します。(検証済み)

こんにちは! Nocky(のっきー)です!

今回の記事では【自然言語処理】あいみょんの歌詞を分析してみた。Pythonで日本語の形態素分析に挑戦!と題して、janomeという形態素分析のライブラリを使って、あいみょんの歌詞を分析してみたいと思います。

どんな分析をするかと言うと、

あいみょんの歌詞を単語に分けて、さらにwordcloudで頻出語句ほど多く表示させることで、歌詞を分析していきます! どんな単語が多いんでしょうか!?

今回の分析するためには歌詞データが必要になります。
歌詞データの取得方法については以前の記事でまとめたので、そちらを参考になさってみてください!

スポンサーリンク

歌詞(日本語の文字列)を分析するためのコード

歌詞(日本語の文字列)を分析するためのコードは下記になります。
コピペして、自分の好きなに歌詞のデータや文章などに調整して、挑戦してみてください。

ちなみにこの記事では、あいみょんの大ヒット曲「マリーゴールド」の歌詞を抽出して分析していきます。

今すぐやってみたい!というあなたにはGoogle Colaboratoryがおすすめです。
Googleのアカウントがあれば、すぐpythonを使うことができます。

Google Colaboratoryの使い方を詳しく知りたい方は下記の記事を参考になさってください!

from janome.tokenizer import Tokenizer
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt 
 
df = pd.read_csv('aimyon_list.csv')
marigold =df.loc[65,'歌詞']
 

t = Tokenizer()
tokens = t.tokenize(marigold)
 
 
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 == "名詞") or (partOfSpeech == "形容詞") or (partOfSpeech == "動詞"):
    if partOfSpeech in['名詞', '動詞', '形容詞', '形容動詞']:
        if (partOfSpeech != "記号"):
            if (partOfSpeech2 != "非自立") and (partOfSpeech2 != "代名詞") and (partOfSpeech2 != "数"):
                word_list.append(word)
 
words=" ".join(word_list)
print(words)  
 
stop_words = ['し','さ','れ','ない']  
fpath = 'TakaoPGothic.ttf'  # 日本語フォント指定

wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=600,   # default width=400, height=200
    background_color="white",   # default=”black”
    stopwords=set(stop_words),
    max_words=500,   # default=200
    min_font_size=4,   #default=4
    collocations = False   #default = True
    ).generate(words)

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

今回のPythonのコード構成は以下のようになっています。

  1. ライブラリのインポート
  2. 歌詞データ(日本語の文章)の抽出
  3. 歌詞データ(日本語の文章)を形態素分析
  4. 描画の設定
  5. 描画の実行

Pythonコードの説明

それでは、それぞれのコードについて詳しく見ていきます!

ライブラリのインストール

今回の分析で使うライブラリ下記になります。インストールされてないライブラリがあれば、インストールしておきましょう。

ターミナルを開いて、下記のコードでインストールしてください。

pip install janome
pip install pandas
pip install wordcloud
pip install matplotlib

google colaboratoryの場合はノートブックに直接コードを入力すれば、インストールができます。
下記の文頭に「!」を付けてインポートしてください!

ライブラリのインポート

from janome.tokenizer import Tokenizer
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt 

歌詞(日本語の文字列)を分析するために必要なライブラリは「Janome」と「WodCloud」です。

Janome」は日本を形態素分析できるライブラリ、「WodCloud」は頻出単語の頻度に応じて大きさを調整できるライブラリです。

他のライブラリの以下の目的でインポートしています。Pandasがインストールされてないようでしたら、「pip intall pandas」でインストールしてください。 timeはpythonの標準ライブラリなので、インストールしなくても大丈夫です。

  • pandas => CSVのデータを読み込み、抽出しやすくするために活用
  • matplotlib => 加工したデータを描画するために活用

歌詞データ(日本語の文字列)の抽出

df = pd.read_csv('aimyon_list.csv')
marigold =df.loc[65,'歌詞'] #65の部分は曲が増えると変わってしまいます! 202211現在の情報です。

この部分ではCSVのデータを読み込み、dfに代入します。
歌詞や文章のCSVデータは分析で使うpythonファイルと同じディレクトリに保存して置いてください。
WEBサイトの更新などで、歌詞のindex番号が変わっている場合があるので念のため確認してください!

ちなみに、dfの中身はこんな感じです。

今回は「マリーゴールド」の歌詞を分析するので、マリーゴールドの歌詞のみをmarigoldに代入します。

歌詞データ(日本語の文字列)を形態素分析

t = Tokenizer()
tokens = t.tokenize(marigold)
 
 
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 != "非自立") and (partOfSpeech2 != "代名詞") and (partOfSpeech2 != "数"):
                word_list.append(word)
 
words=" ".join(word_list)
print(words)  

この部分で歌詞の形態素分析をしています。
歌詞を単語に分けた後に、word_listという空のリストに’名詞’、’動詞’、’形容詞’、’形容動詞’のみ追加していきます。

描画の設定

stop_words = ['し','さ','れ','ない']  # 表示させない単語の設定
fpath = 'TakaoPGothic.ttf'  # 日本語フォント指定

wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=600,   # default width=400, height=200
    background_color="white",   # default=”black”
    stopwords=set(stop_words),
    max_words=500,   # default=200
    min_font_size=4,   #default=4
    collocations = False   #default = True
    ).generate(words)

この部分で描画の設定を行います。

stop_wordsでは描画させてない単語を選定します。あまり意味を持たない単語かつ、頻出し過ぎて他の単語があまりよくわからない時などに設定します。

描画後にこの言葉はいらないなーと思った際に適宜追加していくと良いです。

他には図の大きさ、背景の色の設定などを行なっています。

日本語設定について

fpath = 'TakaoPGothic.ttf'  # 日本語フォント指定

この部分で日本語の設定を行なっています。
日本語のフォントデータも同じディレクトリに保存してください。こちらからダウンロードできます。

描画

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

この部分で描画、出力した内容を画像保存しています。

このように出力されました! 目と雲が意外と頻出なのは驚きです。
麦わら帽子“麦わら”“帽子”マリーゴールド“マリー””ゴールド”に分かれてしまっているのが惜しい。。

いかがでしたでしょうか!

是非、あなたの好きな文章で、自分なりの分析を行ってみてください。

おまけ:マスク画像を使って表現のバリエーションを広げる

おまけとして、画像の形に合わせてWordCloudを表示させる方法を紹介します。

抽出した歌詞がマリーゴールドだったので、画像はあいみょんの昔のアー写のデザイン画でやってみます。

上記の画像の色と形に合わせて表現していきます。

コードは下記です!コピペして実行してみてください。
使用する画像はpythonのファイルと同じディレクトリに保存して下さい。

また、画像は背景が白でないとうまくいきませんので、ご注意ください。

マスク画像のコード

from janome.tokenizer import Tokenizer
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt 
import numpy as np
from PIL import Image
 
df = pd.read_csv('aimyon_list.csv')
marigold =df.loc[65,'歌詞']
 
print(marigold)  
t = Tokenizer()
tokens = t.tokenize(marigold)
 
 
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 == "名詞") or (partOfSpeech == "形容詞") or (partOfSpeech == "動詞"):
    if partOfSpeech in['名詞', '動詞', '形容詞', '形容動詞']:
        if (partOfSpeech != "記号"):
            if (partOfSpeech2 != "非自立") and (partOfSpeech2 != "代名詞") and (partOfSpeech2 != "数"):
                word_list.append(word)
 
words=" ".join(word_list)
print(words)  
 
stop_words = ['し','さ','れ','ない']  
fpath = 'TakaoPGothic.ttf'  # 日本語フォント指定
img_color = np.array(Image.open('aim.png'))

wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=600,   # default width=400, height=200
    background_color="white",   # default=”black”
    stopwords=set(stop_words),
    max_words=500,   # default=200
    min_font_size=4,   #default=4
    mask=img_color,
    collocations = False   #default = True
    ).generate(words)

image_colors = ImageColorGenerator(img_color)
 
plt.figure(figsize=(15,12))
plt.imshow(wordcloud.recolor(color_func=image_colors),interpolation="bilinear")
plt.axis("off")
plt.savefig("marigold_mask.png")
plt.show()

このような感じになります! ちょっとわかりにくいですかね。。w

でも、画像と比べると意外とわかりますねww

マスク画像にWordCloudを表示させるために追加されるコード

# ライブラリのインポート 
#ImageColorGeneratorとImageを追加でインポート

from wordcloud import WordCloud, ImageColorGenerator 
from PIL import Image

ImageColorGeneratorとImageを追加でインポートします。

img_color = np.array(Image.open('aim2.png'))

この部分で画像の色を分析して、抽出します。

wordcloud = WordCloud(
    font_path=fpath,
    width=900, height=600,   # default width=400, height=200
    background_color="white",   # default=”black”
    stopwords=set(stop_words),
    max_words=500,   # default=200
    min_font_size=4,   #default=4
    # mask=img_color 抽出した画像の色を描画の際に活用する設定です。
    mask=img_color,
    collocations = False   #default = True
    ).generate(words)

image_colors = ImageColorGenerator(img_color)

mask=img_colorで抽出した画像の形を描画の際に活用する設定を行います。

image_colors = ImageColorGenerator(img_color)で抽出した画像の色を描画の際に活用するために色の情報をimage_colorsに代入します。

plt.figure(figsize=(15,12))
#
plt.imshow(wordcloud.recolor(color_func=image_colors),interpolation="bilinear")
plt.axis("off")
plt.savefig("marigold_mask.png")
plt.show()

wordcloud.recolor(color_func=image_colors)で描画の色に画像の色を使う設定を行います。

終わり

今回の記事では形態素分析のライブラリ(janome)を使って、あいみょんの歌詞を分析してみました!

おまけのマスク画像の活用まで含めると結構盛り沢山でお届けしました。

お付き合いいただき、ありがとうございました!!

また、他の記事でお会いしましょう〜!!

おすすめ記事

Pythonを学べるおすすめのUdemy講座について下記の記事で紹介しています!
是非、参考になさってみてください!

この記事を書いた人
Nocky

IT企業でBIzDev兼マーケティングに従事。

フルスタックマーケ担当を目指してマーケティング、プログラミング、データサイエンスについての情報をメインに投稿。
プログラミング(Python、Javascript)、統計学、マーケティング、WEBデザインなどについて学び、アウトプットしていきます!!

Nockyをフォローする
Pythonプログラミング
スポンサーリンク
シェアする
error: Content is protected !!
タイトルとURLをコピーしました