BETA

マキシマム ザ ホルモンの歌詞を可視化してみた

投稿日:2019-12-08
最終更新:2019-12-09

きっかけ

qiitaの記事で立て続けに「歌詞の可視化」記事を見かけたので真似してみました。
最近pythonの勉強を始めたところだったので、何か形になる物を作ってみたいという想いもありました!

環境

Google Colaboratry
(ランタイムはもちろんPython3です)

参考サイト

https://qiita.com/Senple/items/1ad08b1a7ac9560bef62
https://qiita.com/yuuuusuke1997/items/122ca7597c909e73aad5
https://qiita.com/ksj555/items/817ae4a81d2494b45de7
http://cedro3.com/ai/word-cloud/
http://ailaby.com/janome/

ご覧になって頂くとわかりますが、ほぼqiitaの先輩達の記事の丸パクリです。
(この投稿すら)

やったこと

  • Webスクレイピング (歌詞の収集)
  • 形態素解析 (歌詞の単語解析)
  • 可視化 (WordCloud)

完成品

歌詞の収集

requestsとBeautifulSoupで歌詞情報をスクレイピングし、pandasのデータフレームを作成します。

import requests  
from bs4 import BeautifulSoup  
import pandas as pd  
import tim  

list_df = pd.DataFrame(columns=['歌詞']  

base_url = 'https://www.uta-net.com/'  
url = 'https://www.uta-net.com/artist/1691/'  
response = requests.get(url)  
soup = BeautifulSoup(response.text, 'lxml')  
links = soup.find_all('td', class_='side td1')  

for link in links:  
  a = base_url + (link.a.get('href'))  
  response = requests.get(a)  
  soup = BeautifulSoup(response.text, 'lxml')  
  lyrics = soup.find('div', itemprop='lyrics')  
  lyric = lyrics.text  
  lyric = lyric.replace('\n','')  
  # サーバ負荷防止で1秒待機  
  time.sleep(1)  

  # 取得した歌詞をDataFrameに追加  
  tmp_se = pd.DataFrame([lyric], index=list_df.columns).T  
  list_df = list_df.append(tmp_se)  

# csv保存  
list_df.to_csv('list.csv', mode = 'a', encoding='utf-8')  

形態素解析し、歌詞を単語に分割

形態素解析にはMeCabではなくjanomeを使いました。
janomeはColabにはデフォルトではインストールされていないので、以下でインストールしました。

!pip install janome  

スクレイピングした歌詞情報を解析し、名詞、形容詞、動詞、副詞を抜き出します。

from janome.tokenizer import Tokenizer  
import pandas as pd  
import re  

df_file = pd.read_csv('list.csv', encoding='utf-8')  
lyrics = df_file['歌詞'].tolist()  

t = Tokenizer()  
results = []  

for s in lyrics:  
  tokens = t.tokenize(s)  
  r = []  

  for tok in tokens:  
    if tok.base_form == '*':  
      word = tok.surface  
    else:  
      word = tok.base_form  

    ps = tok.part_of_speech  
    hinshi = ps.split(',')[0]  

    if hinshi in ['名詞', '形容詞', '動詞', '副詞']:  
      r.append(word)  

  rl = (' '.join(r)).strip()  
  results.append(rl)  
  # 余計な文字コードを置き換え  
  result = [i.replace('\u3000', '') for i in results]  

text_file = 'wakati_list.txt'  
with open(text_file, 'w', encoding='utf-8') as fp:  
  fp.write("\n".join(result))  

可視化

不要となりそうな単語をstopwordsとして指定し、WordCloud化!

from wordcloud import WordCloud  

text_file = open('wakati_list.txt', encoding='utf-8')  
text = text_file.read()  

# 日本語フォント指定  
fpath = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'  

#無意味そうな単語除去  
stop_words = ['そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる', 'なる',  
                'こと', 'もう', 'いい', 'ある', 'ゆく', 'れる']  

wordcloud = WordCloud(background_color='black',  
                        colormap='autumn', font_path=fpath,  
                        width=800, height=600,   
                        stopwords=set(stop_words)).generate(text)  

wordcloud.to_file('./wordcloud.png')  

おや?

なんかちょっとクドいというか、面白みが足らないですね。
「ポアダ」はともかく、「破る」の前面に出っぷりが。
「破り」があればいいのでstopwordsに加えます。

#無意味そうな単語除去  
stop_words = ['そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる', 'なる',  
                'こと', 'もう', 'いい', 'ある', 'ゆく', 'れる', '破る']  

完成!

そして冒頭の完成品となりました!

最後に

ほぼほぼ先輩たちの丸パクリですが、Webスクレイピングや形態素解析を学べました!
楽しかったです!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

イケモンキーの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう