Instructions to use MaYiding/EventTwin with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use MaYiding/EventTwin with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="MaYiding/EventTwin")# Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("MaYiding/EventTwin") model = AutoModelForSequenceClassification.from_pretrained("MaYiding/EventTwin", device_map="auto") - Notebooks
- Google Colab
- Kaggle
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 对):
- 标签平滑 LS=0.2:软标签再平滑——高置信样本不再被推向 logit 极值, 直接修复了 v1.1 的校准劣化(ECE 0.302→0.261)并把高置信带误并率降到 0;
- R-Drop(系数 1.0):同一输入两次前向的 KL 一致性正则——判别边界更稳, 灰带 acc 0.880→0.883、pos AUROC 0.837→0.847;
- 四配置海选(a: LS0.2+RDrop / b: LS0.3+RDrop / c: LS0.2+RDrop+扩正对 / d: 对照), a 以 7/8 指标最优胜出(完整四配置数据在 GitHub 训练档案);
- 温度重新校准 T=1.3663。
v1.1 训练方法(相对 v1.0 的增量)
- EMA 权重平均(Model Soups 系技巧):小数据 regime 下训练末期权重波动大, 指数滑动平均版权重更稳——v1.1 发布的即 EMA 权重;
- 第二代合成改写通道(c5_synth_v2,726 条):改写生成的约束更强(保持主体/对象/ 时间/动作逐项对齐),且新增反事实过滤(LLM 自检改写是否引入了新信息,724 条中 滤掉 300 条不合格);
- 学习率 warmup(NeurIPS 2021 小数据 +1.21 的结论);
- 数据 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