-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathfinal.py
108 lines (69 loc) · 2.58 KB
/
final.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
#!/usr/bin/env python
# coding: utf-8
# In[1]:
from flask import Flask, request, jsonify, make_response
from flask_cors import CORS, cross_origin
import json
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# In[2]:
app = Flask(__name__)
CORS(app)
#app.config['CORS_HEADERS'] = 'Content-Type'
with open('interview1.json') as file:
data = json.load(file)
# In[3]:
from sklearn.preprocessing import LabelEncoder
# In[4]:
training_sentences = []
training_labels = []
labels = []
responses = []
for intent in data['intents']:
for pattern in intent['patterns']:
training_sentences.append(pattern)
training_labels.append(intent['tag'])
responses.append(intent['responses'])
if intent['tag'] not in labels:
labels.append(intent['tag'])
# In[5]:
enc = LabelEncoder()
enc.fit(training_labels)
training_labels = enc.transform(training_labels)
# In[6]:
vocab_size = 10000
embedding_dim = 16
max_len = 20
trunc_type = 'post'
oov_token = "<OOV>"
tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_token) # adding out of vocabulary token
tokenizer.fit_on_texts(training_sentences)
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(training_sentences)
padded = pad_sequences(sequences, truncating=trunc_type, maxlen=max_len)
classes = len(labels)
model = tf.keras.models.Sequential()
model.add(keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_len))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(classes, activation='softmax'))
training_labels_final = np.array(training_labels)
EPOCHS = 500
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(padded, training_labels_final, epochs=EPOCHS)
@app.route("/<inp>", methods = ["POST"])
@cross_origin()
def output(inp):
string = inp
result = model.predict(pad_sequences(tokenizer.texts_to_sequences([string]),
truncating=trunc_type, maxlen=max_len))
category = enc.inverse_transform([np.argmax(result)])
for i in data['intents']:
if i['tag']==category:
return np.random.choice(i['responses'])
if __name__ == '__main__':
app.run(debug=True)