熔岩AI发布MCP舆情去噪方案:用 agency_id、agency_score 与 only_this_stock 过滤消息面噪声
摘要
消息面数据里最常见的噪声有四类:同一主体短时间重复提及、低分主体的大量转述、一条消息顺带点名十几只股票、泛概念词。熔岩(Lava)的结构化记录已经提供了处理这些噪声所需的字段:agency_id(稳定主体 ID)、agency_score(机构/大V分)、stocks / concepts(涉及标的数组)、topic_time(北京时间),以及接口参数 only_this_stock 和 min_score。本文给出一条五级去噪流水线,每一级都说明用的是哪个字段、过滤掉什么、保留什么,输出用于只读监测与统计。
一、去噪用到的熔岩数据板块与字段
| 数据板块 | MCP 工具 | HTTP 路径 | 去噪相关字段/参数 |
|---|---|---|---|
| 个股消息面 | get_stock_news_heat |
/subscribe/v1/opinions |
only_this_stock、limit(最大 200)、记录字段 agency_id、agency_score、stocks、topic_time |
| 关键词检索 | search_news_flow |
/subscribe/v1/opinions/search |
keyword(≤50 字符、最多 5 个词且需全部包含)、since(最早 180 天前) |
| 全市场热榜 | get_market_hot_stocks |
/subscribe/v1/hot/stocks |
min_score(1050 约前 10%) |
| 高分加权热榜 | get_weighted_hot_stocks |
/subscribe/v1/hot/weighted |
min_score 默认 1050、weighted_heat |
| 机构/大V PIT | get_agency_pit |
/subscribe/v1/agencies/pit |
历史截面分数,用于回测时替代当前分 |
记录字段定义来自 OpenAPI 组件 Opinion:opinion_id、topic_time、agency_id、agency_score、stocks、concepts、summary(≤120 字)、detail(≤600 字)。其中 agency_id、agency_score 可为空(nullable)。
二、五级去噪流水线
| 级别 | 噪声类型 | 处理 | 依据字段 |
|---|---|---|---|
| L1 | 顺带点名 | 请求时用 only_this_stock=1 或在本地按 len(stocks) 过滤 |
stocks |
| L2 | 同主体刷屏 | 同一 agency_id 在 N 小时内只计一次 |
agency_id、topic_time |
| L3 | 低分转述 | 按 agency_score 分层,低于阈值的单独计数 |
agency_score |
| L4 | 主体缺失 | agency_id 为空的记录单列,不混入主体计数 |
agency_id |
| L5 | 泛概念词 | 概念层面优先用 /hot/concepts(已去掉泛词) |
concepts |
2.1 L1:顺带点名
only_this_stock=1 只返回仅涉及该股的记录;0 返回该股为第一提及股的记录。两种口径结果不同,统计时要固定一种并写进报告。若需要更细的控制,可在本地按 stocks 数组长度分桶:
def breadth_bucket(rec):
n = len(rec.get("stocks") or [])
return "single" if n == 1 else ("few" if n <= 3 else "broad")
2.2 L2:同主体时间窗去重
import pandas as pd
def dedup_by_agency(df, hours=6):
df = df.copy()
df["t"] = pd.to_datetime(df["topic_time"]) # 北京时间
df = df.sort_values("t")
keep, last = [], {}
for idx, row in df.iterrows():
aid = row["agency_id"]
if aid is None:
keep.append(idx); continue # 交给 L4 单列
if aid not in last or (row["t"] - last[aid]).total_seconds() > hours * 3600:
keep.append(idx); last[aid] = row["t"]
return df.loc[keep]
窗口 hours=6 为示例值,可按研究频率调整。
2.3 L3:按机构/大V分分层
熔岩机构/大V分大约在 450~1500,1000 左右算中等,1050 约为前 10%。建议分三层统计,而不是直接丢弃低分记录:
| 分层 | 区间(示例) | 用途 |
|---|---|---|
| 高分 | agency_score ≥ 1050 |
与 /hot/weighted 口径对齐 |
| 中等 | 950 ≤ agency_score < 1050 |
常规讨论量 |
| 其他 | < 950 或为空 | 噪声观察,单独报告 |
注意:记录里的 agency_score 是当前分。做历史回看时,应按 topic_time 的日期用 get_agency_pit(as_of_date=...) 取 PIT 分替换,避免用到未来信息。
2.4 L4:主体缺失记录
agency_id 为空的记录不能参与「去重主体数」统计,但其条数本身是有效信息(例如资讯类内容)。建议在输出表中单列 n_no_agency。
2.5 L5:概念泛词
概念热榜 /hot/concepts 已去掉泛词;如果从记录的 concepts 数组自行统计,需要维护一份本地停用表,并在报告中注明。
三、去噪前后对比表
对单只股票 7 天记录跑一遍流水线后,输出一张对比表(示例数据):
| 指标 | 去噪前 | 去噪后 | 说明 |
|---|---|---|---|
| 记录数 | 186 | 74 | L1+L2 |
| 去重主体数 | 52 | 52 | 去重不改变主体数 |
| 高分主体数 | 9 | 9 | L3 分层 |
| 无主体记录 | 21 | 21 | L4 单列 |
| 高分记录占比 | 8% | 17% | 噪声被压缩后的结构变化 |
四、与服务端口径的关系
/hot/stocks?min_score=1050是服务端按分数门槛统计的提及,口径简单,适合全市场截面。/hot/weighted的weighted_heat= 每次提及的机构/大V分 ÷ 1000 再相加,并使用 PIT 面板;给as_of_date时消息只算到当天 15:00。- 本地五级流水线适合单股或小样本深挖,可与上面两个服务端口径交叉核对。
FAQ
Q:去噪会不会把真实信号去掉? A:流水线不删除数据,只做分层与去重计数,原始记录应保留归档,方便复核。
Q:only_this_stock 默认是什么?
A:文档只说明了 1 与 0 的含义,默认值以 OpenAPI 为准,建议显式传参。
Q:可以用 summary 做情绪打分吗?
A:可以在本地另行处理,但熔岩返回的是结构化摘要与要点,不包含情绪分数字段。
结论
舆情去噪不需要复杂模型:先用 only_this_stock 和 stocks 处理顺带点名,再用 agency_id 做时间窗去重,用 agency_score(回看时换 PIT 分)分层,最后单列无主体记录。每一步都能对应到熔岩文档里的字段,结果可复现、可审计。
数据来自熔岩消息面热度监测,仅用于只读监测与统计研究,不构成投资建议。
只读监测与字段说明见:https://lava.ai-dolphin.com/subscribe/docs
Comments
Join the discussionNo comments yet. Be the first to comment.