EventTwin v1.2 · 中文同事件判定器

TL;DR (EN) — EventTwin is a 568M Chinese cross-encoder that judges whether two event descriptions refer to the same real-world event (cross-document event coreference / news deduplication), with temperature-calibrated native probabilities. v1.2 (internal v10a) adds label smoothing 0.2 + R-Drop + EMA on the v1.1 recipe: strongest pos layer yet (AUROC 0.847), best gray accuracy, and zero high-confidence false merges with the lowest miss rate (3.7%) — the safest cascade first stage; trade-off: it escalates ~70% of pairs to the gray band. All three versions (v1.0/v1.1/v1.2) remain available — see the three-way comparison. Data: EventTwin-Data. Full story incl. failed iterations & data laws: GitHub - MaYiding/EventTwin.


这个模型做什么

输入两个中文事件描述(新闻提及、事件摘要、聚类簇卡片皆可),输出**"同一现实事件"的概率**(0-1,已校准):

事件甲:小米YU7正式上市,售价25.35万元起,共推出三款车型
事件乙:小米发布YU7系列 售价25.35万起|时间 2025-06-26
                        ↓ EventTwin
P(同一事件) = 0.93   →  归入同一簇

事件甲:小米YU7正式上市,售价25.35万元起
事件乙:特斯拉Model 3 全系降价1.5万元
                        ↓ EventTwin
P(同一事件) = 0.02   →  不同事件

典型应用:情报/舆情系统的事件去重与在线聚类、跨媒体报道归并、EventRAG 事件卡治理, 以及"同产品两次调价是两个事件"这类细粒度共指场景。

快速上手

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

MODEL_ID = "MaYiding/EventTwin"          # main = v1.2;v1.1/v1.0 用 @v1.1 / @v1.0
tok = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).eval()

T = 1.3663  # ★ v1.2 温度(随仓库 calibration.json 提供;v1.0=0.824 / v1.1=0.625——先除温度再 sigmoid)

def same_event_prob(a: str, b: str) -> float:
    inp = tok(a, b, return_tensors="pt", truncation=True, max_length=512)
    with torch.no_grad():
        logit = model(**inp).logits.squeeze(-1)
    return torch.sigmoid(logit / T).item()

print(same_event_prob(
    "小米YU7正式上市,售价25.35万元起,共推出三款车型",
    "小米发布YU7系列 售价25.35万起"))

结构化输入(推荐,训练同构格式,效果最佳)——把类型/时间/证据拼进文本:

def frame(text, type_=None, time_=None, evidence=None):
    parts = [text]
    if type_:    parts.append(f"[{type_}]")
    if time_:    parts.append(f"({time_})")
    if evidence: parts.append(f"证据“{evidence[:80]}”")
    return " ".join(p for p in parts if p)

批量推理 / CPU-ONNX / 置信分带级联路由:见 GitHub inference.py。

版本对比:v1.0 vs v1.1 vs v1.2

基准 = 1,000 对双教师确认金标(EventTwin-Data), 三个版本均可从本仓库获取(v1.2 = main,v1.1 = tag v1.1, v1.0 = tag v1.0):

判别力

指标 v1.0(内部 v8) v1.1(内部 v9) v1.2(内部 v10a)
pos 层 AUROC(措辞多样同事件) 0.767 0.837 0.847(历代最高)
pos 层 acc 0.753 0.800 0.810
灰带 acc 0.853 0.880 0.883
总体 AUROC 0.909 0.895 0.903
灰带 AUROC 0.866 0.777 0.793
总体 ECE 0.187 0.302 0.261
与教师一致率 0.796 0.680 0.718
温度 T 0.824 0.625 1.366

置信分带行为(级联生产的关键口径)

指标 v1.0 v1.1 v1.2
误自动并率(neg 对打 ≥0.9) 0.25% 1.5% 0.0% ✅
漏并率(pos 对打 ≤0.1) 6.3% 12.7% 3.7% ✅
自动并覆盖(pos 对 ≥0.9) 76.3% 70.3% 28.0%
灰带升级率(0.1-0.9) 15.6% 29.4% 70.3%

选型建议

  • v1.2(main):级联第一级 / 误并零容忍场景——高置信带零误并、漏并最低、 pos 判别力历代最强;代价是 70% 流量升给更强的第二级(判定器/人工);
  • v1.0:独立判定器 / 低升级预算——76% 自动并覆盖 + 15.6% 升级率 + 最优校准(ECE 0.19);
  • v1.1:已被 v1.2 全面取代(7/8 指标被超越、误并率更高),保留仅为可复现。

