|
|
--- |
|
|
language: en |
|
|
library_name: transformers |
|
|
pipeline_tag: text-classification |
|
|
tags: |
|
|
- text-classification |
|
|
- sequence-classification |
|
|
- roberta |
|
|
- distilroberta |
|
|
- climate-change |
|
|
- logical-fallacy-detection |
|
|
- nlp |
|
|
license: apache-2.0 |
|
|
model-index: |
|
|
- name: climate-fallacy-roberta |
|
|
results: |
|
|
- task: |
|
|
type: text-classification |
|
|
name: Climate logical fallacy classification |
|
|
dataset: |
|
|
name: Climate subset of Tariq60/fallacy-detection |
|
|
type: custom |
|
|
split: test |
|
|
metrics: |
|
|
- name: Accuracy |
|
|
type: accuracy |
|
|
value: 0.24 |
|
|
- name: Macro F1 |
|
|
type: f1 |
|
|
value: 0.20 |
|
|
- name: Weighted F1 |
|
|
type: f1 |
|
|
value: 0.24 |
|
|
--- |
|
|
|
|
|
# Climate Logical Fallacy Classifier (DistilRoBERTa) |
|
|
|
|
|
This model is a **DistilRoBERTa**–based text classification model fine-tuned to detect **logical fallacies in climate-related text**. |
|
|
It predicts one of 11 logical fallacy labels (including “NO_FALLACY”) for a given sentence or short paragraph. |
|
|
|
|
|
The model was trained as part of an academic NLP project on _“Automated Detection of Logical Fallacies in Climate Change Social Media Posts using Small Language Models (SLMs)”_. |
|
|
|
|
|
## Model Details |
|
|
|
|
|
- **Base model**: `distilroberta-base` |
|
|
- **Architecture**: DistilRoBERTa (Transformer encoder, 6 layers) |
|
|
- **Task**: Multi-class text classification |
|
|
- **Number of classes**: 11 |
|
|
- **Language**: English |
|
|
- **Framework**: Transformers |
|
|
|
|
|
### Label Set |
|
|
|
|
|
The model is trained to predict the following labels: |
|
|
|
|
|
1. `CHERRY_PICKING` |
|
|
2. `EVADING_THE_BURDEN_OF_PROOF` |
|
|
3. `FALSE_ANALOGY` |
|
|
4. `FALSE_AUTHORITY` |
|
|
5. `FALSE_CAUSE` |
|
|
6. `HASTY_GENERALISATION` |
|
|
7. `NO_FALLACY` |
|
|
8. `POST_HOC` |
|
|
9. `RED_HERRINGS` |
|
|
10. `STRAWMAN` |
|
|
11. `VAGUENESS` |
|
|
|
|
|
`id2label` / `label2id` mappings are stored in the model config and are consistent with the training code. |
|
|
|
|
|
## 📚 Training Data |
|
|
|
|
|
The model was fine-tuned on the **climate subset** of the open-source dataset from: |
|
|
|
|
|
> Tariq60 – *fallacy-detection* repository |
|
|
> https://github.com/Tariq60/fallacy-detection |
|
|
|
|
|
Only the **climate** portion of the dataset was used, with the standard split: |
|
|
|
|
|
- `train/` – training examples |
|
|
- `dev/` – validation examples |
|
|
- `test/` – held-out evaluation set |
|
|
|
|
|
Each example includes: |
|
|
|
|
|
- The climate-related text segment |
|
|
- A manually assigned fallacy label (or `No fallacy`) |
|
|
|
|
|
### Preprocessing |
|
|
|
|
|
- Texts were lower-cased and cleaned using a light `basic_clean` function: |
|
|
- Stripping extra whitespace |
|
|
- Normalising some punctuation |
|
|
- Some classes were **minority labels** (few examples), so basic **class balancing** was applied via up-sampling in the training set. |
|
|
- NaN or empty texts were dropped before training. |
|
|
|
|
|
## Training Procedure |
|
|
|
|
|
- **Base model**: `distilroberta-base` |
|
|
- **Optimizer**: AdamW (via `Trainer`) |
|
|
- **Learning rate**: 2e-5 |
|
|
- **Batch size**: 16 |
|
|
- **Max sequence length**: 128–256 tokens |
|
|
- **Epochs**: 10 |
|
|
- **Weight decay**: 0.01 |
|
|
- **Loss function**: Cross-entropy, optionally with class weights to mitigate class imbalance |
|
|
- **Validation split**: 80/20 stratified split of the training data |
|
|
|
|
|
## Implementation used: |
|
|
|
|
|
- `AutoTokenizer` |
|
|
- `AutoModelForSequenceClassification` |
|
|
- `TrainingArguments` |
|
|
- `Trainer` |
|
|
|
|
|
from the Transformers library. |
|
|
|
|
|
## Evaluation |
|
|
|
|
|
Evaluation was done on the **held-out climate test set** from the dataset. |
|
|
|
|
|
**Metrics (multi-class):** |
|
|
|
|
|
- **Accuracy** ≈ 0.24 |
|
|
- **Macro F1** ≈ 0.20 |
|
|
- **Weighted F1** ≈ 0.24 |
|
|
|
|
|
These values are **baseline experimental results** on a relatively small and imbalanced dataset. They should be interpreted as *preliminary research numbers*, not as production-ready performance. |
|
|
|
|
|
Different random seeds, data balancing strategies, or more aggressive hyperparameter tuning can change these numbers. |
|
|
|
|
|
## Intended Use |
|
|
|
|
|
### Primary Use |
|
|
|
|
|
- Research and experimentation on: |
|
|
- Automated detection of logical fallacies in climate discourse |
|
|
- Comparing traditional baselines (TF-IDF + SVM) vs. Transformer-based models |
|
|
- Building educational tools that flag potential fallacies in climate arguments |
|
|
|
|
|
### Suitable Scenarios |
|
|
|
|
|
- Analyzing **short climate-related social media posts** |
|
|
- Demonstration / teaching examples on: |
|
|
- Argumentation quality |
|
|
- Climate misinformation |
|
|
- Explainable NLP (combined with a small language model explainer, e.g. FLAN-T5) |
|
|
- |
|
|
## Limitations & Ethical Considerations |
|
|
|
|
|
### Limitations |
|
|
|
|
|
- **Small dataset**: Training data is limited in size, especially for rarer fallacy types. |
|
|
- **Class imbalance**: Some fallacies occur far less frequently, which affects per-class F1 scores. |
|
|
- **Modest performance**: Overall accuracy and macro F1 are relatively low. The model should be treated as an exploratory research artifact, not a production system. |
|
|
- **Domain specificity**: The model is trained only on **climate** discourse; performance on other topics (e.g. politics, health) is unknown and likely poor. |
|
|
|
|
|
### Ethical Considerations |
|
|
|
|
|
- Predictions are **probabilistic**, not definitive judgments of truth or deception. |
|
|
- The model can be **wrong or over-confident**, especially on borderline or nuanced arguments. |
|
|
- It should **not** be used for automated moderation, censorship, or any high-stakes decision-making without strong human oversight. |
|
|
|
|
|
## How to Integration with Explanatory SLM |
|
|
|
|
|
In the associated project, this classifier is combined with a small language model (e.g., google/flan-t5-small) to generate natural-language explanations of the predicted fallacy label: |
|
|
|
|
|
What the fallacy means in simple terms |
|
|
|
|
|
Why the input text might be an example |
|
|
|
|
|
This setup is used in a Streamlit app: |
|
|
|
|
|
Users enter a climate-related argument |
|
|
|
|
|
The model predicts a fallacy label |
|
|
|
|
|
FLAN-T5 generates a short explanation |
|
|
|
|
|
## Citation |
|
|
|
|
|
If you use this model in academic work, you can cite it as: |
|
|
|
|
|
Kyeremeh, F. (2025). Climate Logical Fallacy Classifier (DistilRoBERTa). Hugging Face. |
|
|
Model: SteadyHands/climate-fallacy-roberta. |
|
|
|
|
|
And also consider citing the original dataset author(s): |
|
|
|
|
|
Tariq60. fallacy-detection GitHub repository. |
|
|
https://github.com/Tariq60/fallacy-detection |
|
|
|
|
|
## Acknowledgements |
|
|
|
|
|
Base model: distilroberta-base by Hugging Face |
|
|
|
|
|
Dataset: Climate subset from Tariq60’s fallacy-detection repository |
|
|
|
|
|
## Libraries: |
|
|
|
|
|
Transformers |
|
|
|
|
|
Datasets |
|
|
|
|
|
scikit-learn |
|
|
|
|
|
## Project context: |
|
|
|
|
|
Master ’s-level NLP / Data Science coursework on Small Language Models and explainable NLP. |
|
|
|
|
|
## How to Use |
|
|
|
|
|
### Python Example (Logits → Label) |
|
|
|
|
|
```python |
|
|
from transformers import AutoTokenizer, AutoModelForSequenceClassification |
|
|
import torch |
|
|
|
|
|
model_id = "SteadyHands/climate-fallacy-roberta" |
|
|
|
|
|
tokenizer = AutoTokenizer.from_pretrained(model_id) |
|
|
model = AutoModelForSequenceClassification.from_pretrained(model_id) |
|
|
|
|
|
text = "Climate has always changed in the past, so current warming can't be caused by humans." |
|
|
|
|
|
inputs = tokenizer( |
|
|
text, |
|
|
return_tensors="pt", |
|
|
truncation=True, |
|
|
padding="max_length", |
|
|
max_length=256, |
|
|
) |
|
|
|
|
|
with torch.no_grad(): |
|
|
outputs = model(**inputs) |
|
|
|
|
|
logits = outputs.logits |
|
|
probs = torch.softmax(logits, dim=-1)[0].tolist() |
|
|
pred_id = int(torch.argmax(logits, dim=-1).item()) |
|
|
|
|
|
id2label = model.config.id2label |
|
|
pred_label = id2label[str(pred_id)] if isinstance(id2label, dict) else id2label[pred_id] |
|
|
|
|
|
print("Text:", text) |
|
|
print("Predicted label:", pred_label) |
|
|
print("Probabilities:", probs) |
|
|
|
|
|
|
|
|
Using the Transformers Pipeline |
|
|
|
|
|
```python |
|
|
from transformers import pipeline |
|
|
|
|
|
clf = pipeline( |
|
|
"text-classification", |
|
|
model="SteadyHands/climate-fallacy-roberta", |
|
|
top_k=None, # set top_k=3 to see top-3 fallacies |
|
|
) |
|
|
|
|
|
text = "Temperatures dropped this winter, so global warming must be a hoax." |
|
|
outputs = clf(text) |
|
|
|
|
|
print(outputs) |