в предыдущем мы построили модель чат-бота, обучили и сохранили модель. перед началом этого блога, если вы не видели предыдущий блог вот ссылка.

сначала нам нужно импортировать необходимые пакеты и сохраненную модель и файл 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.

Спасибо, увидимся в следующем блоге.