こんにちは!!
昨日の@geranium1216くんの記事では、イギリス留学で彼は一体何をしているのか?について書いてくれました!何やら元気そうでよかったです。わざと日本語忘れたふりをして英語を使ってくる尾関くんを怪訝な目で見るその日を、研究室一同楽しみにしています。
MYJLab Advent Calendar 2021も今日で9日目!
9日目の今日は、ワードクラウドに関して書いてみようと思います。
はじめに
プログラミング初心者が、Google colabでワードクラウドを作ってみました。
MAN WITH A MISSONという狼の頭をかぶったバンドの全楽曲を対象にしています。
結論
やってみる
準備
Google ColaboratoryからGoogle ColabでDriveをマウントする
from google.colab import drive
drive.mount('/content/drive')
Google Driveの「マイドライブ」の下が使えるようになりました。
wordcloudとmecabをダウンロードする
!pip list | grep wordcloud
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
先頭に「!」をつけます。
これでwordcloudとmecabが使えるようになりました。
歌詞のSCVファイルをGoogle Drive上に作成する
import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
from time import sleep
import sys
import MeCab
import numpy as np
from PIL import Image
from sklearn.feature_extraction.text import TfidfVectorizer
import matplotlib.pyplot as plt
%matplotlib inline
def scraping_web_page(url):
sleep(10)
html = requests.get(url)
soup = BeautifulSoup(html.content, 'html.parser')
return soup
soup = scraping_web_page('https://www.uta-net.com/artist/11463/')
contents = []
contents.append(soup.find_all(href=re.compile('/song/\d+/$')))
contents.append(soup.find_all(href=re.compile('/song/\d+/$')))
contents.append(soup.find_all(class_=re.compile('td2')))
contents.append(soup.find_all(class_=re.compile('td3')))
contents.append(soup.find_all(class_=re.compile('td4')))
informations = []
for i, content in enumerate(contents):
tmp_list = []
for element in content:
if i == 0:
tmp_list.append(element.get('href'))
else:
tmp_list.append(element.string)
informations.append(tmp_list)
artist_df = pd.DataFrame({
'URL' : informations[0],
'SongName' : informations[1],
'Artist' : informations[2],
'Lyricist' : informations[3],
'Composer' : informations[4]})
artist_df.URL = artist_df.URL.apply(lambda x : 'https://www.uta-net.com' + x)
contents_list = []
for i, url in artist_df.URL.iteritems():
contents_list.append(scraping_web_page(url))
lyrics = []
for contents in contents_list:
lyrics.append(contents.find(id='kashi_area').text)
artist_df['Lyric'] = lyrics
artist_df.to_csv("/content/drive/My Drive/###/###.scv")
ここの部分を変えることで、違うアーティストのSCVファイルが作れます。
#曲一覧ページをスクレイピングする
soup = scraping_web_page('https://www.uta-net.com/artist/11463/')
一番最後の行で、Google Drive上の保存の場所の指定と、ファイル名の指定をします。
artist_df.to_csv("/content/drive/My Drive/###.scv")
形態素解析〜ワードクラウドを作成する
####その前に準備
ワードクラウドを好きな形に処理するため、フリー素材サイトさんから狼のシルエット画像を入手し、Google Drive上に保存しました。
また、日本語のフォントのダウンロードも行い同じくGoogle Drive上に保存しました。
####日本語のフォントの入手
文字情報技術促進協議会 IPAフォント Ver.003.03より、「IPA Pゴシック(Ver.003.03)」をダウンロードすることで入手できます、
改めて、形態素解析〜ワードクラウドを作成する
artist_df = pd.read_csv("/content/drive/My Drive/###/###.scv",encoding="utf_8")
artist_df.drop(2,inplace=True)
artist_df.drop(55,inplace=True)
artist_df.drop(92,inplace=True)
artist_df.drop(17,inplace=True)
artist_df.drop(54,inplace=True)
artist_df.drop(59,inplace=True)
artist_df.drop(83,inplace=True)
artist_df.reset_index(drop=True,inplace=True)
def get_word_list(lyric_list):
m = MeCab.Tagger ("-Ochasen")
lines = []
keitaiso = []
for text in lyric_list:
keitaiso = []
m.parse('')
ttt = m.parseToNode (re.sub('\u3000',' ',text))
while ttt:
tmp = {}
tmp['surface'] = ttt.surface
tmp['base'] = ttt.feature.split(',')[-3] #base
tmp['pos'] = ttt.feature.split(',')[0] #pos
tmp['pos1'] = ttt.feature.split(',')[1] #pos1
if 'BOS/EOS' not in tmp['pos']:
keitaiso.append(tmp)
ttt = ttt.next
lines.append(keitaiso)
word_list = []
for line in lines:
for keitaiso in line:
if (keitaiso['pos'] == '名詞') |\
(keitaiso['pos'] == '動詞') |\
(keitaiso['pos'] == '形容詞') :
if not keitaiso['base'] == '*' :
word_list.append(keitaiso['base'])
else:
word_list.append(keitaiso['surface'])
return word_list
def draw_wordcloud(df,col_name_noun,col_name_quant,fig_title,masking=True):
word_freq_dict = {}
stop_words = set(['いる','する','れる','てる','なる','られる','よう','の','いく','ん','せる','いい','ない','ある','しまう','・','さ', 'ー', ',', '.', '\'', u'T', u'The', u'am', u'is', u'of', u'and', u'the', u'The', u'to', u'it', u'It,' u'for', u'in', u'as', u'or', u'are', u'be', u'this', u'that', u'will', u'there', u'was'])
for i, v in df.iterrows():
if v[col_name_noun] not in stop_words:
word_freq_dict[v[col_name_noun]] = v[col_name_quant]
from wordcloud import WordCloud
#text = ' '.join(words)
if masking:
tele_mask = np.array(Image.open("/content/drive/My Drive/###.png"))
else:
tele_mask = None
wordcloud = WordCloud(background_color='white',
font_path = "/content/drive/My Drive/ipagp.ttf",
mask=tele_mask,
min_font_size=15,
max_font_size=200,
width=100,
height=100
)
wordcloud.generate_from_frequencies(word_freq_dict)
plt.figure(figsize=[20,20])
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis("off")
plt.title(fig_title,fontsize=25)
wordcloud.to_file("/content/drive/My Drive/###.png")
word_list = get_word_list(artist_df.Lyric.tolist())
word_freq = pd.Series(word_list).value_counts()
value_counts()
words_df = pd.DataFrame({'noun' : word_freq.index,
'noun_count' : word_freq.tolist()})
draw_wordcloud(words_df,'noun','noun_count','All lyrics',True)
先ほど作成したCSVファイルを読み込みます。
artist_df = pd.read_csv("/content/drive/My Drive/###/###.scv",encoding="utf_8")
作成したSCVの中で不要なデータを消去します。(私はここでカバー曲やアレンジ曲を取り除きました。)
artist_df.drop(2,inplace=True)
artist_df.drop(55,inplace=True)
artist_df.drop(92,inplace=True)
artist_df.drop(17,inplace=True)
artist_df.drop(54,inplace=True)
artist_df.drop(59,inplace=True)
artist_df.drop(83,inplace=True)
artist_df.reset_index(drop=True,inplace=True)
ここで、先ほどダウンロードした日本語のフォントを指定します。
wordcloud = WordCloud(background_color='white',
font_path = "/content/drive/My Drive/ipagp.ttf",
ここで、ダウンロードしたシルエット画像を読み込みます。
ordcloud.to_file("/content/drive/My Drive/###.png")
最後に、作成するワードクラウドの保存場所を指定します。
wordcloud.to_file("/content/drive/My Drive/###.png")
これで完成です。
ワードクラウド化する歌詞とシルエット画像を自由に組み合わせることでオリジナリティあふれるワードクラウドを作成することができます。🙌