sentiment-monitor
从主流中文平台大规模采集真实舆情数据,逐条分析评论的表达方式和情感倾向,最终生成HTML报告。
前置:确认环境
opencli list -f json | grep -E "weibo|zhihu|bilibili|xiaohongshu|douyin"
以上5个平台必须可用。缺失则告知用户跳过该平台。全部为 cookie 策略,需要Chrome登录 + OpenCLI扩展。
工作流
步骤一:事件建模
与用户确认(缺失则主动询问):
- 事件关键词:1-3个核心搜索词及2-3个变体/别称
- 事件类型(决定使用哪个模板的CSS主题色和专用组件):
product→ 蓝色 · 功能维度组件crisis→ 红色 · 时间线/信源追溯组件campaign→ 橙色 · KOL表格组件person→ 紫色 · 形象雷达/粉黑分列组件competitive→ 绿色 · 双栏对比/VS/偏好矩阵组件
- 时间范围:默认近7天
- 监控实体:涉及的产品/品牌/人名
步骤二:大规模并行采集
目标:总量3000条以上,单平台至少500条。扩展方法:
- 多关键词并行搜索:主词 + 变体同时发出
- 翻页/扩大limit:每个搜索
--limit 50(或该平台允许的最大值) - 高热内容深入:对搜索结果中互动量高的帖子采集评论:
opencli weibo comments "<url>" --limit 100 -f json opencli bilibili comments "<url>" --limit 100 -f json opencli xiaohongshu comments "<url>" --limit 100 -f json - 知乎问题深入:
opencli zhihu question <id> --limit 20 -f json
并行采集:5个平台的搜索命令互不依赖,全部同一批次发出。
详细命令参考:references/platform-guide.md
重要:每条数据保留 url 字段,用于报告中生成超链接。
步骤三:数据清洗与分析
3.1 去重与过滤
- 按
url/id去重 - 过滤空内容、字数<3的无意义内容、纯表情符号
- 标记同一账号刷屏
3.2 LLM逐条分析
对每条评论标注三维标签。详细方法论见 references/analysis-guide.md。
三维标签:
| 维度 | 取值 | 含义 |
|---|---|---|
sentiment |
positive / negative / neutral |
情感极性 |
expression |
literal / ironic / abstract / trolling |
表达方式 |
topics |
字符串数组,如 ["价格","续航"] |
话题归因 |
expression判断标准:
literal— 字面意思即真实态度ironic— 阴阳怪气/反讽,正面措辞+否定语境abstract— 抽象玩梗/网络黑话(如"典""绷""乐""难蚌""yyds")trolling— 反串钓鱼,伪装立场引战
分析Prompt模板:见 references/analysis-guide.md。每批次20-30条,附带上下文。
3.3 聚合统计
- 各情感/表达方式/话题的比例分布
- 按平台拆分的上述指标
- 时间分布(如有时间戳)
- Top N高频关键词
步骤四:构建报告
核心原则:模板只提供CSS样式和ECharts辅助函数,不预设任何内容结构。你根据实际数据和分析结果自行决定报告包含哪些Section、什么顺序、用什么图表。
4.1 选择模板
根据事件类型读取对应HTML模板文件:
product→templates/product.htmlcrisis→templates/crisis.htmlcampaign→templates/campaign.htmlperson→templates/person.htmlcompetitive→templates/competitive.html
4.2 模板中的CSS组件类名参考
以下类名在所有5个模板中均可使用。模板之间的差异仅在于 :root{} 中的CSS变量(--accent、--accent-light、--accent-dark 三色不同),以及各模板有少量的专用组件。
布局容器:
.container— 内容区容器(max-width 1200px 居中).section— 白色卡片容器(圆角+阴影).section-title— section标题(底部带主题色下划线).section-desc— section的描述文字(灰色小字).col-2— 等宽双栏grid布局.divider— 分割线
概览卡片:
.summary-row— 响应式卡片grid(自动换行).summary-card— 单个概览卡片.summary-card .s-label— 卡片标签.summary-card .s-value— 卡片数值(32px粗体).summary-card .s-sub— 卡片补充说明
图表:
.chart-row— 响应式图表grid(双列自动换行).chart-box— 图表容器(380px高).chart-full— 通栏图表容器(420px高,跨所有列)- 每个图表需要一个唯一
id,用initChart('id', option)初始化
评论展示:
.comment-list— 评论列表容器(flex column,16px间距).comment-item— 单条评论卡片.comment-header— 评论头部(作者+平台+互动数据).comment-author— 作者名.comment-stats— 互动数据(点赞/回复数).comment-text— 评论正文.comment-tags— 标签行(flex wrap).comment-link— 查看原文链接(<a>标签,target="_blank")
平台徽标:
.platform-badge+.weibo/.zhihu/.bilibili/.xiaohongshu/.douyin
标签:
.tag+.positive/.negative/.neutral(情感).tag+.literal/.ironic/.abstract/.trolling(表达方式).tag+.topic(话题归因)
策略建议:
.strategy-box— 带左边框的强调框.strategy-box ul/.strategy-box ol/.strategy-box li
通用:
.data-table— 通用数据表格(带hover高亮).callout+.info/.warn/.success— 提示框.text-accent/.text-positive/.text-negative/.text-secondary— 文字颜色.text-sm/.text-lg/.text-xl/.text-bold— 文字大小/粗细.muted— 灰色文字
模板专用组件:
| 模板 | 专用CSS类 |
|---|---|
| product | .feature-grid .feature-card .feature-bar .f-pos .f-neg .f-stats |
| crisis | .alert-bar .crisis-level .timeline .timeline-item .timeline-item.key .timeline-time .timeline-title .timeline-desc .source-tree .source-node .phase-row .phase-dot.active|past|future .comment-item.urgent |
| campaign | .kol-table |
| person | .person-profile .p-meta .p-name .p-desc .fb-split .fb-card.fans|black|mid .fb-label .fb-value .fb-sub .timeline .timeline-item .timeline-item.key .timeline-time .timeline-title .timeline-desc |
| competitive | .vs-header .vs-entity.a|b .vs-divider .e-name .e-vol .compare-grid .compare-card.a|b .matrix-table .matrix-win-a|b|tie .comment-item.entity-a|b .tag.entity-a|b .text-entity-a|b |
4.3 构建流程
- 读取选定的模板HTML文件
- 修改
<title>标签 - 修改
<header>中的标题、日期、事件徽标 - 在
<div class="container">的注释标记区域内,从零构建报告内容HTML - 在
<script>标签底部,用initChart()初始化每个图表 - 写入文件:
report-{事件简称}-{日期}.html
报告结构和内容完全由你根据数据决定。你可以自由组合CSS类名构建任何布局,填充任何你从数据中分析得出的内容。
4.4 评论展示规范
每条展示的评论必须包含:
- 平台徽标(如
<span class="platform-badge weibo">微博</span>) - 脱敏作者名(首字++尾字,如"张三")
- 评论文本(保留原文包括emoji)
- 分析标签:情感标签 + 表达方式标签 + 话题标签
- 可点击超链接跳转原文:
<a class="comment-link" href="原始url" target="_blank">查看原文 →</a> - 互动数据(如有):点赞数、回复数
4.5 ECharts使用
// initChart 已在模板中全局注册,接收 (domId, echartsOption)
initChart('chart-my-pie', {
tooltip: { trigger: 'item' },
series: [{ type: 'pie', data: [...] }]
});
// 图表会自动响应窗口resize
图表类型建议(根据数据自行选择):
- 情感分布 → 饼图/环形图
- 时间趋势 → 折线图(smooth: true)
- 平台/话题对比 → 柱状图(bar)
- 多维对比 → 雷达图(radar)
- 关系/矩阵 → 热力图(heatmap)
- KOL效果 → 散点图(scatter)
步骤五:输出
- HTML写入
report-{事件简称}-{日期}.html - 告知用户文件路径
- 口述关键发现(3-5句话摘要)
参考文件
| 文件 | 何时阅读 |
|---|---|
references/platform-guide.md |
步骤二开始采集前 |
references/analysis-guide.md |
步骤三开始分析评论前 |
templates/product.html |
事件类型为product时 |
templates/crisis.html |
事件类型为crisis时 |
templates/campaign.html |
事件类型为campaign时 |
templates/person.html |
事件类型为person时 |
templates/competitive.html |
事件类型为competitive时 |
注意事项
- 不要硬编码平台命令列表,用
opencli list -f json确认 - 并行采集优先,不同平台的搜索互不依赖
- 评论分析是核心价值,不要只做统计
- 超链接必须有效,可点击跳转原文
- 作者名做脱敏处理
- 不确定某评论是否反串时,标注为
ironic(保守标注) - 采集量不足时不编造数据,诚实告知用户并给出原因