Bhojpuri Sentiment Model (v2)

4-class sentiment classifier for native Bhojpuri text (Devanagari script), fine-tuned from ai4bharat/IndicBERTv2-MLM-only on majority-vote consensus labels from 5 open-weight LLM judges (see the PURVA Bhojpuri Sentiment Corpus).

Labels

objective, positive, negative, neutral — see the dataset card for full definitions. objective reports fact with no evaluative stance; positive/negative/neutral apply to subjective sentences by polarity.

Training

Base model ai4bharat/IndicBERTv2-MLM-only (revision 8598f13)
Label source majority vote across 5 LLM judges (not Dawid–Skene — see dataset card for why)
Train / dev / test 72,168 / 9,019 / 9,020 (stratified by register × text_type × source_name, seed 42)
Epochs 4
Learning rate 2e-5
Batch size 32
Max sequence length 128
Precision fp16
Seed 42
Checkpoint selection final epoch (no best-on-dev selection; dev loss used for monitoring only)

Results

Scored on a 108-item human-labeled gold set (gold_test_120.jsonl minus 3 mixed-labeled items, which fall outside this model's 4-class label space; verified zero overlap with train/dev). Bootstrap 95% CI, 1,000 resamples.

Metric Score 95% CI
Accuracy 65.7% [56.5%, 75.0%]
Macro-F1 50.3% [41.3%, 59.5%]

By register:

Register n Accuracy
encyclopedic 12 0.833
news 42 0.810
literary 19 0.632
verse 18 0.500
commentary 15 0.333
opinion 2 n<10, not reported

Accuracy is strong on news/encyclopedic register and weak on commentary and verse — see the dataset card's "Known issues" for the neutral-class and Dawid-Skene-vs-majority-vote caveats, which apply to this model too (it is the majority-vote-trained checkpoint; a separate Dawid-Skene-trained checkpoint scores 63.0% accuracy / 51.4% macro-F1 on the same gold set — within this comparison's confidence interval, not a clear win either way).

Usage

from transformers import pipeline

classifier = pipeline(
    "text-classification",
    model="abhiprd2000/bhojpuri-sentiment-model",
)

texts = [
    "ई खाना बहुत स्वादिष्ट बा।",       # positive (99.8%)
    "आज बहुत थकान लागत बा।",            # negative (99.6%)
    "हम कल पटना जाइब।",                 # objective (95.7%)
]

for text in texts:
    result = classifier(text)[0]
    print(f"{text} -> {result['label']} ({result['score']*100:.1f}%)")

Licence

MIT, matching the base model (ai4bharat/IndicBERTv2-MLM-only, confirmed license:mit on its model card). Differs from v1-legacy, which was tagged apache-2.0.

Version history

  • v1-legacy (tag v1-legacy): XLM-RoBERTa (cardiffnlp/twitter-xlm-roberta-base-sentiment) fine-tuned on a 68,822-row, artificially class-balanced, partly machine-translated dataset. Scored 97.6% accuracy / 0.976 macro-F1 on its own held-out 501-item balanced/translated test set.
  • v2 (this model): IndicBERTv2, trained on native non-translated text with naturally imbalanced labels, scored against a human-labeled gold set. v1 and v2 numbers are not comparable — different base model, different training data, different label source, different test set. Do not quote v1's 97.6% alongside v2's 65.7% as if they measure the same thing.
Downloads last month
21
Safetensors
Model size
0.3B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train abhiprd2000/bhojpuri-sentiment-model