LoginSignup
3
3

More than 3 years have passed since last update.

【チョコプラ】悪い顔選手権のコメント欄から被害届を抽出する

Last updated at Posted at 2020-11-18

はじめに

まずはこちらをご覧ください。
【企画】悪い顔選手権
https://www.youtube.com/watch?v=IEkLSfs1F68

動作環境

  • Python 3.6.8
  • YouTube Data API ※使用前に登録が必要。

実装内容

  • コメント取得

    • Youtube Data APIを使用してコメントとそれに対するリプライコメントを取得する。
    • コメント以外の情報(コメントした人のID等)は取得しない。
  • 被害届の判定条件

    • 「長田①」「松尾2」のように、名前+数字(1~3)が入っている。
    • 「~された」のように受動態になっている。
    • ただし目撃情報も含みたいので「~いた」も含む。

ソースコード

get_youtube_comments.py
import json
import re

import pandas as pd
import requests

API_KEY = '自分のAPIキーを入力する'
VIDEO_ID = 'IEkLSfs1F68'


def get_comment_info(api_key, video_id, page_token):
    comment_url = 'https://www.googleapis.com/youtube/v3/commentThreads'
    param = {
        'key': api_key,
        'videoId': video_id,
        'part': 'replies, snippet',
        'maxResults': '100',
    }

    if page_token:
        param['pageToken'] = page_token

    response = requests.get(comment_url, params=param)
    return response.json()


def get_video_comments(api_key, video_id):
    comments = []
    page_token = ''

    while page_token != None:
        resource = get_comment_info(api_key, video_id, page_token)

        for comment_thread in resource['items']:
            # コメント取得
            comment = comment_thread['snippet']['topLevelComment']['snippet']['textDisplay']
            comments.append(comment)

            if ('replies' in comment_thread) and ('comments' in comment_thread['replies']):
                for replies in comment_thread['replies']['comments']:
                    # コメント取得
                    reply_comment = replies['snippet']['textDisplay']
                    comments.append(reply_comment)

        if 'nextPageToken' in resource:
            page_token = resource['nextPageToken']
        else:
            page_token = None
    return comments


# コメントのリストを取得
comments = get_video_comments(API_KEY, VIDEO_ID)
# 改行タグの削除
comments = list(map(lambda x: re.sub('<br />', '', x), comments))


target_list = []
report_comment_list = []

for comment in comments:
    target = re.findall('[長田|松尾]+[1-31-3①②③]', comment)
    # 複数ある場合はユニーク値だけ取り出す
    target = list(set(target))

    passive_words = re.findall('(れた|れました|いた|いました)', comment)

    if len(target) > 0 and len(passive_words) > 0:
        # 1コメントにtargetが複数ある場合はtargetごとにリストに追加する
        for t in target:
            target_list.append(t)
            report_comment_list.append(comment)

df = pd.DataFrame({'target': target_list, 'comment': report_comment_list})

# ランダムに数件表示
df.sample(5, random_state=42)

実行結果

print(df.shape)
->(178, 2)

のべ178件の被害届が出されているようです。

    target  comment
19  松尾②   あまりにも執拗に追いかけてくるので本当に恐怖でした。後ろに幼い子どもも乗せていたので、気が気...
45  長田①   長田①にパーカー盗まれた。
24  長田③   長田③なお、以前から「神が私と手を取った」と近隣住民に対して話回っていたという情報が多数入っ...
30  松尾②   松尾②に、蟹96匹盗まれました。
67  松尾①   松尾①と長田②と松尾③にオレオレ詐欺されました。

No.24が気になりますね。

まとめ

チョコプラはいいぞ~

参考リンク

参考にさせていただきました。ありがとうございました。
【Python】Youtube Data Apiを使ってコメントを全取得する
YouTube Data APIでコメントとチャンネル登録者を取得する
チョコレートプラネットチャンネル

3
3
0

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
3
3