| from transformers import XLMRobertaTokenizer, XLMRobertaForSequenceClassification |
| from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer |
| from fastapi import FastAPI, HTTPException |
| from pydantic import BaseModel |
| from huggingface_hub import login |
| import logging |
| import torch |
| import os |
|
|
| login(token=os.getenv("HF_TOKEN")) |
|
|
| logging.basicConfig( |
| level=logging.INFO, |
| format="%(asctime)s - %(levelname)s - %(message)s", |
| handlers= |
| [logging.FileHandler('app.log'), |
| logging.StreamHandler()] |
| ) |
|
|
| logger = logging.getLogger(__name__) |
|
|
| model = XLMRobertaForSequenceClassification.from_pretrained('shae2977/xlm-roberta-hinglish-sentiment-analysis') |
| tokenizer = XLMRobertaTokenizer.from_pretrained('shae2977/xlm-roberta-hinglish-sentiment-analysis') |
|
|
| vader = SentimentIntensityAnalyzer() |
|
|
| def return_sentiment(comment): |
| score = vader.polarity_scores(comment)['compound'] |
| label = None |
| if score >= 0.05: |
| label = 'Positive' |
| elif score <= -0.05: |
| label = 'Negative' |
| else: |
| label = 'Neutral' |
| return label |
|
|
| app = FastAPI() |
|
|
| class commentsinput(BaseModel): |
| comments : list[str] |
|
|
| @app.get('/') |
| def home(): |
| return {'message' : 'Server is running!'} |
|
|
| @app.post('/predict') |
| def predict(input: commentsinput): |
| if not input.comments: |
| logger.error('Comment field empty') |
| raise HTTPException(status_code=400, detail='Comments field empty') |
| |
| logger.info("Comment batch of %s comments recieved",len(input.comments)) |
| |
| try: |
|
|
| |
| results = [] |
|
|
| batch_size = 50 |
| for i in range(0, len(input.comments),batch_size): |
| batch = input.comments[i:batch_size+i] |
| comment_tokens = tokenizer(batch, padding=True, truncation=True, return_tensors='pt') |
| outputs = model(**comment_tokens) |
| pred = torch.argmax(outputs.logits, dim=1) |
| predictions = pred.numpy().tolist() |
| results.extend(predictions) |
|
|
| label_map = {0: 'Negative', 1: 'Neutral', 2: 'Positive'} |
|
|
| roberta_preds = [] |
| for r in results: |
| roberta_preds.append(label_map[r]) |
|
|
| |
| vader_preds = [] |
| for comment in input.comments: |
| vader_preds.append(return_sentiment(comment)) |
|
|
| logger.info('Prediction successful') |
|
|
| return {'xlm-ROBERTa Predictions' : roberta_preds, |
| 'VADER Predictions' : vader_preds} |
| |
| except Exception as e: |
| logger.error('Prediction failed: %s',e) |
| raise HTTPException(status_code=500, detail=e) |
|
|