-
Notifications
You must be signed in to change notification settings - Fork 0
/
Valeti_api_log_reg.py
137 lines (96 loc) · 3.46 KB
/
Valeti_api_log_reg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import re
import nltk
nltk.download('stopwords')
nltk.download('punkt')
import string
import numpy as np
from flask import Flask,jsonify,request
#import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer, WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
nltk.download("stopwords")
stop_words = set(stopwords.words("english"))
lemmatizer= WordNetLemmatizer()
# Load the trained model and label encoder
import pickle
# Load the model from file
with open('log_reg_model.pkl', 'rb') as f:
log_reg = pickle.load(f)
model = log_reg
le = LabelEncoder()
le.classes_ = ['anger', 'fear', 'joy', 'love', 'sadness', 'surprise']
def lemmatization(text):
lemmatizer= WordNetLemmatizer()
text = text.split()
text=[lemmatizer.lemmatize(y) for y in text]
return " " .join(text)
def remove_stop_words(text):
Text=[i for i in str(text).split() if i not in stop_words]
return " ".join(Text)
def Removing_numbers(text):
text=''.join([i for i in text if not i.isdigit()])
return text
def lower_case(text):
text = text.split()
text=[y.lower() for y in text]
return " " .join(text)
def Removing_punctuations(text):
## Remove punctuations
text = re.sub('[%s]' % re.escape("""!"#$%&'()*+,،-./:;<=>؟?@[\]^_`{|}~"""), ' ', text)
text = text.replace('؛',"", )
## remove extra whitespace
text = re.sub('\s+', ' ', text)
text = " ".join(text.split())
return text.strip()
def normalized_sentence(sentence):
sentence= lower_case(sentence)
sentence= remove_stop_words(sentence)
sentence= Removing_numbers(sentence)
sentence= Removing_punctuations(sentence)
sentence= lemmatization(sentence)
return sentence
def get_sentences(paragraph):
# Split the paragraph into sentences
sentences = paragraph.split('.')
# Remove the last empty element (if any)
if sentences[-1] == '':
sentences = sentences[:-1]
# Remove leading/trailing whitespaces from each sentence
sentences = [sentence.strip() for sentence in sentences]
return sentences
app = Flask(__name__)
import numpy as np
@app.route('/predict_emotions/', methods=['POST'])
def predict_emotions_api():
# Get the input paragraph from the request
data = request.json['paragraph']
# Get the list of sentences from the input paragraph
sentences_copy = get_sentences(data)
sentences=[]
for sentence in sentences_copy:
sentences.append(normalized_sentence(sentence))
# Perform emotion prediction for each sentence
emotions = model.predict(sentences)
# Convert emotions to a NumPy array
emotions = np.array(emotions)
# Get unique emotion labels and their counts
unique_emotions, emotion_counts = np.unique(emotions, return_counts=True)
# Calculate emotion percentages
total_emotions = len(emotions)
emotion_percentages = emotion_counts / total_emotions * 100
# Create a dictionary of emotions and percentages
emotion_results = {
emotion: percentage for emotion, percentage in zip(unique_emotions, emotion_percentages)
}
# Prepare the response
response = {
'emotion_percentages': emotion_results
}
# Return the response as JSON
return jsonify(response)
# Run the Flask app
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5002)