11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google ColabでWordcloudを作成

Last updated at Posted at 2021-12-08

こんにちは!!
昨日の@geranium1216くんの記事では、イギリス留学で彼は一体何をしているのか?について書いてくれました!何やら元気そうでよかったです。わざと日本語忘れたふりをして英語を使ってくる尾関くんを怪訝な目で見るその日を、研究室一同楽しみにしています。

MYJLab Advent Calendar 2021も今日で9日目!
9日目の今日は、ワードクラウドに関して書いてみようと思います。

はじめに

プログラミング初心者が、Google colabでワードクラウドを作ってみました。
MAN WITH A MISSONという狼の頭をかぶったバンドの全楽曲を対象にしています。

結論

このようになりました。
wordcloud4.png

やってみる

準備

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)」をダウンロードすることで入手できます、
スクリーンショット 2021-11-07 11.36.00.png

改めて、形態素解析〜ワードクラウドを作成する

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")

これで完成です。

wordcloud4.png
ワードクラウド化する歌詞とシルエット画像を自由に組み合わせることでオリジナリティあふれるワードクラウドを作成することができます。🙌

参考記事

歌詞分析するためにWebScrapingしてみた。
WordCloudで凛として時雨の歌詞の傾向を可視化する

11
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?