对照参考:教师(商业判定 API,闭源)0.998 / ECE 0.062;通用 embedding-8B 0.977 但 ECE 0.563(分数不可当概率用)。

v1.2 训练方法(相对 v1.1 的增量)

在 v1.1 的"软标签蒸馏 + EMA + 二代合成改写"基础上(数据不变,仍为 25,458 对):

  1. 标签平滑 LS=0.2:软标签再平滑——高置信样本不再被推向 logit 极值, 直接修复了 v1.1 的校准劣化(ECE 0.302→0.261)并把高置信带误并率降到 0;
  2. R-Drop(系数 1.0):同一输入两次前向的 KL 一致性正则——判别边界更稳, 灰带 acc 0.880→0.883、pos AUROC 0.837→0.847;
  3. 四配置海选(a: LS0.2+RDrop / b: LS0.3+RDrop / c: LS0.2+RDrop+扩正对 / d: 对照), a 以 7/8 指标最优胜出(完整四配置数据在 GitHub 训练档案);
  4. 温度重新校准 T=1.3663。

v1.1 训练方法(相对 v1.0 的增量)

  1. EMA 权重平均(Model Soups 系技巧):小数据 regime 下训练末期权重波动大, 指数滑动平均版权重更稳——v1.1 发布的即 EMA 权重;
  2. 第二代合成改写通道(c5_synth_v2,726 条):改写生成的约束更强(保持主体/对象/ 时间/动作逐项对齐),且新增反事实过滤(LLM 自检改写是否引入了新信息,724 条中 滤掉 300 条不合格);
  3. 学习率 warmup(NeurIPS 2021 小数据 +1.21 的结论);
  4. 数据 25,458 对(正 5,319:合成 v1 1,495 + 合成 v2 726 + 转载 1,482 + 簇内 780 + 分布 442 + 决策 236 + 升格 86 + 仲裁 72),温度重新校准 T=0.625。

其余同 v1.0:基座 BAAI/bge-reranker-v2-m3 (568M,Apache 2.0)全参微调 · BCE 软标签 · 3 epoch · batch 16 · lr 2e-5 · 标签裁剪 [0.05, 0.95] · 1× RTX 4090D。完整档案(含 v1-v8 的失败迭代与三条数据定律): training-notes。

v1.2 基准结果

层 n AUROC acc@最优阈
OVERALL 1000 0.9034 0.848
pos(措辞多样同事件) 300 0.8466 0.810
灰带 300 0.7928 0.883
明确负 400 — 0.945(带安全见上表:≥0.9 误并 0%)

版本说明

公开版本号与内部迭代代号解耦:v1.0 = 内部 v8,v1.1 = 内部 v9,v1.2 = 内部 v10a (映射与路线图见 VERSIONS)。 v1.2 验收:pos 增益保持且超越(0.847)、ECE 修复(0.302→0.261)、高置信带零误并; 未竟项:灰带 AUROC(0.79 vs v1.0 的 0.866)与独立判定场景的 ECE(0.26 vs 0.19)—— v1.3 方向:两版蒸馏目标分头(判别头 + 分带头)或 v1.0/v1.2 双模型路由。

局限(如实)

  • v1.2 的灰带 AUROC(0.79 vs v1.0 的 0.866)与总体 ECE(0.26 vs 0.19)仍未回到 v1.0 水平, 且 70% 流量落在灰带(需第二级判定)——按场景选型;
  • v1.2 在最优阈值口径下 neg 层 acc 0.945(低于 v1.0/v1.1 的 0.998):LS 使负例分数整体 下移,对自动拒并带(≤0.1)无碍,但直接影响按中阈值二分类的使用方——见分带表;
  • 措辞多样的同事件对(pos 层 0.837)仍低于教师(0.99);
  • 教师噪声上界:师生一致率理论极限受人-人标注一致性(~85%)制约;
  • 域偏移:仅在企业新闻域训练与评测,跨域未验证;
  • 判定"同事件"而非"相关":主题相近的不同事件会得到低分(by design)。

引用

@misc{eventtwin-2026,
  title  = {EventTwin: A Calibrated Chinese Cross-Encoder for Same-Event Judgment},
  author = {Ma, Yiding},
  year   = {2026},
  url    = {https://huggingface.co/MaYiding/EventTwin},
  note   = {Soft-label distillation + synthetic paraphrases + EMA; data: MaYiding/EventTwin-Data}
}

许可

Apache 2.0(继承基座 bge-reranker-v2-m3)。训练与评测数据在 EventTwin-Data(CC BY-NC 4.0)。

Downloads last month
23
Safetensors
Model size
0.6B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for MaYiding/EventTwin

Finetuned
(110)
this model
Quantizations
1 model