apriandito's picture
Upload README.md with huggingface_hub
ede25a6 verified
|
Raw
History Blame Contribute Delete
5.98 kB
---
language:
- id
license: mit
tags:
- sentiment-analysis
- indonesian
- indobert
- text-classification
- context-conditioned
datasets:
- custom
base_model: indobenchmark/indobert-large-p2
pipeline_tag: text-classification
model-index:
- name: indobert-binary-sentiment-classifier
results:
- task:
type: text-classification
name: Binary Sentiment Classification
metrics:
- name: Accuracy
type: accuracy
value: 0.9606
- name: F1 Macro
type: f1
value: 0.9494
---
# IndoBERT Binary Sentiment Classifier
A context-conditioned **binary** sentiment classifier for Indonesian text, fine-tuned from [IndoBERT Large P2](https://huggingface.co/indobenchmark/indobert-large-p2) (335M parameters). This is the binary variant of [apriandito/indobert-sentiment-classifier](https://huggingface.co/apriandito/indobert-sentiment-classifier) (3-class), designed for use cases that only need polarity detection (Negatif / Positif) without a Netral class.
Like its sibling models, this model evaluates sentiment *in relation to a given topic context*, making it more accurate for topic-specific analysis such as brand monitoring, public opinion polling, and crisis detection.
## Model Details
| Property | Value |
|----------|-------|
| **Base model** | [indobenchmark/indobert-large-p2](https://huggingface.co/indobenchmark/indobert-large-p2) (335M params) |
| **Task** | Context-conditioned binary sentiment classification |
| **Labels** | `NEGATIF` (0), `POSITIF` (1) |
| **Input format** | `[CLS] context [SEP] text [SEP]` |
| **Max length** | 256 tokens |
| **Training data** | 14,045 context-text pairs across 188 topics |
## Performance
Evaluated on a held-out validation set of 2,107 samples.
| Metric | Value |
|--------|-------|
| **Accuracy** | **96.06%** |
| **F1 Macro** | **0.949** |
| F1 Weighted | 0.961 |
| Precision Macro | 0.947 |
| Recall Macro | 0.952 |
### Comparison with 3-class variant
| Model | Classes | Accuracy | F1 Macro |
|-------|---------|----------|----------|
| **This model (binary)** | 2 (Negatif, Positif) | **96.06%** | **0.949** |
| [indobert-sentiment-classifier](https://huggingface.co/apriandito/indobert-sentiment-classifier) | 3 (Negatif, Netral, Positif) | 88.1% | 0.856 |
> The binary model achieves higher metrics because the task is simpler (no ambiguous Netral class). Choose binary when you only care about polarity; choose 3-class when you need to distinguish neutral text.
## Usage
```python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("apriandito/indobert-binary-sentiment-classifier")
model = AutoModelForSequenceClassification.from_pretrained("apriandito/indobert-binary-sentiment-classifier")
model.eval()
LABELS = {0: "Negatif", 1: "Positif"}
context = "harga sembako"
text = "harga beras naik terus bikin rakyat susah"
encoding = tokenizer(context, text, truncation=True, max_length=256, return_tensors="pt")
with torch.no_grad():
probs = torch.softmax(model(**encoding).logits, dim=-1)[0]
pred = torch.argmax(probs).item()
print(f"{LABELS[pred]} ({probs[pred]:.4f})")
# Output: Negatif (0.9987)
```
## Why Context Matters
Standard sentiment models classify text in isolation. This can lead to errors when sentiment depends on context:
| Context | Text | With Context | Without Context |
|---------|------|--------------|-----------------|
| harga sembako | harganya gila-gilaan | **Negatif** | ??? |
| produk luxury | harganya gila-gilaan | **Positif** | ??? |
| korupsi | KPK tangkap bupati korupsi dana bansos | **Positif** | Negatif |
| polusi udara | Jakarta peringkat 1 paling berpolusi | **Negatif** | Positif |
## Training Details
- **Data**: Derived from the same 31,360 context-text pairs used in the 3-class model. Netral samples (17,315) were dropped, leaving 14,045 binary samples (10,357 Negatif / 3,688 Positif).
- **Epochs**: 5 (best at epoch 4, early stopping patience 2)
- **Batch size**: 16
- **Learning rate**: 2e-5
- **Optimizer**: AdamW (weight decay 0.01, warmup ratio 0.1)
- **Loss**: CrossEntropyLoss with class weights (Negatif: 0.678, Positif: 1.904)
- **GPU**: NVIDIA RTX 4090
## When to Use Which Model
| Use Case | Recommended Model |
|----------|-------------------|
| Filter irrelevant text first | [indobert-relevancy-classifier](https://huggingface.co/apriandito/indobert-relevancy-classifier) |
| Full sentiment breakdown (pos/neu/neg) | [indobert-sentiment-classifier](https://huggingface.co/apriandito/indobert-sentiment-classifier) |
| Polarity only (pos/neg) | **This model** |
### Suggested Pipeline
```
Raw Text → Relevancy Filter → Sentiment Analysis (3-class or binary)
```
1. Use [indobert-relevancy-classifier](https://huggingface.co/apriandito/indobert-relevancy-classifier) to filter relevant text
2. Use this model (or the 3-class variant) to classify sentiment on relevant text only
## Related Models
| Model | Task | Labels | Accuracy |
|-------|------|--------|----------|
| [indobert-relevancy-classifier](https://huggingface.co/apriandito/indobert-relevancy-classifier) | Relevancy | Relevant / Not Relevant | 96.5% |
| [indobert-sentiment-classifier](https://huggingface.co/apriandito/indobert-sentiment-classifier) | Sentiment (3-class) | Negatif / Netral / Positif | 88.1% |
| **indobert-binary-sentiment-classifier** | **Sentiment (binary)** | **Negatif / Positif** | **96.06%** |
All three models share the same architecture (IndoBERT Large P2, 335M params) and the same context-conditioned input format (`[CLS] context [SEP] text [SEP]`).
## Citation
```bibtex
@misc{saputra2026indobert-binary-sentiment,
title={IndoBERT Binary Sentiment Classifier: Context-Conditioned Binary Sentiment Classification for Indonesian Text},
author={Saputra, Muhammad Apriandito Arya},
year={2026},
publisher={Hugging Face},
url={https://huggingface.co/apriandito/indobert-binary-sentiment-classifier}
}
```