项目缘起

最近一直在思考一个问题:网上吵翻天的时候,大家观点五花八门,但很多人只看到了"说什么",没想清楚"为什么这么说"。

同样一件事,知乎、微博、贴吧、小红书的用户看法可能完全不同。为什么?

  • 立场不同 - 涉及的利益不一样
  • 信息茧房 - 看到的片面信息不同
  • 情绪放大 - 愤怒的声音更容易传播

于是我想做一个工具,帮助穿透表象,从纷繁复杂的观点背后,洞察各方真实的利益诉求。

这就是 OpenFlow 的由来。

核心思路

“看热闹,更要看门道”

OpenFlow 做两件事:

  1. 收集主流观点 - 从多个平台把热门看法抓过来,按支持度排序
  2. 看透利益格局 - 分析这些观点背后,各方到底在争什么、怕什么、想要什么

技术架构

数据采集层

最大的挑战是各平台的反爬机制。直接 HTTP 请求基本都会被封。

解决方案:Playwright 浏览器模拟

# 启动真实浏览器,模拟用户行为
browser = await playwright.chromium.launch(
    headless=False,
    args=['--disable-blink-features=AutomationControlled']
)

# 注入脚本隐藏自动化特征
await page.add_init_script("""
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
""")

目前支持:知乎、微博、贴吧、小红书、百度搜索

观点分析层

不是简单按时间排序,而是:

  1. 向量化 - 用 sentence-transformers 将文本转为向量
  2. 聚类 - 用 DBSCAN 将相似观点聚类
  3. 总结 - 每类观点提取关键词生成概括
  4. 排序 - 按互动量(点赞+评论×2+转发×3)计算支持度
# 观点聚类
embeddings = model.encode(texts)
clustering = DBSCAN(eps=0.4, min_samples=2, metric='cosine')
labels = clustering.fit_predict(embeddings)

# 生成总结
summary = generate_summary(cluster_texts)
support_rate = calculate_support_rate(cluster_contents)

深度分析层

用 AI 进行深度分析,但关键是提示词设计

我尝试让 AI 学习毛选邓选的方法论:

  • 调查研究 - 没有调查就没有发言权
  • 阶级分析 - 各阶层的利益诉求
  • 主要矛盾 - 抓住问题的关键
  • 实事求是 - 从实际出发,不空谈
  • 群众路线 - 理解各方诉求的合理性
  • 发展眼光 - 看趋势,不看一时

这样分析出来的报告更有深度,不是泛泛而谈。

开发过程中的坑

1. 反爬对抗

各平台的反爬策略不断升级:

  • 知乎:需要 Cookie,否则 403
  • 微博:编码问题,需要处理 GBK/UTF-8
  • 小红书:页面加载慢,需要增加等待时间
  • 贴吧:页面结构多变,需要多种选择器备选

解决方案:Playwright + 随机延迟 + 代理池

2. 数据清洗

采集到的内容质量参差不齐:

  • 广告贴
  • 重复内容
  • 过短文本
  • 表情符号过多

需要多层过滤:长度检查、去重、关键词过滤

3. 聚类准确度

一开始直接用 K-Means,效果很差。后来改用 DBSCAN,可以自动识别噪声点,效果更好。

参数调优也很关键:

  • eps=0.4 - 相似度阈值
  • min_samples=2 - 最小样本数
  • 需要针对中文文本优化

4. 总结生成

如何让 AI 生成简洁有力的总结?

尝试了几种方案:

  • 抽取式:直接提取原文句子(太冗长)
  • 生成式:用 LLM 生成(太慢)
  • 关键词组合:提取高频关键词组合成句(最终方案)
# 分词 + 统计词频
words = jieba.cut(all_text)
word_freq = Counter(filtered_words)

# 取 Top 关键词组合
top_words = [w for w, _ in word_freq.most_common(5)]
summary = f"关注{'、'.join(top_words)}等问题"

项目成果

GitHub: https://github.com/ruanchenbin3/openflow

已实现功能

  • ✅ 多平台数据采集
  • ✅ 观点聚类与影响力排序
  • ✅ 利益相关方自动识别
  • ✅ 主流观点总结与代表性链接
  • ✅ AI 深度分析(辩证唯物主义方法论)

输出示例

🔍 分析话题:延迟退休
📊 采集数据:知乎 45 条 | 微博 32 条 | 贴吧 28 条

【主流观点】
1. 反对延迟(支持度 55%)- 担心养老金亏空,体力劳动者吃不消
   利益相关方:体力劳动者、临近退休人员
   代表性链接:[链接1] [链接2]

2. 理解但要求公平(支持度 30%)- 支持改革,但要求体制内同步
   利益相关方:企业职工、灵活就业者
   代表性链接:[链接3]

3. 支持改革(支持度 15%)- 人口老龄化必须应对
   利益相关方:政策制定者、专家学者
   代表性链接:[链接4]

【核心洞察】
各方分歧主要源于:职业性质差异、养老金替代率不均、信息不透明

未来规划

待优化项

  • 提升 Playwright 采集稳定性
  • 优化观点聚类算法准确度
  • 增加更多平台支持(抖音/B站等)
  • 完善用户认证与数据持久化
  • 添加可视化图表展示

可能的扩展方向

  • 做成 OpenClaw Skill,集成到工作流
  • 支持定时监控,自动推送舆情变化
  • 添加情感趋势预测
  • 支持导出各种格式的报告

一些思考

做这个项目最大的收获是:技术只是手段,洞察才是目的

一开始沉迷于各种技术细节:用什么框架、什么算法、什么模型。后来发现,用户真正关心的是:能不能帮我快速理解这个事件的舆论全貌?

所以后来把重点放在:

  1. 准确性 - 观点聚类要准,不能张冠李戴
  2. 可读性 - 总结要简洁有力,不能长篇大论
  3. 可追溯 - 每个观点都要有原文链接,方便验证

技术选型都围绕这三个目标展开。

结语

OpenFlow 是一个业余项目,有时间会继续迭代优化。

如果你也对这个方向感兴趣,欢迎:

  • Star 关注:https://github.com/ruanchenbin3/openflow
  • 提交 Issue 和 PR
  • 提出功能建议

看热闹,更要看门道。 希望这个工具能帮助你更好地理解这个复杂的世界。


本文首发于 阮辰彬的博客