关于 analyzing-twitter-sentiment-for-topic
用于收集特定主题的推文并分析情绪、主题和时间变化的技能,提供基于 Apify 的采集与报告流程。
主要功能
- 01按搜索词采集推文
- 02逐条分类情绪
- 03提取正负面主题
- 04按互动量加权情绪
- 05整理情绪分析报告
适用场景
- 01跟踪品牌或话题反响
- 02比较正负面讨论主题
- 03查看指定时段的情绪
MCP 相关
可通过 Apify MCP 服务运行推文抓取 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 | array | ✅ | [] | Twitter 高级搜索查询(例如 ["#AI lang:en", "from:NASA"]) |
sort | string | 可选 | Top | 排序方式:Latest、Top 或 Latest+Top |
tweetLanguage | string | 可选 | — | ISO 639-1 语言代码(例如 en) |
maxItems | number | 可选 | 不限 | 返回的最大推文数 |
onlyVerifiedUsers | boolean | 可选 | false | 仅包含已认证用户的推文 |
onlyTwitterBlue | boolean | 可选 | false | 仅包含 Twitter Blue 订阅用户的推文 |
onlyImage | boolean | 可选 | false | 仅包含带图片的推文 |
onlyVideo | boolean | 可选 | false | 仅包含带视频的推文 |
onlyQuote | boolean | 可选 | false | 仅包含引用推文 |
author | string | 可选 | — | 筛选特定用户名发布的推文 |
inReplyTo | string | 可选 | — | 筛选回复特定用户名的推文 |
mentioning | string | 可选 | — | 筛选提及特定用户名的推文 |
geotaggedNear | string | 可选 | — | 筛选特定地点附近的推文 |
withinRadius | string | 可选 | — | geotaggedNear 周边的半径 |
geocode | string | 可选 | — | 经纬度 + 半径字符串 |
placeObjectId | string | 可选 | — | 筛选标记了地点的推文 |
minimumRetweets | number | 可选 | — | 最低转推数 |
minimumFavorites | number | 可选 | — | 最低点赞数 |
minimumReplies | number | 可选 | — | 最低回复数 |
start | string | 可选 | — | 此日期之后的推文(YYYY-MM-DD) |
end | string | 可选 | — | 此日期之前的推文(YYYY-MM-DD) |
includeSearchTerms | boolean | 可选 | false | 将匹配的搜索词添加到每条推文中 |
customMapFunction | string | 可选 | — | 用于转换每个输出对象的 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
必须在环境变量或
.env文件中设置APIFY_TOKEN。
如果 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,使用词汇信号将其分类为正面、负面或中性:
正面指标: 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 上可能鲜少有人讨论该主题。请扩大日期范围。