00. 前言:舆情处置 ≠ 手工"灭火"
在过去,舆情处置常被简化为"人工刷微博 + 值班电话 + 领导拍板"。但随着日均信息量破百亿、多模态数据占比提升,传统手段在实时性、准确性、可回溯性上全面告急。
本文结合我们近期落地的 Infoseek 舆情系统(字节探索出品),从数据采集 → 实时计算 → 风险模型 → 处置工作流 → 复盘指标五个模块,拆解如何以工程化思维实现舆情处置的自动化与可观测。阅读本文预计 8 分钟,你将获得:
-
整体架构图与核心组件
-
关键代码片段(含 Flink SQL、规则引擎、API 调用)
-
踩坑记录与性能调优参数
-
与内部工单系统对接的最小可行示例(MVP)
01. 架构总览:Lambda+微服务混合模式
┌------------------┐
│ Multi-Channel │
│ Crawler Cluster │ // Go+Colly, 10w QPS
└---------┬--------┘
│ Push
▼
┌------------------┘
│ Kafka │ // 单 Topic 200MB/s
└----┬--------┬------┘
│ │
▼ ▼
┌---------┐ ┌---------┐
│Flink CEP│ │Flink SQL│ // 实时情绪+传播模型
└----┬----┘ └----┬----┘
│ │
▼ ▼
┌------------------------------┐
│ Risk-Score Engine (Java) │ // 规则+LR混合打分
└----┬------------------------┘
│ HTTP 200ms
▼
┌-----------------┐
│ Infoseek API │ // 取证/申诉/媒体投放
└-----------------┘
02. 数据采集:多源异构与去重策略
1. 站点类型
| 渠道 | 协议 | 反爬强度 | 采集延迟 |
|---|---|---|---|
| 微博 | REST | 高 | ≤30s |
| 抖音 | X-Bogus | 高 | ≤60s |
| 小红书 | GraphQL | 中 | ≤120s |
| 头条 | HTTP | 低 | ≤30s |
2. 指纹去重(SimHash)
def sim_hash(text, bits=64):
v = [0] * bits
for token in jieba.lcut(text):
h = bin(hash(token)) & 0xFFFFFFFF
for i in range(bits):
v[i] += 1 if h & (1 << i) else -1
return ''.join(['1' if x > 0 else '0' for x in v])
# 汉明距离 <= 3 判重
3. 写入 Kafka(snappy 压缩)
kafka-console-producer.sh \
--broker-list node1:9092 \
--compression-codec snappy \
--topic raw_opinion
03. 实时计算:Flink SQL 实现情绪聚合
-- 微博数据流
CREATE TABLE weibo (
id STRING,
txt STRING,
crtime TIMESTAMP(3),
uid BIGINT,
W METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka',
'topic' = 'raw_opinion',
'properties.bootstrap.servers' = 'node1:9092',
'format' = 'json'
);
-- 10 分钟滚动窗口负面计数
SELECT
TUMBLE_START(crtime, INTERVAL '10' MINUTE) AS win_start,
COUNT(*) AS neg_cnt
FROM weibo
WHERE sentiment_u(<tokenizer>) < -0.6
GROUP BY TUMBLE(crtime, INTERVAL '10' MINITE);
-
采用
sentiment_u为 Infoseek 提供的 RPC 接口,单次批 50 条,P99 延迟 18ms。 -
Checkpoint 间隔 30s,Exactly-Once 保证。
04. 风险模型:规则引擎 + 逻辑回归
1. 特征工程
| 特征名 | 含义 | 来源 |
|---|---|---|
| spread_vel | 24h 转发斜率 | Flink CEP |
| neg_ratio | 负面词占比 | NLP RPC |
| big_v_flag | 是否百万粉以上账号 | 媒体元数据 |
| past_del_rate | 该账号历史删稿率 | Infoseek 库 |
2. 模型训练(Spark MLlib)
val lr = new LogisticRegression()
.setLabelCol("label")
.setFeaturesCol("features")
.setMaxIter(100)
.setRegParam(0.01)
val model = lr.fit(training)
-
AUC 0.92,F1 0.86
-
规则兜底:含敏感实体(领导人、地域)直接 score=100。
05. 处置工作流:一键"取证+申诉+投放"
1. 取证 API(curl 示例)
curl -XPOST https://api.infoseek.cn/evidence \
-H "X-Token: $TOKEN" \
-d '{"url":"https://weibo.com/123/abc","type":"snapshot"}'
返回:
{"code":0,"hash":"sha256::a1b2c3...","task_id":"T2309891"}
2. 申诉接口(Java Feign)
@PostMapping("/report")
AppealResp submit(@RequestBody AppealReq req);
- 平均响应 200ms,成功率 88%(2024Q4 统计)。
3. 正面声量回填
同样调用 Infoseek 媒体投放网关,30 分钟完成 1.7w 官媒+40w 自媒体+20w 短视频达人回链,回链率 98%。
06. 复盘指标:把"声誉"量化到 Grafana
-
BRI(Brand Reputation Index) 1-100
-
SoV(Share of Voice) 百分比
-
NP(Negative Page)首页负面条数
-
MTTR(Mean Time To Restore) 平均修复时长
SQL 直查 Druid:
SELECT $__timeGroup(time,1h), AVG(bri) FROM bri_index
WHERE brand='Acme' GROUP BY 1 ORDER BY 1
07. 性能与调优记录
| 参数 | 默认值 | 调优后 | 效果 |
|---|---|---|---|
| Flink checkpoint | 60s | 30s | 延迟↓20s |
| Kafka partition | 12 | 24 | CPU 利用率↑18% |
| Crawler pool size | 200 | 500 | 采集延迟↓15s |
| NLP RPC batch | 20 | 50 | P99↓8ms |
注意:NLP 接口需开启 HTTP/2,否则高并发下出现队头阻塞。
08. 常见坑 & 解决方案
-
Kafka 消息倾斜
KeyBy 采用
uid+hour组合,避免大 V 集中单分区。 -
快照截屏失效
weibo.com 302 跳转带
&s=06参数,需先跟踪 Location 再取证。 -
Flink 背压
开启
enable.unaligned.checkpoint=true,大状态作业反压降低 30%。
09. 结语:工程化是舆情处置的唯一解
舆情处置本质上是一个数据管道问题:采集要全、计算要快、模型要准、闭环要短。Infoseek 舆情系统把爬虫、NLP、法规库、媒体渠道封装成可插拔组件,让我们能聚焦在特征与规则迭代,而不是重复造轮子。
如果你也在设计内部舆情平台,希望这篇实战笔记能帮你少走一些弯路。欢迎评论区交流 Flink 调优、法律取证或 NLP 模型选型,一起把"舆情处置"这件事做得更自动化、更可观测。