AspectBERT / README.md
itismeTithi's picture
Deploy AspectBERT Streamlit app
31f6bcb
|
Raw
History Blame Contribute Delete
4.45 kB
---
title: AspectBERT
emoji: πŸ”‹
colorFrom: blue
colorTo: green
sdk: streamlit
sdk_version: "1.28.0"
app_file: app.py
pinned: false
license: mit
tags:
- aspect-based-sentiment-analysis
- distilbert
- text-classification
- amazon-reviews
- absa
---
# AspectBERT
AspectBERT is a fine-tuned **DistilBERT** model for **Aspect-Based Sentiment
Analysis (ABSA)** on Amazon product reviews. Given a single review, it
predicts the sentiment (**positive / neutral / negative**) for each of 8
product aspects independently.
## Aspects
```
battery, display, camera, price, performance, design, software, customer_service
```
## Model description
- **Base model:** [`distilbert-base-uncased`](https://huggingface.co/distilbert-base-uncased)
- **Input format:** `"{review_text} aspect: {aspect_name}"`
- **Architecture:** DistilBERT backbone (first 4 of 6 transformer layers
frozen, last 2 fine-tuned) β†’ `Linear(768, 256)` β†’ `GELU` β†’
`Dropout(0.2)` β†’ `Linear(256, 3)`
- **Output:** 3-way softmax over `negative`, `neutral`, `positive`
## Training data
- **Source:** [`McAuley-Lab/Amazon-Reviews-2023`](https://huggingface.co/datasets/McAuley-Lab/Amazon-Reviews-2023)
(`raw_review_Electronics` config), ~25,000 sampled reviews
- **Aspect labeling:** keyword matching β€” each review can produce multiple
rows, one per detected aspect
- **Sentiment labeling:** derived from the review's star rating
- 4–5 stars β†’ `positive`
- 3 stars β†’ `neutral`
- 1–2 stars β†’ `negative`
- **Split:** 70% train / 15% validation / 15% test
## Training procedure
- **Optimizer:** AdamW (`lr=2e-5`, `weight_decay=0.01`)
- **Scheduler:** OneCycleLR, 10% warmup, cosine decay
- **Epochs:** 4
- **Batch size:** 16 (CPU) / 32 (GPU)
- **Loss:** Cross-entropy
- **Model selection:** best checkpoint by validation macro F1
Training history is logged to [`results/training_history.json`](results/training_history.json).
## Evaluation
Reported on the held-out test split (15%):
- Macro F1
- Accuracy
- Per-class F1 (negative / neutral / positive)
- Confusion matrix
- Comparison against a [VADER](https://github.com/cjhutto/vaderSentiment)
rule-based sentiment baseline (review-level, not aspect-aware)
Results are written to `results/test_metrics.json` after training
(see `src/train.py`).
## How to use
### Python (HuggingFace Hub)
```python
import os
os.environ["HF_MODEL_NAME"] = "<your-username>/aspectbert"
from src.inference import load_model, predict_all_aspects
model, tokenizer, device = load_model()
results = predict_all_aspects(
model, tokenizer, device,
"The battery lasts forever but the camera is disappointing in low light."
)
print(results)
# {
# "battery": {"label": "positive", "scores": {...}},
# "camera": {"label": "negative", "scores": {...}},
# ...
# }
```
### Command line
```bash
python src/inference.py "Great screen but the battery dies way too fast." --aspect battery
```
### Streamlit app
```bash
export HF_MODEL_NAME="<your-username>/aspectbert"
streamlit run app.py
```
The app supports:
- Free-text review input + 4 example reviews
- Per-aspect sentiment with confidence bars
- A radar chart of positive-sentiment scores across aspects
- LIME word-importance explanations
- A toggle to compare against a VADER baseline
## Project structure
```
AspectBERT/
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ constants.py # shared aspects, label maps, input formatting
β”‚ β”œβ”€β”€ data_preparation.py # download, clean, aspect labeling, splits
β”‚ β”œβ”€β”€ model.py # DistilBERT + classification head
β”‚ β”œβ”€β”€ train.py # training loop, evaluation, checkpointing
β”‚ └── inference.py # predict single review, all aspects, LIME
β”œβ”€β”€ notebooks/
β”‚ └── training.ipynb # Kaggle/Colab GPU training notebook
β”œβ”€β”€ app.py # Streamlit UI
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ deploy_to_hf.sh # push app to a HuggingFace Space
└── README.md
```
## Limitations
- Aspect labels are derived from keyword matching, which is noisy and may
miss implicit aspect mentions or mislabel sarcasm.
- Sentiment labels are derived from the overall review rating, not
aspect-specific ratings, so an aspect's true sentiment may occasionally
differ from the review's overall rating.
- Trained on Electronics category reviews; may not generalize well to other
product categories.
## License
MIT