-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.py
111 lines (93 loc) · 3.65 KB
/
bot.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
import requests as requests
import nltk
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
import pickle
import numpy as np
from keras.models import load_model
model = load_model('chatbot_model.h5')
import json
import random
intents = json.loads(open('intents.json').read())
words = pickle.load(open('words.pkl','rb'))
classes = pickle.load(open('classes.pkl','rb'))
def clean_up_sentence(sentence):
# tokenize the pattern - split words into array
sentence_words = nltk.word_tokenize(sentence)
# stem each word - create short form for word
sentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words]
return sentence_words
# return bag of words array: 0 or 1 for each word in the bag that exists in the sentence
def bow(sentence, words, show_details=True):
# tokenize the pattern
sentence_words = clean_up_sentence(sentence)
# bag of words - matrix of N words, vocabulary matrix
bag = [0]*len(words)
for s in sentence_words:
for i,w in enumerate(words):
if w == s:
# assign 1 if current word is in the vocabulary position
bag[i] = 1
if show_details:
print ("found in bag: %s" % w)
return(np.array(bag))
def predict_class(sentence, model):
# filter out predictions below a threshold
p = bow(sentence, words,show_details=False)
res = model.predict(np.array([p]))[0]
ERROR_THRESHOLD = 0.25
results = [[i,r] for i,r in enumerate(res) if r>ERROR_THRESHOLD]
# sort by strength of probability
results.sort(key=lambda x: x[1], reverse=True)
return_list = []
for r in results:
return_list.append({"intent": classes[r[0]], "probability": str(r[1])})
return return_list
def getResponse(ints, intents_json):
tag = ints[0]['intent']
list_of_intents = intents_json['intents']
for i in list_of_intents:
if(i['tag']== tag):
result = random.choice(i['responses'])
break
return result
def chatbot_response(msg):
ints = predict_class(msg, model)
res = getResponse(ints, intents)
return res
url = "https://api.telegram.org/bot1538490967:AAFkQpEuFEAHCkpLr7_CGwpjDyt9rKnph38/"
# create function that get chat id
def get_chat_id(update):
chat_id = update['message']["chat"]["id"]
return chat_id
# create function that get message text
def get_message_text(update):
message_text = update['message']["text"]
return message_text
# create function that get last_update
def last_update(req):
response = requests.get(req + "getUpdates")
response = response.json()
result = response["result"]
total_updates = len(result) - 1
return result[total_updates]
# create function that let bot send message to user
def send_message(chat_id, message_text):
params = {"chat_id": chat_id, "text": message_text}
response = requests.post(url + "sendMessage", data=params)
return response
# create main function for navigate or reply message back
def main():
update_id = last_update(url)["update_id"]
while True:
update = last_update(url)
if update_id == update["update_id"]:
if get_message_text(update) != "/start":
send_message(get_chat_id(update), chatbot_response(get_message_text(update)))
# if get_message_text(update).lower() == "hi" or get_message_text(update).lower() == "hello":
# send_message(get_chat_id(update), 'Hello Welcome to our bot.')
# else:
# send_message(get_chat_id(update), "Sorry Not Understant what you inputted:(")
update_id += 1
# call the function to make it reply
main()