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..80e1fd3e7 --- /dev/null +++ b/EmotionDetection/emotion_detection.py @@ -0,0 +1,46 @@ +import requests +import json + +def emotion_detector(text_to_analyse): + url = 'https://sn-watson-emotion.labs.skills.network/v1/watson.runtime.nlp.v1/NlpService/EmotionPredict' + myobj = { "raw_document": { "text": text_to_analyse } } + header = {"grpc-metadata-mm-model-id": "emotion_aggregated-workflow_lang_en_stock"} + 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.get('anger', 0) + disgust = emotions.get('disgust', 0) + fear = emotions.get('fear', 0) + joy = emotions.get('joy', 0) + sadness = emotions.get('sadness', 0) + + emotion_scores = { + 'anger': anger, + 'disgust': disgust, + 'fear': fear, + 'joy': joy, + 'sadness': sadness + } + dominant_emotion = max(emotion_scores, key=emotion_scores.get) + + return { + 'anger': anger, + 'disgust': disgust, + 'fear': fear, + 'joy': joy, + 'sadness': sadness, + 'dominant_emotion': dominant_emotion + } + elif response.status_code == 400: + formatted_response ={ + 'anger': None, + 'disgust': None, + 'fear': None, + 'joy': None, + 'sadness': None, + 'dominant_emotion': None} + return formatted_response + + \ No newline at end of file diff --git a/server.py b/server.py new file mode 100644 index 000000000..9737f6f8f --- /dev/null +++ b/server.py @@ -0,0 +1,41 @@ +""" +Emotion Detection Server + +This Flask script implements an emotion detection server for user-provided text. +Author:Krishna +""" +from flask import Flask, render_template, request +from EmotionDetection.emotion_detection import emotion_detector +app = Flask("Emotion Detection") + +def run_emotion_detection(): + """ + Main function to run the Emotion Detection application. + """ + +@app.route("/emotionDetector") + +def sent_detector(): + """ + Analyze the user-provided text for emotions and return the result. + """ + text_to_detect = request.args.get('textToAnalyze') + formated_response = emotion_detector(text_to_detect) + if formated_response['dominant_emotion'] is None: + return "Invalid text! Please try again." + return ( + f"For the given statement, the system response is 'anger': {formated_response['anger']} " + f"'disgust': {formated_response['disgust']}, 'fear': {formated_response['fear']}, " + f"'joy': {formated_response['joy']} and 'sadness': {formated_response['sadness']}. " + f"The dominant emotion is {formated_response['dominant_emotion']}." + ) + +@app.route("/") +def render_index_page(): + ''' This function initiates the rendering of the main application + page over the Flask channel + ''' + return render_template('index.html') + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000) diff --git a/test_emotion_detection.py b/test_emotion_detection.py new file mode 100644 index 000000000..192feaff0 --- /dev/null +++ b/test_emotion_detection.py @@ -0,0 +1,21 @@ +from EmotionDetection.emotion_detection import emotion_detector +import unittest + +class TestEmotionDetection(unittest.TestCase): + def test_emotion_detection(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') + +unittest.main()