모 아티스트 그룹은 무엇을 우리에게 전하고 싶었는가? ? ? (WordCloud에서 가사화해 보았다)

이쪽은 ITRC Advent Calendar 2020의 7일째 기사입니다.
이전 기사: @hima_zin331 님의 超解像技術-SRGAN-実装してみた(Tensorflow 2.0) 推論フェーズ編다음 기사: Comming Soon...

소개



올해로 모 아티스트 그룹이 활동 휴지하는 가운데, 당 그룹은 결성 15년 약 170곡 정도의 곡을 내고 왔습니다. 거기서 이번은 약 170곡의 가사를 해석해, 어떤 단어를 많이 사용해 무엇을 팬에게 전하고 싶었는지를 WordCloud로 가시화해 보았습니다.

1. BeautifulSoup, pandas를 사용하여 가사를 스크래핑하고 파일에 저장합니다.



scraping.py

 import requests #URLを開くことができるライブラリ
from bs4 import BeautifulSoup #HTML, XMLから狙ったデータを抽出するためのライブラリ
import pandas as pd #データ分析を容易に行うことができる(今回は表作成のために使用)
import time

#スクレイピングしたデータを格納する表を作成(columns: 列名一列目に`歌詞`というラベル(名前)をつける。)
lyricsTable = pd.DataFrame(columns=['歌詞']) 

#テーブルの最初の5行を表示
lyricsTable.head() 

#曲ページ先頭アドレス
base_url = 'https://www.uta-net.com'

#歌詞一覧ページ
url = 'https://www.uta-net.com/artist/****/'

response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml') #第一引数・・・取得した文字列はtext属性(response.text)で取得できる
                                            #第二引数・・・解析に利用するパーサー。'lxml'は高速に処理できる。
links = soup.find_all('td', class_='side td1') #tdタグ & クラス名が'side td1'な要素を全て取得する。リストで格納される。

for link in links:
    a = base_url + (link.a.get('href')) #aタグの属性を取得する。

    #歌詞詳細ページ
    response = requests.get(a)
    soup = BeautifulSoup(response.text, 'lxml')

    song_lyrics = soup.find('div', id="kashi_area", itemprop='text')

    #要素に含まれるテキストを取得(strip・・・Trueにすることにより改行や空白文字を除去してくれる)
    song_lyrics = song_lyrics.get_text(strip=True) 

    '''
     ---------------歌詞抽出完了--------------
    '''
    #取得した歌詞を表に追加
    tmp_seed = pd.DataFrame([song_lyrics], index=lyricsTable.columns).T
    lyricsTable = lyricsTable.append(tmp_seed)

    #CSVファイルに格納(mode・・・指定したパスが存在しない場合は新規作成、存在する場合は上書きする)
    lyricsTable.to_csv('lyricsTable_AAA.csv', mode='w', encoding='utf-8')

2. janome을 사용하여 형태소 분석을 수행합니다.



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

#CSVファイルを読み込み
lyrics_file = pd.read_csv('lyricsTable.csv', encoding='utf-8')

song_lyrics = lyrics_file['歌詞'].tolist() #リストに変換

t = Tokenizer()
results = []

for s in song_lyrics:
    tokens = t.tokenize(s)

    result = []

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

        #1単語の品詞の抽出 
        ps = tok.part_of_speech 
        hinshi = ps.split(',')[0] 

        if hinshi in ['名詞', '形容詞', '動詞', '副詞']:
            result.append(word)
    rl = (' '.join(result)).strip()
    results.append(rl)


    consequence = [i.replace('\u3000','')for i in results]
with open('word_lyrics.txt', 'w', encoding='utf-8') as fp: # `with`ブロックを使うことでブロックの終了時に自動的にCloseされる
    fp.write("\n".join(consequence))


3. WordCloud 만들기



wordcloud.py
from wordcloud import WordCloud
with open('word_lyrics.txt', encoding='utf8') as text_file:
    text = text_file.read()

#日本語のフォントパス
fpath = '../ヒラギノ角ゴシック W9.ttc'

#表示対象にしたくない単語の除去
stop_words = ['そう', 'ない', 'いる', 'する', 'まま', 'よう', 'てる', 'なる', 'こと', 'もう', 'いい', 'ある',
                 'ゆく', 'れる', 'の', 'ん','せる', 'さ', 'く', '中']

wordcloud = WordCloud(background_color='white',
                     font_path = fpath, width=700, height=500, stopwords=set(stop_words)).generate(text)

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

4.완성




  • 꿈이거나 세계, 내일, 미소 등의 긍정적인 말이 많네요!

  • 참고 자료



    노래 그물
    htps : // m / ysdyt / ms / 9 82fc5b504 7913
    https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj96_6b8rrtAhXIZt4KHapnDf4QFjACegQIBhAC&url=https%3A%2F%2Fn 2F&usg=AOvVaw32rxuE65WNlS2E4Ku7lvos
    https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj6z6im8rrtAhVXfXAKHbZ7AmgQFjADegQIAhAC&url=https%3A%2F%2Fqiita.com%2Fyuuuusuke1997%2Fitems%2F122ca7597c909e73aad5&usg=AOvVaw1mWeXJY- GCeexfmd9ODOHs

    좋은 웹페이지 즐겨찾기