3路 → 35路,5个分组 → 10个分组,今天的数据管道经历了一次撑大手术。
之前的暗器只有3路数据源,覆盖5个分组。跑了几轮之后,特征提取的覆盖率明显不够——很多行业的数据在管道的盲区里。信号散布太稀疏,评分有偏。
扩容目标:10倍数据源,覆盖6国市场,10个行业分组。
v1的架构很简单:采集 → 打分 → 输出。一个玩具,不是引擎。
v2的设计:
数据源 (35路RSS: 中国/香港/美国/日本/韩国/德国)
↓
采集器 (每30分钟定时启动)
↓
去重器 (标题MD5 + URL哈希 → SQLite缓存)
↓
解析器 (多语种NLP: 中/英/日/韩摘要是分开写的)
↓
特征提取 (情感倾向/正负面/热词/趋势拐点)
↓
聚合器 (10分组 × 6市场 → 每个分组一个信号向量)
↓
评分输出 (0-100: 分数越高=特征越明显)
35路数据源,每轮采集455篇文章。如果不做去重,同一个热点事件会被10个源重复报道,出现在特征提取里就变成10次信号,导致评分虚高。
我的去重策略:
seen = set()
for article in raw_articles:
key = hashlib.md5((article.title + article.url).encode()).hexdigest()
if key in seen:
continue
seen.add(key)
pipeline.process(article)
然后我踩了一个坑:同一个事件,华尔街日报和路透社的标题完全不同(比如 "Nvidia Surges" vs "Chipmaker Rebounds"),MD5不会去重。于是加了第二层:
# 语义去重:标题翻译后simhash距离 < 0.3 视为重复
if any(simhash(article.title, seen_title) < 0.3 for seen_title in seen_titles):
continue
这一层砍掉了约25%的重复内容,特征纯净度提升明显。
35路不是乱加的。我列了一个选择矩阵:
| 要求 | 权重 | 说明 |
|---|---|---|
| 专业度 | 30% | 是该行业的老牌媒体/官方渠道 |
| 时效性 | 25% | 更新频率不低于每天一次 |
| 语种 | 20% | 最好是本地语种(日经就该是日文的) |
| 差异化 | 15% | 尽量不重复覆盖同一领域的同一视角 |
| 稳定性 | 10% | RSS地址不能三天两头换 |
最终分布:中文15路、英文12路、日文5路、韩文3路。日韩的数据源虽然少,但专门覆盖了当地独有的行业动态。
扩容后我把引擎命名统一了:
两套引擎独立运行、互相比对。当一个引擎对某个分组发出评分时,另一个引擎可以作为验证参考。
扩容到35路后,特征提取的稳定性明显改善了。之前3路时,信号波动很大——一个负面报道可能因为采集时间差异被漏掉。35路时,同一个事件的覆盖密度足够高,漏检概率从约15%降到了约2%。
数据管道的多样性本身就是特征提取的稳定器。
$ python3 2560_darkblade.py --scan
[1/10] 分组A: 18篇 → 评分 20 ⚪
[2/10] 分组B: 42篇 → 评分 45 ⚡
[3/10] 分组C: 13篇 → 评分 15 ⚪
[4/10] 分组D: 56篇 → 评分 78 🔥 ← 这个分组有情况
[5/10] 分组E: 22篇 → 评分 32 ⚪
...共10分组, 35路数据源, 完成+√
$
第4个分组评分78——数据源一多,真正的热点会自己浮出水面。
系统说明:本文记录数据采集系统的架构升级,不构成任何决策参考。
💬 留言