Arvind111's picture
Upload 2 files
7711d44 verified
from flask import Flask, request, jsonify
from transformers import pipeline
import logging
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
app = Flask(__name__)
# Load the sentiment analysis pipeline from Hugging Face
# This will download the model if not already cached
logging.info("Loading sentiment analysis pipeline...")
# For the purpose of this app, we assume the model to be loaded will be 'Arvind111/bert_sentiment-analysis-model' if pushed.
# For local testing, you might use a general sentiment model, but the task specifies using the pushed model.
# Placeholder for the actual model to be loaded from HF. For now, using a general one for structure.
# In a real deployment, we'd replace 'distilbert-base-uncased-finetuned-sst-2-english' with 'Arvind111/bert_sentiment-analysis-model'
# once it's pushed and available.
classifier = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
logging.info("Sentiment analysis pipeline loaded.")
# Define the label mapping as per the trained model (0=Sad, 1=Happy, 2=Neutral)
# The simpletransformers model outputs 0, 1, 2 directly, but the transformers pipeline might output LABEL_0, LABEL_1, etc.
# We need to map these to our desired labels. The simpletransformers model's labels were 0: Sad, 1: happy, 2: Neutral
# If the pipeline returns LABEL_0, LABEL_1, LABEL_2 based on the fine-tuned model, we map accordingly.
# Assuming LABEL_0 -> Sad, LABEL_1 -> Happy, LABEL_2 -> Neutral based on the training data order.
label_mapping = {
'LABEL_0': 'Sad',
'LABEL_1': 'Happy',
'LABEL_2': 'Neutral'
}
@app.route('/')
def home():
return "Welcome to the Emotion Prediction API! Use the /predict endpoint."
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json(force=True)
text = data.get('text', '')
if not text:
logging.warning("Received empty text for prediction.")
return jsonify({'error': 'No text provided for prediction'}), 400
try:
# The pipeline returns a list of dictionaries, e.g., [{'label': 'LABEL_1', 'score': 0.999}]
prediction_result = classifier(text)[0]
predicted_label_code = prediction_result['label']
score = prediction_result['score']
# Map the Hugging Face label code to our custom emotion label
emotion = label_mapping.get(predicted_label_code, 'Unknown')
response = {
'text': text,
'predicted_emotion': emotion,
'confidence': score
}
logging.info(f"Prediction made for text: '{text[:50]}' - Emotion: {emotion}, Confidence: {score:.4f}")
return jsonify(response)
except Exception as e:
logging.error(f"Error during prediction for text: '{text[:50]}' - Error: {e}", exc_info=True)
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
# Use a default port or get it from environment variables for deployment
port = 5000
logging.info(f"Starting Flask app on port {port}")
app.run(host='0.0.0.0', port=port)