⛅️

YouTube動画へのコメントをワードクラウドを使って表示する

2024/05/11に公開

noteに掲載したこちらの取り組みの中で、ワードクラウドを作成しました。
https://note.com/yebi_crab/n/n4866e35703cd
本記事では、ワードクラウドの使い方やコード、作成における注意点についてまとめています。

対象の動画コメントについては、YouTube Data APIを利用してSixTONESというアイドルグループのYouTubeチャンネルの動画から収集しました。YouTube Data APIについてはこちらの記事に記載しています。

ワードクラウドについて

概要

文章内の単語の出現頻度にあわせ、文字の大きさを変えて表示した図のことです。
ワードクラウドを作成することで、対象について注目されているテーマやキーワードが一目でわかります。

作成までのステップ

ワードクラウドで表示したい文章が日本語の場合、まずは文を形態素(意味を有する最小の単位)に分解するという形態素解析を行なってから、ワードクラウドを作成します。
形態素解析には、JanomeやMecabというライブラリが使えます。今回はMecabを利用しました。

https://zenn.dev/megane_otoko/articles/008_morphological_analysis

https://qiita.com/hi-asano/items/aaf406db875f1c81530e

環境

Google Colaboratoryを利用。

ワードクラウドを作成する

動画コメント収集時に、以下の形で情報を取得しました。
具体的なコード等はこちらの記事に記載しています。

名称 説明 備考
video_id 動画ID 特定のプレイリストから最新50件(最大)
title 動画のタイトル
comments 動画のコメント 最新300件を取得

以下のようなデータを取得しています。(実際には投稿日時も収集していましたが、今回は利用しないため記載を省いています。)

{'video_id': 'p0NSYYgfXm0', 'title': '【SixTONES】斧投げまくってストレス発散!!', 'comments': '1:26\n「ここで働いたほうがイイっすよ!!!」\n大好き\n🔥してくれるの優しい☺️\n唐突にべったりしてるゆごじゅりがみたくなってきてしまった。\nキルショット、坊ちゃんの厨二心をくすぐる単語だ\n急に見たくなって改めて見てみたら、慎太郎が全然振りかぶんないですぐ投げてて、ゴルフもこんな感じなんだろうなって思った😂💚\n2:05 最初ざわついてる意味がわかんなかったけど、よく見たらすごい刺さり方してた(笑)こーちミラクル!そしてその後の流れおもしろ(笑)\n ・・・(省略)}

動画ごとに形態素解析・ワードクラウドを作成し、全動画に繰り返し実行します。
最終的には、以下のコードになりました。

ライブラリインポート

!pip install mecab-python3
import re
from collections import Counter
from wordcloud import WordCloud, STOPWORDS
import MeCab

またGoogle ColabでMatplotlibで動画タイトルを表示しようとすると、そのままではうまく表示されませんでした。
こちらの記事も参考にし、以下を追加で実行しました。
https://note.com/d1c/n/n3938e1ecad85

!apt-get -y install fonts-ipafont-gothic
!pip install japanize-matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.rcParams['font.family'] = 'IPAPGothic'
japanize_matplotlib.japanize()

形態素解析・ワードクラウド作成

mecab = MeCab.Tagger('-Ochasen')

# ストップワードの指定
stopwords = set(STOPWORDS).union({'なる', 'いく', 'すぎる', 'くる', 'する', 'の', 'てる', '!', '!', 'くん', '人', 'いる', '、', '?', '?', "さん", 'この', '曲', 'おめでとう', 'ダンス', 'アレンジ', 'おはよう', '聴く', '聞く', '見る', '。', 'ある', 'れる', 'ん'})

for video in video_data_entertainment:
    video_id = video['video_id']
    title = video['title']
    comments = video['comments'].split('\n')

    # 形態素解析を行い、フィルタリング後の単語を格納
    text = ''
    for comment in comments:
        node = mecab.parseToNode(comment)
        while node:
            features = node.feature.split(',')
            pos = features[0]  # 品詞を取得
            base_form = features[6] if len(features) > 6 else node.surface  # 基本形を取得
            if pos in ['名詞', '動詞', '形容詞'] and base_form not in stopwords and base_form != '*':
                text += ' ' + base_form
            node = node.next

    # ワードクラウドを生成
    wordcloud = WordCloud(width=800, height=400, font_path=font_path, background_color='white', stopwords=stopwords).generate(text)

    # 結果を表示
    plt.figure(figsize=(10, 5))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.title(title)
    plt.show()

    # 画像を保存
    wordcloud.to_file(f'YOUR_FILE_PATH/wordcloud_{video_id}.png') # 保存先のファイルパスを指定

作成における注意点

「SixTONES – 音色 [YouTube ver.]」のコメントから作成したワードクラウドを例に、作成上の注意点と対処法についてもまとめていきます。
https://www.youtube.com/watch?v=pXtP_U1NHhc
まずは、一番最初にできたものを紹介。

文章に頻出の「で」とか「の」とか「に」などでほとんど埋まってしまい、どのような動画なのかがよく分からなくなってしまいました。

品詞の限定

ワードクラウドの表示は、視聴者が注目したところや感情に絞りたいため、意味のない単語は利用しないようにしたいです。
ということで、品詞を「名詞」「動詞」「形容詞」に限定しました。調べていると、名詞のみに限定して作成している例も多くありましたが、今回は感情の表現や行動に関するコメントなども拾いたいため動詞と形容詞も追加しました。
コードだとこの部分に相当。

    text = ''
    for comment in comments:
        node = mecab.parseToNode(comment)
        while node:
            features = node.feature.split(',')
            pos = features[0]  # 品詞を取得
            base_form = features[6] if len(features) > 6 else node.surface  # 基本形を取得
            if pos in ['名詞', '動詞', '形容詞'] and base_form not in stopwords and base_form != '*':
                text += ' ' + base_form
            node = node.next

このような出力になりました。

先ほどよりは名詞や形容詞が強調され、視聴者の反応が分かりやすくなってきました。

ストップワードを指定

改善されてはきたものの、まだ「。」や「れる」「この」など、特定の動画に限らずどの動画でも多く見られる単語が強調されてしまい邪魔です。
そこで、不要な単語をワードクラウドで利用しないようにする「ストップワード」を指定します。
コードだとこの部分に相当。

# ストップワードの指定
stopwords = set(STOPWORDS).union({'なる', 'いく', 'すぎる', 'くる', 'する', 'の', 'てる', '!', '!', 'くん', '人', 'いる', '、', '?', '?', "さん", 'この', '曲', 'おめでとう', 'ダンス', 'アレンジ', 'おはよう', '聴く', '聞く', '見る', '。', 'ある', 'れる', 'ん'})
# 省略
    # ワードクラウドを生成
    wordcloud = WordCloud(width=800, height=400, font_path=font_path, background_color='white', stopwords=stopwords).generate(text)

これにより、以下の出力になりました。

意味のない単語や汎用的な単語がかなり減ってきて、動画の特徴が掴めるようになってきました。

おわりに

ワードクラウドを作成することで、ある対象への反応をキャッチーに表すことができます。
テキスト分析の手法は他にもあるので、色々試してみたいと思います。

また、この内容はnoteに掲載したこちらの取り組みの中で利用しています。
ご興味のある方はこちらもご覧ください。
https://note.com/yebi_crab/n/n4866e35703cd

GitHubで編集を提案

Discussion