

# Redditの返信が何について述べているかを確認する方法

Redditの返信は、返信元の文脈を読み、具体的な対象を特定してから、対象ごとに態度を分けてラベル付けします。これにより、コミュニティの議論から品質の整った感情分析用データセットを作れます。この方法では、モデルを検証する前にRedditのコメントを準備する手順を説明します。

## データ収集の設定

生データの取得には、Actorと呼ばれるホスティング型のデータ収集プログラムを使います。Reddit Commentsスクレイパーで公開スレッドを取得できます。タスクのプリセットを変更し、既知のスレッドURLを1つ指定してください。投稿ごとのコメント数の上限は1〜500で設定し、デフォルト値は100です。この初回タスクでは、上限を3行にしてください。入力のpostUrlsには、既知の公開スレッドを1〜50件指定する必要があります。maxCommentsPerPostは投稿ごとに1〜500で指定でき、試行ではプリセット値の250を3に変更します。

各コメント行のフィールド名は、正確にはpostId、commentId、parentId、depth、body、status、unavailableFields、observedAtです。空白で区切った別名に置き換えず、正確な名前を保持してください。データセットのstatusはok、deleted、removedのいずれかだけです。実行や入力の状態が一部完了または失敗であることは、行のstatusとは別です。

実行の出力データには、commentsSaved、duplicatesSkipped、hiddenBranchesRemaining、completionReason、status、isComplete、inputResultsが含まれます。入力ごとのフィールドには、commentsFound、commentsSaved、status、reasonが含まれます。現在の試行で本文が存在する3件のIDは、parentIdとdepthがnullで、hiddenBranchesRemainingもnullです。また、処理フラグがisComplete=trueでも、全体または入力ごとの結果はpartialです。これは、文脈がすべてそろっている証拠でも、分類器の品質を示す証拠でもありません。対応する返信元が必要な場合は、許可された範囲で公開情報を手動確認するか、文脈を不明のままにしてください。隣接する行を返信元だと推測してはいけません。

## 対象とラベルの定義

本文を読む前に、対象の集合とラベル付けの単位を定義してください。ここでの1単位は、コメントと対象の組み合わせです。コメント1件や人1人を単位にはしません。次の5つのラベルを、わかりやすいルールで定めます。

- 肯定的：支持や好意を示している。
- 否定的：不支持や不満を示している。
- 中立：態度を示さず、事実を述べている。
- 混在：肯定的な見方と否定的な見方の両方を示している。
- 不確実：対象または態度が明確でない。

対象とは、その文章が言及している具体的な人物、製品、方針、行動です。

## コメントを分析する8つの手順

1. 読む前に、調査の問い、対象の集合、ラベル付けの単位を定義します。
2. ソースの行と出力データを保存します。コメントの識別情報、本文、状態、欠損データを保持してください。元のフィールドに推測した感情を書き込まず、作業用のラベル表を作ります。
3. 対応する返信元を確認できる場合は、その文脈を読みます。対象を明示した表現と代名詞を探してください。代名詞が何を指すかを確実に判断できない場合は、対象と文脈を不確実のままにします。皮肉は見直しが必要な理由として扱い、自動的に否定的なラベルを付けないでください。
4. 複数の対象に言及する文を分けます。1件のコメントが、速度を評価する一方で料金変更に不満を示すこともあります。すべてに共通する好みを割り当てないでください。
5. コメントID、対象、根拠となる箇所、文脈の参照元、ラベル、理由を保存します。他者からの引用と、投稿者自身の態度を分けてください。文脈を確認せずに、質問を苦情と分類してはいけません。
6. [共通の小規模な部分集合を、2人目の読者にも分類してもらいます](/ja/articles/reddit%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88-%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E9%96%93%E3%81%AE%E4%B8%80%E8%87%B4%E5%BA%A6%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95/)。単純一致率を記録し、どのルールで判断が分かれたかを書き留めてください。妥当性を説明できる参照基準がなければ、高精度だと主張してはいけません。ルールを改善し、影響する事例のラベルを付け直します。
7. コメントと対象の組み合わせの件数と、重複を除いたコメントIDの件数を分けて報告します。複数の対象を含むコメントでは、コメント数よりラベル行数が多くなります。不確実なラベルと取得できない本文は、判定できたものを数える分母から除外し、別途確認できるように残してください。
8. 対象別の態度を示す表、分類基準をまとめたコードブック、判断の不一致に関するメモを成果物にします。これにより、内容を点検できるデータセットが整います。このデータセットから、製品開発の優先順位、代表性のある意見、自動返信の実行内容が得られるわけではありません。

この例の文章とIDはすべて架空です。返信元の文脈Pでは、製品Aの新しい月額料金と、製品Bの利用開始時の使い方の習得について質問しているとします。

