uma3blog

なんか書きます。

Word Cloudで水樹奈々と田村ゆかりの曲の歌詞の単語の出現頻度を可視化してみた

「の」が4つ続いた。

Word Cloudって?

「Word Cloud」で画像検索すれば大量に出てきます。

水樹奈々って?

「アニソンの女王」

「声優アーティスト」を世間に定着させた人*1。愛称は「奈々様」「お奈々」「ヘッド」「奈々さん」など。

前人未到を突っ走り続け、声優初のオリコン週間1位、声優初の紅白歌合戦出場、声優初の東京ドーム公演など、「声優初」が多すぎる人。さらに今年1月には声優どころかアーティストとしても初の日本武道館7daysライブを成功させた。

また、今年の6/23から夏ツアー「NANA MIZUKI LIVE ISLAND 2018」が始まってます。

www.mizukinana.jp


私も3ヶ所行きます。

田村ゆかりって?

ゆかり王国のお姫様」

声優アーティストとして、さいたまスーパーアリーナ横浜アリーナなどアリーナ公演も多く成功させており、長年、水樹奈々堀江由衣とともにキングレコードの声優御三家と呼ばれていた。愛称は「ゆかりん

彼女のファンは「王国民」と呼ばれるピンクの集団。ライブでは比類の無い統率力を見せる。「You & Me」のライブ映像は王国民の統率力を垣間見ることが出来ることで特に有名。ちなみにこの曲は「入国審査」と呼ばれており、ラップを完璧に歌えないと王国民になることが出来ない*2。あとは「fancy baby doll」とかも有名。

現在はキングレコードとの契約を終了しており、事務所をアイムエンタープライズからアミュレートに移籍し、個人レーベル「Cana aria」を設立し活動中*3

今年の10/6,7には、詳細未発表だが「ゆかりっくFes」などというものが開催予定。私はもちろん両日参加です。

http://yukaricfes.com

\世界一かわいいよ!/

実装

実装しました。

URLを記載している箇所は都合上[URL]としています。

環境はWindows、Python3.6.5

歌詞を単語に分解するための形態素解析にはMeCabを使いました。

また、mask画像には、水樹奈々:青いハート、田村ゆかり:ピンクのハートを選びました。

# -*- coding: utf-8 -*-

import lxml.html
from selenium import webdriver
import pickle
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import re
import MeCab

pattern = re.compile('[!-~]')
#フォントを指定。下記はメイリオを指定
font_path = "C:/WINDOWS/Fonts/MEIRYO.TTC"
stop_words = [ u'てる', u'いる', u'なる', u'れる', u'する', u'ある', u'こと', u'これ', u'さん', u'して',
		u'くれる', u'やる', u'くださる', u'そう', u'せる', u'した', u'思う',
		u'それ', u'ここ', u'ちゃん', u'くん', u'', u'て',u'に',u'を',u'は',u'の', u'が', u'と', u'た', u'し', u'で',
		u'ない', u'も', u'な', u'い', u'か', u'ので', u'よう', u'']

def getUrls():
	target_url = "[URL]"
	driver = webdriver.PhantomJS()
	driver.get(target_url)
	root = lxml.html.fromstring(driver.page_source)
	links = root.cssselect("td.side.td1 a")

	#TOPのURL
	song_url = "[URL]"
	linkarr = []
	#該当箇所のhref要素だけ取り出したlinkをTOPのURLと結合してリストに突っ込む
	for link in links:
		linkarr.append(song_url + link.attrib["href"])

	return linkarr

def getLyrics(urls):
	driver = webdriver.PhantomJS()
	lyrics = []
	for url in urls:
		driver.get(url)
		root = lxml.html.fromstring(driver.page_source)
		#歌詞部分のみ抽出
		lyrics.append(root.cssselect("#kashi_area")[0].text_content())

	#ファイルに保存
	f = open("list.txt", 'wb')
	pickle.dump(lyrics, f)
	f.close()

def list_concat():
	readfile = open("list.txt", 'rb')
	writefile = open("lyrics.txt", 'a')
	list = pickle.load(readfile)
	for text in list:
		text.replace("\r\n", " ")
		writefile.writelines(text)
	readfile.close()
	writefile.close()

def text_parse(text):
	words = []
	mt = MeCab.Tagger('-Ochasen')
	res = mt.parseToNode(text)
	while res:
		if res.feature.split(",")[0] in ["形容詞", "動詞","名詞", "副詞"]:
			if res.surface != "" and (not pattern.match(res.surface)):
				words.append(res.surface)
		res = res.next

	return words

def word_cloud():
	readfile = open("list.txt", 'rb')
	list = pickle.load(readfile)
	lyrics = ""
	for text in list:
		lyrics += text
	lyrics.replace(" ", "")
	#maskにする画像を指定
	heart_mask = np.array(Image.open("heart.png"))
	#MeCabで形態素解析
	words = text_parse(lyrics)
	#背景色指定、フォント指定、マスク指定、ストップワード指定
	wc = WordCloud(background_color="white", font_path=font_path,
			mask=heart_mask, stopwords=set(stop_words))
	wc.generate(" ".join(words))
	#色を付ける場合
	image_colors = ImageColorGenerator(heart_mask)
	plt.imshow(wc.recolor(color_func=image_colors), interpolation='bilinear')
	#色を付けない場合
	#plt.imshow(wc, interpolation='bilinear')
	plt.axis("off")
	plt.savefig('lyrics_wordcloud.png')

def main():
	#最初の1回のみ歌詞を取得しファイルに保存
	urls = getUrls()
	getLyrics(urls)
	#リストを連結
	list_concat()
	#word cloud作成
	word_cloud()

if __name__ == '__main__':
	main()

結果

田村ゆかり

f:id:uma3san:20180627002108p:plain

似てますね。

試しにゆかりんの方をAlice的なmaskにしてみたのが以下。

f:id:uma3san:20180627003949p:plain

いい感じ。

*1:声優アーティストとしては、以前に椎名へきる林原めぐみがいますが、一般に定着させたのは水樹奈々だと思います

*2:というのは冗談ですが、実際みんな歌えます

*3:キングレコードからアミュレートに移籍となっていたのを修正しました