CoolFace
Modelpublic

afafos/trade-news-dedup-bge-reranker-v2-m3

sourceHugging Faceapache-2.0updated 4mo agoView on Hugging Face
0likes13downloads
Model Card

trade-news-dedup-bge-reranker-v2-m3

Event-level duplicate detection in trade news — Cross-encoder reranker (XLM-RoBERTa), fine-tuned on the weakly-supervised SilverSet of the TradeNewsEventDedup project.

Обнаружение дубликатов событий во внешнеторговых новостях: бинарная классификация пар новостных саммари (дубликат / не-дубликат) на уровне идентичности торгового события.

⭐ Best overall model on the GoldSet by F1 and Accuracy.

Task

Given two trade-news summaries, predict whether they describe the same real-world trade event (same country, commodity, trade action, numerical values and time) — not mere text similarity. The model was fine-tuned with structured hard negatives (semantically close but materially different cases: updates U and related events R).

  • —Base model: `BAAI/bge-reranker-v2-m3`
  • —Training data: `lyutovad/TradeNewsEventDedup` — SilverSet (16,097 LLM-labeled pairs, fine-tuning only)
  • —Evaluation: GoldSet (1,469 manually validated pairs) — see results below
  • —Output head: Single-logit head fine-tuned with BCE loss. Apply sigmoid to the logit to get P(duplicate).

Results (GoldSet, fine-tuned)

MetricValue
PR-AUC0.9348
F10.9012
Accuracy0.9149
Recall0.9314

Thresholds are tuned on the GoldSet (optimistic estimate). Baselines (lexical/embedding similarity) reach high recall but low precision; fine-tuning with hard negatives improves precision and reduces false positives. Full protocol and ablations are in the paper.

How to use

python
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

repo = "afafos/trade-news-dedup-bge-reranker-v2-m3"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo).eval()

a = "Iraq and Lebanon signed an agreement and seven MoUs on trade and investment."
b = "Iraq and Lebanon announced a new partnership framework, including seven MoUs."

with torch.no_grad():
    logits = model(**tok(a, b, return_tensors="pt", truncation=True)).logits
    p_duplicate = torch.sigmoid(logits)[0, 0].item()   # single-logit head (BCE)
print(p_duplicate)   # > threshold (tuned on GoldSet) => duplicate

Limitations

  • —Summaries are machine-translated to English; quality depends on the preprocessing pipeline.
  • —Training labels (SilverSet) are LLM-generated (weak supervision) — possible label bias.
  • —Decision threshold tuned on the evaluation set; validation by a single annotator.
  • —Evaluated on a single domain (trade / foreign-economic news).

Links & citation

  • —📦 Dataset: https://huggingface.co/datasets/lyutovad/TradeNewsEventDedup
  • —💻 Code: https://github.com/SaidKamalov/trade-news-duplicates
  • —Paper: Event-Level Duplicate Detection in Trade News under Hard-Negative Supervision — D. Liutova, S. Kamalov, A. Afanasev, T. Mukhtarov.
bibtex
@misc{tradenews_event_dedup,
  title  = {Event-Level Duplicate Detection in Trade News under Hard-Negative Supervision},
  author = {Liutova, Daria and Kamalov, Said and Afanasev, Andrew and Mukhtarov, Timerlan},
  year   = {2026},
  note   = {Dataset: lyutovad/TradeNewsEventDedup; Code: https://github.com/SaidKamalov/trade-news-duplicates}
}