| commentID | 対応する文脈の参照元 | 対象 | ソースの該当箇所の正確な引用 | ラベル | 理由 |
| --- | --- | --- | --- | --- | --- |
| C1 | 文脈P | 製品A | 「Aは今でも気に入っている」 | 肯定的 | 製品Aへの肯定的な態度を示している |
| C1 | 文脈P | 料金変更（A） | 「新しい料金はよくない」 | 否定的 | 料金変更への否定的な態度を示している |
| C2 | 文脈P | 利用開始時の使い方の習得（B） | 「Bは使い方を覚えやすかった」 | 肯定的 | 利用開始時に使い方を習得しやすい点を評価している |
| C2 | 文脈P | 速度（A） | 「私たちのチームではAの方が速かった」 | 肯定的 | 自分たちのチームという条件付きで速度を評価している |
| C3 | 文脈P（確認済み） | 値上げ | 「すばらしいね、また値上げか」 | 否定的 | 返信元Pから、皮肉を込めた不満だと確認できる |
| C4 | 不明 | 不明 | 「それはオフラインで使えますか？」 | 不確実 | 返信元の文脈がないため、対象を特定できない |

C5は本文の状態がremovedであるため、感情の表には含めません。感情ラベルを付けず、本文の取得可否を示す記録として別に残します。

## 架空の具体例を順に分析する

コメントC1は「Aは今でも気に入っているけれど、新しい料金はよくない」と述べています。これは2単位になります。製品Aについては肯定的です。Aの料金変更については否定的です。製品A全体に、ひとまとめの否定的な態度を割り当てないでください。

コメントC2は「Bは使い方を覚えやすかった。私たちのチームではAの方が速かった」と述べています。Bの利用開始時の使い方の習得については肯定的、Aの速度についても肯定的ですが、後者には自分たちのチームという条件があります。総合的にどちらが優れているかは述べていません。

コメントC3は「すばらしいね、また値上げか」と述べています。この対象である料金変更を数えるのは、返信元の文脈Pを確認できた場合だけです。手動で確認してから、否定的または皮肉のラベルを付けます。確認できなければ、不確実のままにしてください。

コメントC4は「それはオフラインで使えますか？」と述べています。返信元の文脈がないため、代名詞が何を指すかわかりません。対象が不明なので、不確実とラベル付けします。質問を、オフライン利用に関する否定的な意見に変えてはいけません。

コメントC5は本文が削除されているため、分析しません。表には[本文の取得可否と元の位置を示す記録を残してください](/ja/articles/reddit-%E3%83%A2%E3%83%87%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E7%A0%94%E7%A9%B6-%E6%AC%A0%E6%90%8D%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E8%A8%98%E9%8C%B2/)。

C3の返信元を確認できた場合、ラベル表には、本文を取得できる4件のコメントから6件のコメントと対象の組み合わせが入ります。内訳は、C1が2件、C2が2件、C3が1件、C4が1件です。

判定できた単位は合計5件です。肯定的なのは、C1のA、C2のB、C2のAの3件です。否定的なのは、C1の料金とC3の料金の2件です。C4の1件は不確実です。

肯定的な割合は3を5で割った60%で、判定できた対象単位だけを分母とした値です。コメント投稿者やコミュニティの意見の60%という意味ではありません。観測した記録は5件あり、本文を取得できるコメントは4件です。本文が削除されたC5は、感情分析の対象外です。

## 分類の一致度と限界

架空の分類担当者2人が、判定できた5単位にラベルを付けます。初回の判断は5件中4件で一致し、一致率は80%です。C3で判断が分かれたのは、皮肉と文脈に関する点です。2人は実際の返信元の条件を確認し、ルールに合意します。これによって、一般的な精度が80%だと証明されるわけではありません。C3の返信元が欠けている場合は、不確実のままにする必要があります。判定できた単位の分母は4に減ります。隣接する行を根拠に、返信元を確認できたことにしてはいけません。

最終成果物には、ソースの参照先と各対象を個別に示し、C4とC5は不明・取得不可の記録表に残します。話題の出現頻度や機能の優先順位の表は提供しません。実際の議論にも、同様のコミュニティのパターンが見られます。背景をさらに知るには、[実際の感情分析プロジェクトに関する議論](https://www.reddit.com/r/webscraping/comments/15x92f1/how_do_i_scrape_comments_from_reddit_posts/)を確認できます。

## 次に行うこと

[Reddit Comments Scraper Actor](https://apify.com/chronometrica/reddit-comments-scraper)を使う[Reddit Comment Sentiment Analysis Dataset Task](https://apify.com/chronometrica/reddit-comments-scraper/examples/reddit-comment-sentiment-dataset)を開き、既知の小規模なスレッドを指定してください。文脈が不明なものは不明のまま保持し、感情分析モデルを検証する前に、コメントと対象の組み合わせごとに分類します。

## 出典と参考資料

- [Reddit Comments Scraper Actor](https://apify.com/chronometrica/reddit-comments-scraper)
- [Reddit Comment Sentiment Analysis Dataset Task](https://apify.com/chronometrica/reddit-comments-scraper/examples/reddit-comment-sentiment-dataset)
- [YouTube字幕抽出ガイド](https://chronometrica.com/ja/articles/youtube-%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97%E3%81%AE%E5%8F%96%E5%BE%97-%E5%AD%97%E5%B9%95%E3%81%AE%E7%A2%BA%E8%AA%8D/)
- [Redditのウェブスクレイピングに関する議論](https://www.reddit.com/r/webscraping/comments/15x92f1/how_do_i_scrape_comments_from_reddit_posts/)