Spaces:
Running
Running
license: apache-2.0 | |
title: NegaBot | |
sdk: docker | |
emoji: π | |
colorFrom: blue | |
colorTo: pink | |
short_description: 'Product Negative Reviews detection & Analsis API. ' | |
# NegaBot API | |
**Tweet Sentiment Classification using SmolLM 360M V2 Model** | |
NegaBot is a sentiment analysis API that detects positive and negative sentiment in tweets, particularly focusing on product criticism detection. Built with FastAPI and the `jatinmehra/NegaBot-Product-Criticism-Catcher` model. | |
## Features | |
- **Advanced AI Model**: Uses fine-tuned SmolLM 360M V2 for accurate sentiment classification; Trained on real tweets data and can detect negative comments with sarcasm. | |
- **Fast API**: RESTful API built with FastAPI for high-performance predictions | |
- **Data Logging**: SQLite database for storing and analyzing predictions | |
- **Batch Processing**: Support for single and batch predictions | |
- **Built-in Dashboard**: HTML analytics dashboard with charts | |
- **Data Export**: Download predictions as CSV or JSON | |
## Quick Start | |
1. **Install Dependencies** | |
```bash | |
pip install -r requirements.txt | |
``` | |
2. **Start the API** | |
```bash | |
uvicorn api:app --host 0.0.0.0 --port 8000 | |
``` | |
3. **Access the Services** | |
- API Documentation: http://localhost:8000/docs | |
- Analytics Dashboard: http://localhost:8000/dashboard | |
## Usage Examples | |
### API Usage | |
#### Single Prediction | |
```bash | |
curl -X POST "http://localhost:8000/predict" \ | |
-H "Content-Type: application/json" \ | |
-d '{"text": "This product is amazing! Best purchase ever!"}' | |
``` | |
#### Batch Prediction | |
```bash | |
curl -X POST "http://localhost:8000/batch_predict" \ | |
-H "Content-Type: application/json" \ | |
-d '{ | |
"tweets": [ | |
"Amazing product, highly recommend!", | |
"Terrible quality, waste of money", | |
"Its okay, nothing special" | |
] | |
}' | |
``` | |
#### Python Client Example | |
```python | |
import requests | |
# Single prediction | |
response = requests.post( | |
"http://localhost:8000/predict", | |
json={"text": "This product broke after one week!"} | |
) | |
result = response.json() | |
print(f"Sentiment: {result['sentiment']} (Confidence: {result['confidence']:.2%})") | |
# Batch prediction | |
response = requests.post( | |
"http://localhost:8000/batch_predict", | |
json={ | |
"tweets": [ | |
"Love this product!", | |
"Terrible experience", | |
"Pretty decent quality" | |
] | |
} | |
) | |
results = response.json() | |
for result in results['results']: | |
print(f"'{result['text']}' -> {result['sentiment']}") | |
``` | |
### Model Usage (Direct) | |
```python | |
from model import NegaBotModel | |
# Initialize model | |
model = NegaBotModel() | |
# Single prediction | |
result = model.predict("This product is awful and broke within a week!") | |
print(f"Sentiment: {result['sentiment']}") | |
print(f"Confidence: {result['confidence']:.2%}") | |
print(f"Probabilities: {result['probabilities']}") | |
# Batch prediction | |
texts = [ | |
"Amazing quality, highly recommend!", | |
"Terrible customer service", | |
"Pretty good value for money" | |
] | |
results = model.batch_predict(texts) | |
for result in results: | |
print(f"{result['text']} -> {result['sentiment']}") | |
``` | |
## API Endpoints | |
| Endpoint | Method | Description | | |
|----------|--------|-------------| | |
| `/` | GET | API information and available endpoints | | |
| `/health` | GET | Health check and model status | | |
| `/predict` | POST | Single tweet sentiment prediction | | |
| `/batch_predict` | POST | Batch tweet sentiment prediction | | |
| `/stats` | GET | Prediction statistics and analytics | | |
| `/dashboard` | GET | HTML analytics dashboard | | |
| `/dashboard/data` | GET | Dashboard data as JSON | | |
| `/download/predictions.csv` | GET | Download predictions as CSV | | |
| `/download/predictions.json` | GET | Download predictions as JSON | | |
### Request/Response Schemas | |
#### Predict Request | |
```json | |
{ | |
"text": "string (1-1000 chars)", | |
"metadata": { | |
"optional": "metadata object" | |
} | |
} | |
``` | |
#### Predict Response | |
```json | |
{ | |
"text": "input text", | |
"sentiment": "Positive|Negative", | |
"confidence": 0.95, | |
"predicted_class": 0, | |
"probabilities": { | |
"positive": 0.95, | |
"negative": 0.05 | |
}, | |
"timestamp": "2024-01-01T12:00:00" | |
} | |
``` | |
## Dashboard Features | |
The built-in analytics dashboard provides: | |
- **Real-time Metrics**: Total predictions, sentiment distribution, average confidence | |
- **Interactive Charts**: Pie charts showing sentiment distribution | |
- **Recent Predictions**: View latest prediction results | |
- **Data Export**: Download prediction data as CSV or JSON | |
- **Auto-refresh**: View updated statistics as new predictions are made | |
## Testing | |
Test the API using the interactive documentation at http://localhost:8000/docs or use curl commands as shown in the usage examples above. | |
## Project Structure | |
``` | |
NegaBot-API/ | |
βββ api.py # FastAPI application | |
βββ model.py # NegaBot model wrapper | |
βββ database.py # SQLite database and logging | |
βββ requirements.txt # Python dependencies | |
βββ Dockerfile # Docker configuration | |
βββ README.md # This file | |
βββ negabot_predictions.db # Database (created at runtime) | |
``` | |
## Configuration | |
The API runs on port 8000 by default. You can modify the host and port by updating the uvicorn command: | |
```bash | |
uvicorn api:app --host 127.0.0.1 --port 8080 | |
``` | |
## Model Information | |
- **Model**: `jatinmehra/NegaBot-Product-Criticism-Catcher` | |
- **Base Architecture**: SmolLM 360M V2 | |
- **Task**: Binary sentiment classification | |
- **Classes**: | |
- 0: Positive sentiment | |
- 1: Negative sentiment (criticism/complaints) | |
- **Input**: Text (max 512 tokens) | |
- **Output**: Sentiment label + confidence scores | |
### Performance Considerations | |
- **Memory Requirements**: Model requires ~2GB RAM minimum | |
- **API Scaling**: Use multiple worker processes with Gunicorn for production | |
- **Database**: Current SQLite setup is suitable for development and small-scale production | |
## Logging and Monitoring | |
### Database Schema | |
```sql | |
CREATE TABLE predictions ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, | |
text TEXT NOT NULL, | |
sentiment TEXT NOT NULL, | |
confidence REAL NOT NULL, | |
predicted_class INTEGER NOT NULL, | |
timestamp TEXT NOT NULL, | |
metadata TEXT, | |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP | |
); | |
``` | |
### Log Files | |
- Application logs: Console output | |
- Prediction logs: SQLite database | |
- Access logs: Uvicorn/Gunicorn logs | |
## Contributing | |
1. Fork the repository | |
2. Create a feature branch | |
3. Add tests for new features | |
4. Ensure all tests pass | |
5. Submit a pull request | |
## License | |
This project is licensed under the Apache-2.0 License - see the [LICENSE](LICENSE) file for details. | |
## Troubleshooting | |
### Common Issues | |
1. **Model Loading Errors** | |
- Ensure internet connection for downloading the model | |
- Check disk space (model is ~1.5GB) | |
- Verify transformers library version | |
2. **Port Conflicts** | |
- Change ports using command line arguments | |
- Check if port 8000 is already in use | |
3. **Database Permissions** | |
- Ensure write permissions in the project directory | |
- Check SQLite installation | |
4. **Memory Issues** | |
- Model requires ~2GB RAM minimum | |
- Consider using CPU-only inference for smaller systems | |
--- | |
**Built with FastAPI and the powerful NegaBot model.** | |
Model used in this app-https://github.com/Jatin-Mehra119/NegaBot-Product-Criticism-Catcher |