はじめに
ラブライブ!サンシャイン!!の歌詞でワードクラウドを作ってみたらどうなるのかを試してみたのでその結果をまとめました。
前提条件
言語はpython(バージョン2.7)を使い、ワードクラウドの生成のためにwordcloudライブラリ(バージョン:1.5.0)を使いました。wordcloudの導入についてはこちらの記事を参考にしました。
またワードクラウドを作るための形態素解析としてCOTOHA APIを使ってみました。
COTOHA APIの導入と利用するためのソースコードはこちらの記事を参考にしました。
結果(1回目)
最初は解析して出てきた単語を何も考えずワードクラウドに放り込んでみようと思い、extractWord関数を以下のように実装しました。(全体のソースコードは本記事の最後にまとめています。)
#構文解析されたjsonから単語列を抽出する関数
def extractWord(parsedjsonFile):
wordlist = []
j = json.loads(parsedjsonFile)
for c in j["result"]:
for t in c["tokens"]:
#ワードクラウド生成用の単語リストに追加
wordlist.append(t["lemma"])
#スペース区切りの単語列に修正(wordcloudライブラリの仕様に合わせるため)
ret = " ".join(wordlist)
return ret
この状態でいくつかの歌詞のワードクラウドを作ってみました。その一例として3rd シングルhappy party trainの結果を載せます。
図としては特徴的な単語が大きく出ていますが、やはり助詞や語尾のような単語が多く出てくるので他の特徴的な単語が小さくなってしまいます。
チューニング
キーワードのような単語を浮かび上がらせるようにするには抽出した単語から助詞や語尾のような単語を外さないといけないですね。
そこでチューニングとして単語の品詞をチェックして特定の品詞は除外する実装をしました。品詞の種類はCOTOHA APIリファレンスページを見て不要そうなものを選びました。チューニング後の実装は以下のとおりです。
#構文解析されたjsonから単語列を抽出する関数
def extractWord(parsedjsonFile):
wordlist = []
j = json.loads(parsedjsonFile)
for c in j["result"]:
for t in c["tokens"]:
#特定の品詞が来た場合continue処理によってカウントしないようにする
if t["pos"] in [u"格助詞",
u"連用助詞",
u"引用助詞",
u"終助詞",
u"判定詞",
u"動詞接尾辞",
u"動詞活用語尾",
u"形容詞接尾辞",
u"括弧",
u"空白",
u"句点",
u"読点",
u"Symbol"] :
continue
#ワードクラウド生成用の単語リストに追加
wordlist.append(t["lemma"])
#スペース区切りの単語列に修正(wordcloudライブラリの仕様に合わせるため)
ret = " ".join(wordlist)
return ret
結果(2回目)
チューニング後に作られたワードクラウドは以下のとおりになりました。
先ほどの結果と比べると助詞っぽいのがなくなって特徴的な歌詞が浮かんできましたね。歌詞によく出てくる「happy」「party」「train」が強調されるようになりました。
COTOHA APIの構文解析は細かい情報が出るので、作りたいワードクラウドに応じて除外する単語条件を細かく決められるのはいいところでした。
最終的なソースコード
チューニング後のソースコードは下記のとおりとなります。
実行時には同一ディレクトリに歌詞テキストを持つkashi.txtを作成した上で実行してください。
またCOTOHA APIへ構文解析をリクエストするためのモジュールはこちらの記事のものを使ってインポートする実装となってます。
# -*- coding:utf-8 -*-
import json
import os
import codecs
from wordcloud import WordCloud
from CotohaApi import CotohaApi
#歌詞txtを読み込む関数
def readText(filename):
APP_ROOT = os.path.dirname(os.path.abspath( __file__)) + "/"
textfile = APP_ROOT + filename
f = codecs.open(textfile,'r','utf-8')
ret = f.read()
f.close()
return ret
#構文解析されたjsonから単語列を抽出する関数
def extractWord(parsedjsonFile):
wordlist = []
j = json.loads(parsedjsonFile)
for c in j["result"]:
for t in c["tokens"]:
#特定の品詞が来た場合continue処理によってカウントしないようにする
if t["pos"] in [u"格助詞",
u"連用助詞",
u"引用助詞",
u"終助詞",
u"判定詞",
u"動詞接尾辞",
u"動詞活用語尾",
u"形容詞接尾辞",
u"括弧",
u"空白",
u"句点",
u"読点",
u"Symbol"] :
continue
#ワードクラウド生成用の単語リストに追加
wordlist.append(t["lemma"])
#スペース区切りの単語列に修正(wordcloudライブラリの仕様に合わせるため)
ret = " ".join(wordlist)
return ret
if __name__ == '__main__':
#歌詞txt読み込み
sentence = readText("kashi.txt")
# COTOHA APIインスタンス生成し、歌詞を構文解析
nlp = CotohaApi().parse(sentence)
#解析結果から単語列を抽出
wordlist = extractWord(nlp)
#WordCloudを生成
wordcloud = WordCloud(background_color="white",
font_path=r"C:\WINDOWS\Fonts\HGRGE.TTC",
width=800,height=600).generate(wordlist)
wordcloud.to_file("./" + "wordcloud.png")
まとめ
歌詞を形態素解析してワードクラウドを作るところまでは簡単にできましたがそこからターゲットとなる単語を強調させるようにチューニングするところがポイントでした。
今回は助詞や接尾辞といった品詞を除去することでイメージしてた単語が目立つように作れました。