Примечание: все файлы кода будут доступны по адресу: https://github.com/ashwinhprasad/Chatbot-GoingMerry

Going Merry - чат-бот, который я создал для набора пиратов. Это помогает в вербовке пиратов по всему миру. это ответ на простые вопросы пользователя о процессе найма, предварительных требованиях и т. д. Эту же модель можно использовать для создания чат-ботов для любой организации.

Введение

Чат-бот - это программное приложение, используемое для ведения текстового общения в чате. В этом сообщении блога я покажу, как создать простого чат-бота с tenorflow 2 для вашей организации.

Подготовка набора данных

однажды набор данных построен. половина работы уже сделана. то, как мы структурируем набор данных, является главным в чат-боте. Я использовал файл json для создания набора данных.

Файлы json похожи на словари в Python. вы можете хранить в файлах json так же, как в словарях на Python

Ввод. Это именно те сообщения, которые пользователь будет отправлять боту.

теги: теги используются для категоризации входных данных и сопоставления их с определенным типом ответа.

ответы: как только мы сопоставили ввод с соответствующим тегом, мы можем выбрать один из ответов, который будет возвращен пользователю.

В основном так структурирован набор данных для чат-бота.

Часть машинного обучения:

  1. Импорт библиотек
#importing the libraries
import tensorflow as tf
import numpy as np
import pandas as pd
import json
import nltk
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.layers import Input, Embedding, LSTM , Dense,GlobalMaxPooling1D,Flatten
from tensorflow.keras.models import Model
import matplotlib.pyplot as plt

2. Импорт данных

#importing the dataset
with open('content.json') as content:
  data1 = json.load(content)

#getting all the data to lists
tags = []
inputs = []
responses={}
for intent in data1['intents']:
  responses[intent['tag']]=intent['responses']
  for lines in intent['input']:
    inputs.append(lines)
    tags.append(intent['tag'])
#converting to dataframe
data = pd.DataFrame({"inputs":inputs,
                     "tags":tags})
print(data)

вывод:

Данные хранятся в файле json, который можно импортировать и использовать в качестве фрейма данных pandas. Эти данные были созданы мной вручную. следовательно, он не такой уж и большой.
все мы знаем, что глубокое обучение требует больших объемов данных. но здесь дело обстоит не так. Я использовал архитектуру нейронной сети, достаточно мощную, чтобы обрабатывать этот небольшой объем данных.

3. Предварительная обработка данных

#removing punctuations
import string
data['inputs'] = data['inputs'].apply(lambda wrd:[ltrs.lower() for ltrs in wrd if ltrs not in string.punctuation])
data['inputs'] = data['inputs'].apply(lambda wrd: ''.join(wrd))
#tokenize the data
from tensorflow.keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=2000)
tokenizer.fit_on_texts(data['inputs'])
train = tokenizer.texts_to_sequences(data['inputs'])

#apply padding
from tensorflow.keras.preprocessing.sequence import pad_sequences
x_train = pad_sequences(train)

#encoding the outputs
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(data['tags'])

Токенизатор Tensorflow присваивает уникальный токен каждому отдельному слову. и заполнение выполняется, чтобы все данные имели одинаковую длину, чтобы отправить их на уровень RNN. целевые переменные также кодируются в десятичные значения.

4. Длина ввода, длина вывода и словарь

#input length
input_shape = x_train.shape[1]
print(input_shape)
#define vocabulary
vocabulary = len(tokenizer.word_index)
print("number of unique words : ",vocabulary)
#output length
output_length = le.classes_.shape[0]
print("output length: ",output_length)
output
number of unique words :  96
output length:  8

длина ввода и длина вывода очевидны. они предназначены для входной и выходной формы нейронной сети. размер словаря предназначен для слоя внедрения для создания уникальных векторных представлений для каждого слова

5. Нейронная сеть

#creating the model
i = Input(shape=(input_shape,))
x = Embedding(vocabulary+1,10)(i)
x = LSTM(10,return_sequences=True)(x)
x = Flatten()(x)
x = Dense(output_length,activation="softmax")(x)
model  = Model(i,x)
#compiling the model
model.compile(loss="sparse_categorical_crossentropy",optimizer='adam',metrics=['accuracy'])
#training the model
train = model.fit(x_train,y_train,epochs=200)

Сеть состоит из слоя внедрения, который является одним из самых мощных инструментов в области обработки естественного языка. выходы слоя внедрения - это вход повторного слоя с логическим элементом lstm. затем вывод сглаживается и используется обычный плотный слой с функцией активации softmax.

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

6. Анализ модели
Модель получила идеальную точность 100%.

7. Тестирование

#chatting
import random
while True:
  texts_p = []
  prediction_input = input('You : ')
  #removing punctuation and converting to lowercase
  prediction_input = [letters.lower() for letters in prediction_input if letters not in string.punctuation]
  prediction_input = ''.join(prediction_input)
  texts_p.append(prediction_input)
  #tokenizing and padding
  prediction_input = tokenizer.texts_to_sequences(texts_p)
  prediction_input = np.array(prediction_input).reshape(-1)
  prediction_input = pad_sequences([prediction_input],input_shape)
  #getting output from model
  output = model.predict(prediction_input)
  output = output.argmax()
  #finding the right tag and predicting
  response_tag = le.inverse_transform([output])[0]
  print("Going Merry : ",random.choice(responses[response_tag]))
  if response_tag == "goodbye":
    break

вывод:

You : hi there
Going Merry :  welcome aboard, how may I help you ?
You : how do i join the pirates ?
Going Merry :  you need to contact the nearest straw hats center 
once you have completed the pre-requisites
You : what are the pre requisites ?
Going Merry :  you gotta master the art of swordfight or master Cooking and become a furious cook or you have to be the best navigator in the entire world or you need to be as strong and intelligent as god usop
You : alright , who are you ?
Going Merry :  Going Merry at your service
You : how are you doing ?
Going Merry :  Yeah , am fine
You : nice , thanks for the response
Going Merry :  Okay, Bye

Вот и все для создания чат-бота

О компании Going Merry

Going Merry - это корабль из манги One Piece, которая вращается вокруг истории группы пиратов. Веселое плавание - это, без сомнения, удивительный корабль. Но оно прошло.
Чтобы узнать больше о веселье: https://onepiece.fandom.com/wiki/Going_Merry

Вывод

Итак, это чат-бот, который я создал с помощью tensorflow2, используя возможности матрицы встраивания. Этот же метод можно использовать для создания чат-ботов для любого типа организации, но не для общей.