diff --git a/EmotionDetection/__init__.py b/EmotionDetection/__init__.py new file mode 100644 index 000000000..d69073368 --- /dev/null +++ b/EmotionDetection/__init__.py @@ -0,0 +1 @@ +from . import emotion_detection \ No newline at end of file diff --git a/EmotionDetection/emotion_detection.py b/EmotionDetection/emotion_detection.py new file mode 100644 index 000000000..648941cbd --- /dev/null +++ b/EmotionDetection/emotion_detection.py @@ -0,0 +1,39 @@ +import requests, json + +def emotion_detector(text_to_analyze): + url = 'https://sn-watson-emotion.labs.skills.network/v1/watson.runtime.nlp.v1/NlpService/EmotionPredict' + myobj = { "raw_document": { "text": text_to_analyze } } + header = {"grpc-metadata-mm-model-id": "emotion_aggregated-workflow_lang_en_stock"} + response = requests.post(url, json = myobj, headers=header) + + if response.status_code == 400: + response_text = ( + { + "anger": None, + "disgust": None, + "fear": None, + "joy": None, + "sadness": None, + "dominant_emotion": None + } + ) + + return response_text + else: + + formatted_response = json.loads(response.text) + emotions = formatted_response['emotionPredictions'][0]['emotion'] + + emotions['dominant_emotion'] = max(emotions, key=emotions.get) + + response_text = ( + f"For the given statement, the system response is " + f"'anger': {emotions['anger']}, " + f"'disgust': {emotions['disgust']}, " + f"'fear': {emotions['fear']}, " + f"'joy': {emotions['joy']} and " + f"'sadness': {emotions['sadness']}. " + f"The dominant emotion is {emotions['dominant_emotion']}." + ) + + return response_text diff --git a/server.py b/server.py new file mode 100644 index 000000000..283c7681a --- /dev/null +++ b/server.py @@ -0,0 +1,25 @@ +"""Flask app for detecting emotions from text input.""" + +from flask import Flask, render_template, request +from EmotionDetection.emotion_detection import emotion_detector + +app = Flask("Emotion Detector") + +@app.route("/") +def render_index_page(): + """Render the home page.""" + return render_template("index.html") + +@app.route("/emotionDetector") +def emotion_detect(): + """Handle emotion detection requests.""" + text_to_analyze = request.args.get("textToAnalyze") + response = emotion_detector(text_to_analyze) + + if response["dominant_emotion"] is not None: + return response + + return "Invalid text! Please try again!" + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5003) diff --git a/test_emotion_detection.py b/test_emotion_detection.py new file mode 100644 index 000000000..e6e537a9c --- /dev/null +++ b/test_emotion_detection.py @@ -0,0 +1,22 @@ +from EmotionDetection.emotion_detection import emotion_detector +import unittest + +class TestEmotionDetector(unittest.TestCase): + def test_emotion_detector(self): + # Test case for joy emotion + result_1 = emotion_detector('I am glad this happened') + self.assertEqual(result_1['dominant_emotion'], 'joy') + # Test case for anger emotion + result_2 = emotion_detector('I am really mad about this') + self.assertEqual(result_2['dominant_emotion'], 'anger') + # Test case for disgust emotion + result_3 = emotion_detector('I feel disgusted just hearing about this') + self.assertEqual(result_3['dominant_emotion'], 'disgust') + # Test case for sadness emotion + result_4 = emotion_detector('I am so sad about this') + self.assertEqual(result_4['dominant_emotion'], 'sadness') + # Test case for fear emotion + result_5 = emotion_detector('I am really afraid that this will happen') + self.assertEqual(result_5['dominant_emotion'], 'fear') + +unittest.main() \ No newline at end of file