в предыдущем мы построили модель чат-бота, обучили и сохранили модель. перед началом этого блога, если вы не видели предыдущий блог вот ссылка.
сначала нам нужно импортировать необходимые пакеты и сохраненную модель и файл pickele с файлом json и поместить файл в переменную:
from tensorflow.keras.preprocessing.text import Tokenizer import pickle import numpy as np from tensorflow.keras.models import load_model import json import random model = load_model('chatbot_model.h5') 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): word_in_sentence_list = [sentence] tokenizer = Tokenizer(num_words=100, oov_token="<OOV>") tokenizer.fit_on_texts(word_in_sentence_list) word_index = tokenizer.word_index sentence_words = list(word_index) 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] max_error = 0.25 results = [[i, r] for i, r in enumerate(res) if r > max_error] # 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) print(ints) res = getResponse(ints, intents) return res # Creating GUI with tkinter def send(msg): if msg != '': res = chatbot_response(msg) return res
Как вы видите, это всего лишь код, в нем нет никаких интерактивных функций пользователя, для этого нам нужно разработать GUI (графический пользовательский интерфейс). потому что GUI (графический интерфейс пользователя) предоставляет пользователям простой и интуитивно понятный способ взаимодействия с программным обеспечением. В отличие от традиционного текстового интерфейса командной строки, графический интерфейс проще в использовании, поскольку в нем используются графические элементы, такие как значки, кнопки и меню. Кроме того, многие пользователи находят графические интерфейсы более привлекательными и менее пугающими, чем интерфейсы командной строки. Помимо упрощения обучения новых или неопытных пользователей программному обеспечению, графический пользовательский интерфейс также упрощает выполнение задач опытными пользователями, обеспечивая более быструю навигацию по меню и параметрам в программах. поэтому мы создадим графический интерфейс, используя kivy framework. Чтобы сказать что-то о kivy, Kivy — это бесплатная среда Python с открытым исходным кодом для разработки мобильных приложений и другого прикладного программного обеспечения с поддержкой мультитач с естественным пользовательским интерфейсом. Он распространяется в соответствии с условиями лицензии MIT и может работать на Android, iOS, Linux, macOS и Windows, а код будет следующим:
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.image import Image from kivy.uix.button import Button from kivy.uix.textinput import TextInput import Gui_Bot gui = Gui_Bot class SayHello(App): def build(self): # returns a window object with all it's widgets self.window = GridLayout() self.window.cols = 0.8 self.window.size_hint = (0.6, 0.7) self.window.pos_hint = {"center_x": 0.5, "center_y": 0.5} # image widget self.window.add_widget(Image(source="welcom.png")) # label widget self.greeting = Label( text="What Can I Help", font_size=18, color='#00FFCE' ) self.window.add_widget(self.greeting) # label widget self.greeting2 = Label( text="-----------", font_size=18, color='#00FFCE' ) self.window.add_widget(self.greeting2) # text input widget self.user = TextInput( multiline=False, padding_y=(10, 10), size_hint=(1, 0.5) ) self.window.add_widget(self.user) # button widget self.button = Button( text="Ask", size_hint=(1, 0.5), bold=True, background_color='#c8c2c0', # remove darker overlay of background colour # background_normal = "" ) self.button.bind(on_press=self.callback) self.window.add_widget(self.button) return self.window def callback(self, instance): # change label text to "Hello + user name!" response = gui.send(self.user.text) self.greeting.text = "Bot: " + response + "!" self.greeting2.text = "You: " + self.user.text + "!" # run Say Hello App Calss if __name__ == "__main__": SayHello().run()
после того, как вы запустите код, появится красивая графика, и он примет ваш вопрос и ответит на него, основываясь на ограниченных знаниях, которые мы дали для модели в обучающих частях нашего дизайна модели, здесь вы можете получить полный код проекта по ссылке на мой репозиторий GitHub.
Спасибо, увидимся в следующем блоге.