diff --git a/EmotionDetection/__init__.py b/EmotionDetection/__init__.py new file mode 100644 index 000000000..1727e5ed8 --- /dev/null +++ b/EmotionDetection/__init__.py @@ -0,0 +1 @@ +from . import emotion_detection diff --git a/EmotionDetection/emotion_detection.py b/EmotionDetection/emotion_detection.py new file mode 100644 index 000000000..a84ef7166 --- /dev/null +++ b/EmotionDetection/emotion_detection.py @@ -0,0 +1,37 @@ +import requests +import json + +def emotion_detector(text_to_analyze): + url = 'https://sn-watson-emotion.labs.skills.network/v1/watson.runtime.nlp.v1/NlpService/EmotionPredict' + header = {"grpc-metadata-mm-model-id": "emotion_aggregated-workflow_lang_en_stock"} + myobj = { "raw_document": { "text": text_to_analyze } } + response = requests.post(url, json = myobj, headers=header) + formatted_response = json.loads(response.text) + + + if response.status_code == 200: + emotions = formatted_response['emotionPredictions'][0]['emotion'] + anger = emotions['anger'] + disgust = emotions['disgust'] + fear = emotions['fear'] + joy = emotions['joy'] + sadness = emotions['sadness'] + dominant_emotion = max(emotions, key=emotions.get) + elif response.status_code == 400: + anger = None + disgust = None + fear = None + joy = None + sadness = None + dominant_emotion = None + elif response.status_code == 500: + anger = None + disgust = None + fear = None + joy = None + sadness = None + dominant_emotion = None + + return {'anger': anger, 'disgust': disgust, 'fear': fear, 'joy': joy, 'sadness': sadness, 'dominant_emotion': dominant_emotion} + + diff --git a/server.py b/server.py new file mode 100644 index 000000000..419b3ced0 --- /dev/null +++ b/server.py @@ -0,0 +1,33 @@ +""" imports flask and other methods""" +from flask import Flask, render_template, request +from EmotionDetection.emotion_detection import emotion_detector + +app = Flask("Emotion Detector") + +@app.route("/emotionDetector") +def sent_detector(): + """generate a response message given input""" + + text_to_analyze = request.args.get('textToAnalyze') + response = emotion_detector(text_to_analyze) + + anger = response['anger'] + disgust = response['disgust'] + fear = response['fear'] + joy = response['joy'] + sadness = response['sadness'] + dominant_emotion = response['dominant_emotion'] + + if dominant_emotion is None: + return "Invalid text! Please try again!" + return "For the given statement, the system response is 'anger': {}, 'disgust': {}, 'fear': {}, 'joy': {}, and 'sadness': {}. The dominant emotion is {}.".format(anger, disgust, fear, joy, sadness, dominant_emotion) # pylint: disable=line-too-long # pylint: disable=consider-using-f-string + + +@app.route("/") +def render_index_page(): + """render page""" + return render_template('index.html') + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000) + \ No newline at end of file diff --git a/test_emotion_detection.py b/test_emotion_detection.py new file mode 100644 index 000000000..c598018fb --- /dev/null +++ b/test_emotion_detection.py @@ -0,0 +1,24 @@ +from EmotionDetection.emotion_detection import emotion_detector +import unittest + +class TestEmotionDetector(unittest.TestCase): + def test_emotion_detector(self): + result_1 = emotion_detector('I am glad this happened') + self.assertEqual(result_1['dominant_emotion'], 'joy') + + result_2 = emotion_detector('I am really mad about this') + self.assertEqual(result_2['dominant_emotion'], 'anger') + + result_3 = emotion_detector('I feel disgusted just hearing about this') + self.assertEqual(result_3['dominant_emotion'], 'disgust') + + result_4 = emotion_detector('I am so sad about this') + self.assertEqual(result_4['dominant_emotion'], 'sadness') + + result_5 = emotion_detector('I am really afraid that this will happen') + self.assertEqual(result_5['dominant_emotion'], 'fear') + + result_6 = emotion_detector(' ') + self.assertEqual(result_6['dominant_emotion'], None) + +unittest.main() \ No newline at end of file