Spaces:
Sleeping
Sleeping
| # import tensorflow as tf | |
| # import numpy as np | |
| # import os | |
| # import pandas as pd | |
| # from flask import Flask, request, jsonify | |
| # import joblib | |
| # import sklearn | |
| # import re | |
| # from helpers.helper_functions import remove_html_tags, remove_url, remove_digits, remove_punc, lower | |
| # from models import Model | |
| # from werkzeug.exceptions import RequestEntityTooLarge | |
| # # Configure TensorFlow logging | |
| # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' | |
| # os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' | |
| # app = Flask(__name__) | |
| # app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 * 1024 # 16 GB max-limit | |
| # # Initialize model | |
| # model = Model() | |
| # # Define label mappings | |
| # SENTIMENT_LABELS = ['negative', 'neutral', 'positive'] | |
| # EMOTION_LABELS = ['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'] | |
| # @app.route('/') | |
| # def index(): | |
| # return 'Model deployed successfully' | |
| # @app.route('/predict', methods=['POST']) | |
| # def predict(): | |
| # try: | |
| # # Validate request | |
| # data = request.get_json() | |
| # if not data: | |
| # return jsonify({'error': 'No input provided'}), 400 | |
| # # Handle array of objects | |
| # if isinstance(data, list): | |
| # texts = [] | |
| # tweet_ids = [] | |
| # for item in data: | |
| # if not isinstance(item, dict) or 'text' not in item or 'id' not in item or not isinstance(item['text'], str): | |
| # return jsonify({'error': f'Invalid object format: {item}. Each object must have "id" and "text" keys with a string value for "text"'}), 400 | |
| # texts.append(item['text']) | |
| # tweet_ids.append(item['id']) | |
| # else: | |
| # return jsonify({'error': 'Input must be an array of objects'}), 400 | |
| # results = [] | |
| # for idx, text in enumerate(texts): | |
| # # Preprocess text for sentiment | |
| # text_sentiment = text | |
| # text_sentiment = remove_html_tags(text_sentiment) | |
| # text_sentiment = lower(text_sentiment) | |
| # # Preprocess text for emotion | |
| # text_emotion = text | |
| # text_emotion = remove_html_tags(text_emotion) | |
| # text_emotion = remove_url(text_emotion) | |
| # text_emotion = remove_digits(text_emotion) | |
| # text_emotion = remove_punc(text_emotion) | |
| # # Convert to tensors and get predictions | |
| # sentiment_tensor = tf.convert_to_tensor([text_sentiment]) | |
| # emotion_tensor = tf.convert_to_tensor([text_emotion]) | |
| # print(f"Sentiment tensor shape: {sentiment_tensor.shape}") | |
| # print(f"Emotion tensor shape: {emotion_tensor.shape}") | |
| # sentiment_pred, emotion_pred = model.predict( | |
| # text_sentiment=sentiment_tensor, | |
| # text_emotion=emotion_tensor | |
| # ) | |
| # print(f"Sentiment prediction shape: {sentiment_pred.shape}") | |
| # print(f"Emotion prediction shape: {emotion_pred.shape}") | |
| # print(f"Sentiment prediction: {sentiment_pred}") | |
| # print(f"Emotion prediction: {emotion_pred}") | |
| # # Process predictions | |
| # sentiment_idx = int(np.argmax(sentiment_pred, axis=1)[0]) | |
| # emotion_idx = int(np.argmax(emotion_pred, axis=1)[0]) | |
| # print(f"Sentiment index: {sentiment_idx}") | |
| # print(f"Emotion index: {emotion_idx}") | |
| # # Create result object including tweet_id | |
| # result = { | |
| # 'id': tweet_ids[idx], # Add the tweet_id | |
| # 'text': text, | |
| # 'sentiment': { | |
| # 'label': SENTIMENT_LABELS[sentiment_idx], | |
| # 'score': float(sentiment_pred[0][sentiment_idx]), | |
| # 'raw_scores': [float(score) for score in sentiment_pred[0]] | |
| # }, | |
| # 'emotion': { | |
| # 'label': EMOTION_LABELS[emotion_idx], | |
| # 'score': float(emotion_pred[0][emotion_idx]), | |
| # 'raw_scores': [float(score) for score in emotion_pred[0]] | |
| # } | |
| # } | |
| # results.append(result) | |
| # return jsonify({'results': results}) | |
| # except RequestEntityTooLarge: | |
| # return jsonify({'error': 'Request Entity Too Large'}), 413 | |
| # except IndexError as e: | |
| # return jsonify({'error': f'IndexError: {str(e)}'}), 500 | |
| # except Exception as e: | |
| # return jsonify({'error': f'Unexpected error: {str(e)}'}), 400 | |
| # if __name__ == '__main__': | |
| # app.run(host='0.0.0.0' ,port=7860, debug=False) | |
| import tensorflow as tf | |
| import numpy as np | |
| import os | |
| import pandas as pd | |
| from flask import Flask, request, jsonify | |
| from helpers.helper_functions import remove_html_tags, remove_url, remove_digits, remove_punc, lower | |
| from models import Model | |
| from werkzeug.exceptions import RequestEntityTooLarge | |
| # Configure TensorFlow logging and GPU | |
| os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Suppress warnings | |
| os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' | |
| physical_devices = tf.config.list_physical_devices('GPU') | |
| if physical_devices: | |
| tf.config.experimental.set_memory_growth(physical_devices[0], True) | |
| app = Flask(__name__) | |
| app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 * 1024 # 16 GB max-limit | |
| # Initialize model globally | |
| model = Model() | |
| # Define label mappings | |
| SENTIMENT_LABELS = ['negative', 'neutral', 'positive'] | |
| EMOTION_LABELS = ['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'] | |
| # Vectorized preprocessing function | |
| def preprocess_batch(texts, for_emotion=False): | |
| df = pd.Series(texts) | |
| df = df.apply(remove_html_tags).str.lower() | |
| if for_emotion: | |
| df = df.apply(remove_url).apply(remove_digits).apply(remove_punc) | |
| return df.tolist() | |
| def index(): | |
| return 'Model deployed successfully' | |
| def predict(): | |
| try: | |
| # Validate request | |
| data = request.get_json() | |
| if not data or not isinstance(data, list): | |
| return jsonify({'error': 'Input must be an array of objects'}), 400 | |
| # Extract texts and IDs | |
| texts = [] | |
| tweet_ids = [] | |
| for item in data: | |
| if not isinstance(item, dict) or 'text' not in item or 'id' not in item or not isinstance(item['text'], str): | |
| return jsonify({'error': f'Invalid object format: {item}'}), 400 | |
| texts.append(item['text']) | |
| tweet_ids.append(item['id']) | |
| # Batch preprocessing | |
| texts_sentiment = preprocess_batch(texts, for_emotion=False) | |
| texts_emotion = preprocess_batch(texts, for_emotion=True) | |
| # Convert to tensors and ensure tf.string dtype | |
| sentiment_tensor = tf.convert_to_tensor(texts_sentiment, dtype=tf.string) | |
| emotion_tensor = tf.convert_to_tensor(texts_emotion, dtype=tf.string) | |
| # Batch inference | |
| sentiment_preds, emotion_preds = model.predict( | |
| text_sentiment=sentiment_tensor, | |
| text_emotion=emotion_tensor | |
| ) | |
| # Process predictions | |
| results = [] | |
| for idx, (sentiment_pred, emotion_pred) in enumerate(zip(sentiment_preds, emotion_preds)): | |
| sentiment_idx = int(np.argmax(sentiment_pred)) | |
| emotion_idx = int(np.argmax(emotion_pred)) | |
| result = { | |
| 'id': tweet_ids[idx], | |
| 'text': texts[idx], | |
| 'sentiment': { | |
| 'label': SENTIMENT_LABELS[sentiment_idx], | |
| 'score': float(sentiment_pred[sentiment_idx]), | |
| 'raw_scores': [float(score) for score in sentiment_pred] | |
| }, | |
| 'emotion': { | |
| 'label': EMOTION_LABELS[emotion_idx], | |
| 'score': float(emotion_pred[emotion_idx]), | |
| 'raw_scores': [float(score) for score in emotion_pred] | |
| } | |
| } | |
| results.append(result) | |
| return jsonify({'results': results}) | |
| except RequestEntityTooLarge: | |
| return jsonify({'error': 'Request Entity Too Large'}), 413 | |
| except Exception as e: | |
| return jsonify({'error': f'Unexpected error: {str(e)}'}), 500 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0' ,port=7860, debug=False) |