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")# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("MaYiding/EventTwin") model = AutoModelForCausalLM.from_pretrained("MaYiding/EventTwin", device_map="auto") - Notebooks
- Google Colab
- Kaggle
EventTwin v2.3 · 中文同事件判定器
TL;DR (EN) — EventTwin judges whether two event descriptions refer to the same real-world event (cross-document event coreference / news deduplication) with temperature-calibrated probabilities. v2.3 keeps the Qwen3-Reranker-4B base and refines the recipe with sharpened labels + dual-teacher-consensus synthetic data: LLM-refined soft labels (v2.1) + four cross-granularity quadrants (v2.2) + 12k multi-register synthetic pairs (social-media / colloquial / wire / long-form, kept only when the generator's judgment agrees with a second judge's probability). Result: overall AUROC 0.985 + gray 0.982 (records), ECE 0.094, truth-based false-merge 2.8% (family's lowest) with coverage 95.4% / miss 0.0%, and escalation down from v2.2's 56.6% to 23.7% on the hard stratified benchmark. Quadrant hold-out 0.98-1.0. Prior profiles remain as tags (v2.2 / v2.1 / v2.0 / v1.x). Data: EventTwin-Data.
这个模型做什么
输入两个中文事件描述,输出**"同一现实事件"的概率**(0-1,已校准)。用于新闻流式 聚类的核心判定:"这两条报道说的是同一件事吗"——同一动作的不同媒体报道=同事件; 同产品两次调价/宣布与交割=不同事件。
⚠️ 输入协议(v2.x 必读)
v2.0 的官方推理协议:每侧文本截断到 200 字符,再套 Qwen3-Reranker 官方模板, 取序列末位 yes/no 双 logit,除温度 T=0.854 后 softmax(v2.3)。
import torch, json
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("MaYiding/EventTwin")
tok.padding_side = "left" # ★ 左 padding
model = AutoModelForCausalLM.from_pretrained("MaYiding/EventTwin").eval()
T = 0.854 # calibration.json
PFX = ("<|im_start|>system\nJudge whether the Document meets the requirements based on the "
"Query. Only give me the judgment and do not output any other words or explanations. "
'The judgment should be "yes" or "no".<|im_end|>\n<|im_start|>user\nQuery: ')
SFX, SFX2 = "\nDocument: ", "\nJudgment: <|im_end|>\n<|im_start|>assistant\n"
yes_id = tok("yes", add_special_tokens=False)["input_ids"][0]
no_id = tok("no", add_special_tokens=False)["input_ids"][0]
def same_event_prob(a: str, b: str) -> float:
a, b = a[:200], b[:200] # ★ 200 字截断(官方协议)
inp = tok(f"{PFX}{a}{SFX}{b}{SFX2}", return_tensors="pt", truncation=True,
max_length=512, add_special_tokens=False)
with torch.no_grad():
la = model(**inp).logits[:, -1, :].float() # ★ 左 padding 下 -1 即末位
two = torch.stack([la[:, no_id], la[:, yes_id]], dim=-1)
return float(torch.softmax(two / T, dim=-1)[0, 1])
same_event_prob("小米YU7正式上市,售价25.35万元起,共推出三款车型",
"小米发布YU7系列 售价25.35万起") # ≈ 0.93
为什么必须截断:实测同一权重,全文输入(均长 135 字、9% 超 200 字)总体 AUROC 0.834,200 字截断 0.963(+13pt)——长尾证据/范围后缀会让 decoder 分心(与判定模型 普遍的 context-rot 现象同族)。训练数据文本本身均长 ~135 字,截断即回到训练分布。 批量推理与级联路由示例:GitHub inference_v2.py。
版本对比:v1.x 家族 vs v2.0 - v2.3
基准 = 1,000 对双教师确认金标(EventTwin-Data); v1.x 系列为 568M encoder 基座(bge-reranker-v2-m3),v2.x 为 4B decoder 基座 (Qwen3-Reranker-4B)。所有版本可从本仓库获取(v2.3 = main;v2.2/v2.1/v2.0/v1.2/v1.1/v1.0 为 tag)。
判别力
| 指标 | v1.0 | v1.2 | v2.0(tag) | v2.1(tag) | v2.2(tag) | v2.3(main) |
|---|---|---|---|---|---|---|
| 总体 AUROC | 0.909 | 0.903 | 0.963 | 0.983 | 0.985 | 0.985 |
| 灰带 AUROC(最难层) | 0.866 | 0.793 | 0.974 | 0.982 | 0.976 | 0.982 |
| pos AUROC(措辞多样同事件) | 0.767 | 0.847 | 0.850 | 0.926 | 0.949 | 0.938 |
| 长文×长文 AUROC / acc(hold-out) | — | — | — | 0.929 / 0.861 | 0.993 / 0.983 | 0.977 / 0.939 |
| 长文×簇卡 acc(hold-out) | — | — | — | 0.922 | 0.986 | 0.993 |
| 总体 ECE | 0.187 | 0.261 | 0.105 | 0.076 | 0.150 | 0.094 |
| 与教师一致率 | 0.796 | 0.718 | 0.918 | 0.951 | 0.944 | 0.969 |
| 基座 / 参数 | 568M | 568M | 4B | 4B | 4B | 4B |
(v1.1 0.895/v1.3 0.902 已略;完整六版数据见 GitHub 训练档案。)
置信分带行为(级联生产口径)
真值口径(按 1,000 对终版金标真值统计):
| 指标 | v2.0 | v2.1(tag) | v2.2(tag) | v2.3(main) |
|---|---|---|---|---|
| 误自动并率(真负例≥0.9 / ≥0.95) | 8.0% / 7.9% | 2.9% / 2.8% | 3.7% / 3.2% | 2.8% / 2.8% |
| 明确负例误并(neg 层≥0.9) | 3.0% | 0.0% | 0.0% | 0.0% |
| 自动并覆盖(真正例≥0.9) | 92.5% | 91.3% | 96.7% | 95.4% |
| 漏并率(真正例≤0.1) | 0.0% | 1.7% | 0.0% | 0.0% |
| 灰带升级率(0.1-0.9,难例分层集) | 10.7% | 13.4% | 56.6% | 23.7% |
双流量画像(升级率取决于流量难度,选型前先看这条):
| 流量画像 | 模型 | 误并 | 漏并 | 覆盖 | 拒并 | 升级率 |
|---|---|---|---|---|---|---|
| 最坏情形(benchmark 分层难例,30% 灰带构造) | v2.1 | 2.9% | 1.7% | 91.3% | — | 13.4% |
| v2.2 | 3.7% | 0.0% | 96.7% | — | 56.6% | |
| v2.3 | 2.8% | 0.0% | 95.4% | — | 23.7% |
v2.3 在最坏情形流量上同时拿到低误并(2.8%,历代最低)与中等升级率(23.7%,v2.2 的 四成);自然难度流量下升级率与 v2.2 同档(val 口径 ~10%)。需要最低升级率(13.4%) 选 v2.1,需要最高覆盖(96.7%)选 v2.2,均衡选 v2.3。
层口径(按构建层统计,与 v1.x 历史表可比;pos 构建层 35% 对的终标为否, 故该口径的"漏并/覆盖"含构造标签噪声,仅作纵向对照):
| 指标 | v1.0 | v1.2 | v2.0 | v2.1 | v2.2 |
|---|---|---|---|---|---|
| 误自动并率(neg层≥0.9) | 0.25% | 0.0% | 3.0% | 0.0% | 0.0% |
| 漏并率(pos层≤0.1) | 6.3% | 3.7% | 13.0% | 14.7% | 3.0% |
| 自动并覆盖(pos层≥0.9) | 76.3% | 28.0% | 73.3% | 64.7% | 68.3% |
选型建议
- v2.3(main)· 均衡旗舰:AUROC/灰带/一致率新高 + 误并 2.8% 历代最低 + 漏并 0% + 升级率较 v2.2 减半以上 + ECE 0.094——排序、自动并、跨粒度的默认之选。注意: 长文×长文象限较 v2.2 微降(0.977 vs 0.993)、pos 层较 v2.2 低(0.938 vs 0.949); 追求单点极致用对应 tag(v2.2 跨粒度/pos,v2.1 校准/果断);
- v1.2 · 零误并闸门:高置信带 0% 误并 + 3.7% 漏并——作 v2.0 前置保险或独立安全闸;
- v1.0 · 轻量独立判定:568M、ECE 0.187,无 GPU 预算或边缘部署;
- v1.1/v1.3/v1.4:历史档案(v1.4 的多语域合成数据遗产已汇入 v2.0 训练集)。
对照参考:教师(商业判定 API,闭源)0.998 / ECE 0.062;通用 embedding-8B 0.977 但 ECE 0.563(分数不可当概率用)。
v2.3 训练方法
- 基座(历代相同):Qwen/Qwen3-Reranker-4B (decoder 式 yes/no logit 打分)+ LoRA(r=32) + 权重合并发布
- 数据升级(本版核心):v2.2 配方(LLM 复核精化软标签 37k + 四象限各 1.5k)+ 双教师共识合成通道 12k——多模型各生成虚构中小企业/多行业事件的多种表面形式 (社媒转述/口语/快讯/长文/事件卡),仅保留生成模型判定与第二判定器概率方向一致的 对(共识过滤),场景级 train/test 切分
- 正则与锐化:标签平滑 LS=0.05 + 标签极值锐化 [0.02, 0.98] + R-Drop KL=2.0 + EMA + lr 1e-4 · 2 epoch · 梯度检查点;长输入 max_len 1152
- 温度后校准:T=0.854
- 算力:1× RTX 4090D 24G,约 2 小时
- 4B 路线前史:内部 v3(4B+旧配方,0.914 持平 568M)与 v15 未合并 adapter 的误评测 曾两次"证伪"该路线——v2.0 证明换基模的收益要配新配方(更强正则+更高 lr)才能兑现, 完整复盘见 GitHub 训练档案。
v2.3 基准结果(200 字截断协议)
| 层 | n | AUROC | ECE |
|---|---|---|---|
| OVERALL | 1000 | 0.9854 | 0.094 |
| 灰带(最难) | 300 | 0.9819 | — |
| pos(措辞多样同事件) | 300 | 0.9379 | — |
| 明确负 | 400 | —(带行为见分带表:≥0.9 误并 0.0%) | — |
跨粒度 hold-out(按簇切分防泄漏):长文×簇卡 0.9954/acc 0.993 / 短句×簇卡 0.9997 / 框架×正文 1.000 / 长文×长文 0.977(v2.2 为 0.993,微降)。
版本说明
公开版本号与内部迭代代号解耦:v1.0=v8 / v1.1=v9 / v1.2=v10a / v2.0=v15_4b_merged / v2.1=v23b_4b_merged / v2.2=v24b_4b_merged / v2.3=v26_4b_merged(v1.3/v1.4 权重因当时的网络拦截未能上传, 配方与数据完整入档 EventTwin-Data,指标见 GitHub VERSIONS)。MAJOR 位 = 换基模或 代际跃升;MINOR 位 = 同基模数据/配方升级。v2.0 遗留的 3% 饱和误并核自 v2.1 起消除 (明确负例 0%)。下一步:合成数据飞轮(中小企业/多行业场景)+ q1 精化全量重训。
局限(如实)
- **灰带区误并 2.8%**(真值口径):明确负例零误并,但真值存疑的模糊对仍会打到 ≥0.9 ——绝对零误并场景建议 v1.2 前置或双级复核;
- 标签锐化使模型对部分"翻转标签"训练对的拟合下降(val 口径漏并升至 18%,benchmark 人工金标口径漏并 0.0% 不受影响)——若你的下游标签分布与精化标签强相关,选 v2.2;
- ECE 0.150(v2.1 0.076)——概率直接当置信度用的场景优先 v2.1;
- 输入必须遵循 200 字截断协议(全文输入 AUROC 掉 13pt,v2.0 实测);
- 域偏移:训练语料为企业新闻域(合成扩产进行中);4B 权重 8GB(CPU 不可用)。
引用
@misc{eventtwin-2026,
title = {EventTwin: A Calibrated Chinese Cross-Encoder Family for Same-Event Judgment},
author = {Ma, Yiding},
year = {2026},
url = {https://huggingface.co/MaYiding/EventTwin},
note = {v2.0: Qwen3-Reranker-4B + distillation + multi-register synthesis; data: MaYiding/EventTwin-Data}
}
许可
Apache 2.0(基座 Qwen3-Reranker-4B 与 bge-reranker-v2-m3 均为 Apache 2.0)。 训练与评测数据在 EventTwin-Data(CC BY-NC 4.0)。
- Downloads last month
- 94