Downloads · 30 days
26
3% of all-time downloads
AIWizards/mdeberta-v3-base-subjectivity-sentiment-multilingual-no-arabic
mdeberta-v3-base-subjectivity-sentiment-multilingual-no-arabic is a text classification model from AIWizards. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as cc-by-4.0.
This model is a fine-tuned version of microsoft/mdeberta-v3-base for Subjectivity Detection in News Articles, as presented in the paper AI Wizards at CheckThat! 2025: Enhancing Transformer-Based Embeddings with Sentim…
Downloads · 30 days
26
3% of all-time downloads
All-time downloads
945
Public
Parameters
279M
1.1 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors1.1 GB · 100%
From the Hugging Face model README
This model is a fine-tuned version of microsoft/mdeberta-v3-base for Subjectivity Detection in News Articles, as presented in the paper AI Wizards at CheckThat! 2025: Enhancing Transformer-Based Embeddings with Sentiment for Subjectivity Detection in News Articles. It was developed by AI Wizards for their participation in the CLEF 2025 CheckThat! Lab Task 1.
Code: https://github.com/MatteoFasulo/clef2025-checkthat
It achieves the following results on the evaluation set:
This model is designed to classify sentences as subjective (opinion-laden) or objective in news articles. This task is a key component in combating misinformation, improving fact-checking pipelines, and supporting journalists.
The primary strategy of this model, based on mDeBERTaV3-base, involves enhancing transformer-based embeddings by integrating sentiment scores derived from an auxiliary model. This sentiment-augmented architecture significantly boosts performance, especially the subjective F1 score. The model also employs decision threshold calibration, optimized on the development set, to effectively address class imbalance prevalent across the datasets.
Key Contributions from the paper:
Intended Uses: This model is intended for subjectivity detection in news articles, classifying sentences as subjective or objective. It has been evaluated across:
Its capabilities make it suitable for applications that require discerning factual statements from opinions, such as:
Limitations:
The model was fine-tuned on datasets provided for the CLEF 2025 CheckThat! Lab Task 1: Subjectivity Detection in News Articles.
The training process involved enhancing sentence representations by integrating sentiment scores from an auxiliary model. Class imbalance, which was a notable characteristic across these languages, was addressed through decision threshold calibration during training.
The following hyperparameters were used during training:
| Training Loss | Epoch | Step | Validation Loss | Macro F1 | Macro P | Macro R | Subj F1 | Subj P | Subj R | Accuracy |
|---|---|---|---|---|---|---|---|---|---|---|
| No log | 1.0 | 249 | 0.4619 | 0.7825 | 0.7790 | 0.7920 | 0.7421 | 0.6919 | 0.8 | 0.7901 |
| No log | 2.0 | 498 | 0.4544 | 0.7877 | 0.7856 | 0.8021 | 0.7537 | 0.6846 | 0.8384 | 0.7932 |
| 0.4852 | 3.0 | 747 | 0.5219 | 0.7931 | 0.7899 | 0.8052 | 0.7572 | 0.6970 | 0.8288 | 0.7994 |
| 0.4852 | 4.0 | 996 | 0.7055 | 0.7935 | 0.7975 | 0.7904 | 0.7385 | 0.7605 | 0.7178 | 0.8082 |
| 0.2503 | 5.0 | 1245 | 0.8536 | 0.7883 | 0.7937 | 0.7844 | 0.7306 | 0.7592 | 0.7041 | 0.8040 |
| 0.2503 | 6.0 | 1494 | 0.8900 | 0.7969 | 0.7988 | 0.7953 | 0.7450 | 0.7560 | 0.7342 | 0.8102 |
You can use this model directly with the Hugging Face transformers library for text classification:
import torch
import torch.nn as nn
from transformers import DebertaV2Model, DebertaV2Config, AutoTokenizer, PreTrainedModel, pipeline, AutoModelForSequenceClassification
from transformers.models.deberta.modeling_deberta import ContextPooler
sent_pipe = pipeline(
"sentiment-analysis",
model="cardiffnlp/twitter-xlm-roberta-base-sentiment",
tokenizer="cardiffnlp/twitter-xlm-roberta-base-sentiment",
top_k=None, # return all 3 sentiment scores
)
class CustomModel(PreTrainedModel):
config_class = DebertaV2Config
def __init__(self, config, sentiment_dim=3, num_labels=2, *args, **kwargs):
super().__init__(config, *args, **kwargs)
self.deberta = DebertaV2Model(config)
self.pooler = ContextPooler(config)
output_dim = self.pooler.output_dim
self.dropout = nn.Dropout(0.1)
self.classifier = nn.Linear(output_dim + sentiment_dim, num_labels)
def forward(self, input_ids, positive, neutral, negative, token_type_ids=None, attention_mask=None, labels=None):
outputs = self.deberta(input_ids=input_ids, attention_mask=attention_mask)
encoder_layer = outputs[0]
pooled_output = self.pooler(encoder_layer)
sentiment_features = torch.stack((positive, neutral, negative), dim=1).to(pooled_output.dtype)
combined_features = torch.cat((pooled_output, sentiment_features), dim=1)
logits = self.classifier(self.dropout(combined_features))
return {'logits': logits}
model_name = "MatteoFasulo/mdeberta-v3-base-subjectivity-sentiment-multilingual-no-arabic"
tokenizer = AutoTokenizer.from_pretrained("microsoft/mdeberta-v3-base")
config = DebertaV2Config.from_pretrained(
model_name,
num_labels=2,
id2label={0: 'OBJ', 1: 'SUBJ'},
label2id={'OBJ': 0, 'SUBJ': 1},
output_attentions=False,
output_hidden_states=False
)
model = CustomModel(config=config, sentiment_dim=3, num_labels=2).from_pretrained(model_name)
def classify_subjectivity(text: str):
# get full sentiment distribution
dist = sent_pipe(text)[0]
pos = next(d["score"] for d in dist if d["label"] == "positive")
neu = next(d["score"] for d in dist if d["label"] == "neutral")
neg = next(d["score"] for d in dist if d["label"] == "negative")
# tokenize the text
inputs = tokenizer(text, padding=True, truncation=True, max_length=256, return_tensors='pt')
# feeding in the three sentiment scores
with torch.no_grad():
outputs = model(
input_ids=inputs["input_ids"],
attention_mask=inputs["attention_mask"],
positive=torch.tensor(pos).unsqueeze(0).float(),
neutral=torch.tensor(neu).unsqueeze(0).float(),
negative=torch.tensor(neg).unsqueeze(0).float()
)
# compute probabilities and pick the top label
probs = torch.softmax(outputs.get('logits')[0], dim=-1)
label = model.config.id2label[int(probs.argmax())]
score = probs.max().item()
return {"label": label, "score": score}
examples = [
"The company reported a 10% increase in revenue for the last quarter.",
"Die angegebenen Fehlerquoten können daher nur für symptomatische Patienten gelten.",
"Si smonta qui definitivamente la narrazione per cui le scelte energetiche possono essere frutto esclusivo di valutazioni “tecniche” e non politiche.",
]
for text in examples:
result = classify_subjectivity(text)
print(f"Text: {text}")
print(f"→ Subjectivity: {result['label']} (score={result['score']:.2f})\n")
For more detailed usage, including training and evaluation scripts, please refer to the GitHub repository.
If you find our work helpful or inspiring, please feel free to cite it:
@misc{fasulo2025aiwizardscheckthat2025,
title={AI Wizards at CheckThat! 2025: Enhancing Transformer-Based Embeddings with Sentiment for Subjectivity Detection in News Articles},
author={Matteo Fasulo and Luca Babboni and Luca Tedeschini},
year={2025},
eprint={2507.11764},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2507.11764},
}