analyzing-twitter-sentiment-for-topic について
話題に関するツイートを収集し、感情やテーマ、時間ごとの投稿量を分析するスキルです。Apifyを使った収集からレポート作成までの手順を示します。
主な機能
- 01検索クエリによるツイート収集
- 02ツイートごとの感情分類
- 03肯定・否定テーマの抽出
- 04エンゲージメントを加味した集計
- 05感情分析レポートの作成
活用シーン
- 01ブランドや話題への反応の追跡
- 02肯定・否定的な議論のテーマ比較
- 03期間を指定した感情の確認
MCP 対応
Apify MCPサーバーを使ってtweet-scraper Actorを実行できます。コマンドラインとREST APIによる方法も記載されています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ apidojo-io/ apidojo-skills --skill analyzing-twitter-sentiment-for-topicインストール後、Claude Code で/analyzing-twitter-sentiment-for-topicを入力して読み込まれたか確認します。
詳細
トピックのTwitterセンチメント分析
任意のトピックやキーワードに関するツイートのサンプルを収集し、データセット全体のセンチメントを分析します。優勢な感情の傾向、ポジティブ/ネガティブなセンチメントの要因となる主なテーマ、時間の経過に伴う投稿数のパターンを特定します。
前提条件
APIFY_TOKEN環境変数が設定されていること- 任意:Apify MCP サーバーがインストールされていること
入力
| パラメーター | 型 | 必須 | デフォルト | 備考 |
|---|---|---|---|---|
searchTerms | 配列 | ✅ | [] | Twitter の高度な検索クエリ(例:["#AI lang:en", "from:NASA"]) |
sort | 文字列 | 任意 | Top | 並べ替え順:Latest、Top、Latest+Top |
tweetLanguage | 文字列 | 任意 | — | ISO 639-1 言語コード(例:en) |
maxItems | 数値 | 任意 | 無制限 | 返すツイートの最大数 |
onlyVerifiedUsers | 真偽値 | 任意 | false | 認証済みユーザーのツイートのみ |
onlyTwitterBlue | 真偽値 | 任意 | false | Twitter Blue の登録者のみ |
onlyImage | 真偽値 | 任意 | false | 画像付きのツイートのみ |
onlyVideo | 真偽値 | 任意 | false | 動画付きのツイートのみ |
onlyQuote | 真偽値 | 任意 | false | 引用ツイートのみ |
author | 文字列 | 任意 | — | 特定の投稿者ハンドルに絞り込む |
inReplyTo | 文字列 | 任意 | — | 特定のハンドルへの返信ツイート |
mentioning | 文字列 | 任意 | — | 特定のハンドルに言及するツイート |
geotaggedNear | 文字列 | 任意 | — | 特定の場所周辺のツイート |
withinRadius | 文字列 | 任意 | — | geotaggedNear の周囲の半径 |
geocode | 文字列 | 任意 | — | 緯度/経度+半径の文字列 |
placeObjectId | 文字列 | 任意 | — | 場所がタグ付けされたツイート |
minimumRetweets | 数値 | 任意 | — | リツイートの最小数 |
minimumFavorites | 数値 | 任意 | — | いいねの最小数 |
minimumReplies | 数値 | 任意 | — | 返信の最小数 |
start | 文字列 | 任意 | — | この日付以降のツイート(YYYY-MM-DD) |
end | 文字列 | 任意 | — | この日付以前のツイート(YYYY-MM-DD) |
includeSearchTerms | 真偽値 | 任意 | false | 各ツイートに一致した検索語を追加する |
customMapFunction | 文字列 | 任意 | — | 各出力オブジェクトを変換する JavaScript 関数 |
ワークフロー
Progress:
- [ ] Step 1: Define topic and sentiment scope
- [ ] Step 2: Collect tweets via search
- [ ] Step 3: Classify sentiment per tweet
- [ ] Step 4: Identify themes per sentiment bucket
- [ ] Step 5: Deliver sentiment report
ステップ 1:パラメーターの確認
ユーザーに次の情報を尋ねます:
- 分析するトピック、キーワード、またはブランド
- 日付範囲(デフォルト:過去7日間 — Twitter のセンチメントデータは急速に古くなります)
- 言語(デフォルト:英語)
- サンプルサイズ(デフォルト:500件のツイート — 信頼できる分布を得るのに十分です)
- リツイートを除外しますか?(デフォルト:はい — 重複する意見のシグナルを減らします)
- 比較対象のトピック(任意 — センチメントを並べて比較する場合)
ステップ 2:ツイートの収集
推奨 — run_actor.js(待機、出力、ファイル保存を自動で処理します):
# Quick answer (prints table to chat)
node scripts/run_actor.js \
--actor "apidojo~tweet-scraper" \
--input '{"param": "value"}'
# Save as CSV
node scripts/run_actor.js \
--actor "apidojo~tweet-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.csv --format csv
# Save as JSON
node scripts/run_actor.js \
--actor "apidojo~tweet-scraper" \
--input '{"param": "value"}' \
--output YYYY-MM-DD_results.json --format json
APIFY_TOKENは環境変数または.envファイルに設定する必要があります。
Apify MCP が利用可能な場合:
Tool: apify:run-actor
Actor: "apidojo~tweet-scraper"
Input:
{
"searchTerms": ["[TOPIC_KEYWORD]"],
"maxItems": 500,
"tweetLanguage": "en",
"since": "[YYYY-MM-DD]",
"until": "[YYYY-MM-DD]"
}
REST API を使用する場合:
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchTerms": ["[TOPIC_KEYWORD]"],
"maxItems": 500,
"tweetLanguage": "en",
"since": "[YYYY-MM-DD]"
}'
ステップ 3:センチメントの分類
各ツイートの text を対象に、語彙的なシグナルを使って Positive、Negative、Neutral に分類します。
ポジティブな指標: love、great、amazing、perfect、best、win、excited、congrats、excellent、recommend、beautiful、proud、happy、thank、awesome、incredible ネガティブな指標: hate、awful、worst、terrible、broken、scam、disappointed、angry、frustrated、disgusted、avoid、never again、shame、sad、fail、wrong、bad 強いネガティブ表現: "can't believe"、"what a joke"、"are you serious"、"wtf"、"this is ridiculous" デフォルトの中立判定: 上記以外
判断が難しい場合は、絵文字のシグナルを使います:
- 😍🥰❤️🙌👏✨🔥 → ポジティブ寄り
- 😡🤬😤💀🗑️🤢👎 → ネガティブ寄り
- 🤔😐🤷 → 中立寄り
エンゲージメントに応じてツイートに重み付けします。いいねが1,000件のツイートは、いいねが0件のツイートよりも強いシグナルとなります。
ステップ 4:テーマの抽出
ネガティブなツイートの場合:繰り返し登場する名詞やテーマの上位 3~5 個を特定します。具体的に何に不満を感じているのでしょうか? ポジティブなツイートの場合:繰り返し登場する称賛のテーマの上位 3~5 個を特定します。
繰り返し登場する人名、場所、製品などの固有名詞や、具体的なイベント、機能名を探します。
ステップ 5:レポートの形式
出力形式
# Twitter Sentiment Analysis: "[TOPIC]"
Period: [DATE_RANGE] | Tweets analyzed: [N] | Date: [DATE]
## Overall Sentiment
████████████░░░░░░░░ ポジティブ:[X%]([N] 件のツイート) ████░░░░░░░░░░░░░░░░ ネガティブ:[X%]([N] 件のツイート) ██████████░░░░░░░░░░ 中立:[X%]([N] 件のツイート)
Weighted by engagement:
- Positive sentiment accounts for [X%] of total likes/RTs
- Negative sentiment accounts for [X%] of total likes/RTs
**Overall verdict:** [Mostly Positive / Mixed / Mostly Negative / Polarized]
## Top Negative Themes
1. "[Theme]" — [N] tweets, [N] total likes
Example: "@[handle]: [tweet excerpt]"
2. "[Theme]" — [N] tweets
3. "[Theme]" — [N] tweets
## Top Positive Themes
1. "[Theme]" — [N] tweets, [N] total likes
Example: "@[handle]: [tweet excerpt]"
2. "[Theme]" — [N] tweets
## Most Engaged Tweets
🔴 Most-liked negative: @[handle] ([N] likes): "[excerpt]"
🟢 Most-liked positive: @[handle] ([N] likes): "[excerpt]"
## Volume Over Time
[Day 1]: [N] tweets | [Day 2]: [N] tweets | [Day 3]: [N] tweets
## Notable Spikes
[Date with highest volume] — [N] tweets | Likely cause: [describe if detectable from tweet context]
トラブルシューティング
**感情分析が不正確に感じられる:**語彙分析では皮肉を見落とします。重大な判断を行う場合は、各分類の上位 20 件のツイートを手動で確認してください。 **トピックの範囲が広すぎる:**検索語を絞り込みます。「Apple」ではテクノロジーと食品が検索されるため、代わりに「Apple iPhone」を使用してください。 **ツイート数が非常に少ない:**現在、Twitter でそのトピックがあまり話題になっていない可能性があります。日付範囲を広げてください。