Чат-боты существуют уже более 5 десятилетий! Фактически, первый чат-бот был разработан профессором Массачусетского технологического института Джозефом Вайценбаумом в 1960-х годах под названием ELIZA.

Убедитесь, что на вашем локальном компьютере есть следующие зависимости, но я настоятельно рекомендую запустить их в записной книжке Google Colab.

pip install sklearn
pip install spacy
python -m spacy en_core_web_sm

С развитием инструментов и библиотек теперь стало так легко разрабатывать чат-ботов для определенного домена. Чат-бот должен демонстрировать два важных поведения: 1.) Классификация намерений; 2.) Извлечение сущностей, когда эти функции объединены для определенного домена, и вы создали своего чат-бота!

Классификация намерений

Что касается чат-ботов, намерение - это цель, которую клиент имеет в виду, набирая вопрос. Например, предположим, что мы создаем бота, который будет знать о погоде в данном месте, поэтому возможные намерения здесь очевидны: 1.) Приветствующее намерение, клиенты могут взаимодействовать с ботом, приветствуя, например, привет, привет , как ваши дела
2.) Зная прогноз погоды, клиенты могут спросить бота, например, какая сегодня погода в Ченнаи, будет ли дождь сегодня в Ченнаи? .

Давайте создадим для этого небольшой классификатор намерений, начав с построения канала с векторизатором (преобразование текста в числовые данные) и классификатором линейных опорных векторов.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
vectorizer = CountVectorizer()
clf = LinearSVC()
pipe = Pipeline(steps = [
     ('vectorize' , vectorizer),
     ('classifier' , clf)
])

Определите данные для тренировки, стоп-слова не были удалены, потому что я использовал только несколько примеров для обучения.

train =[('Hello', 'intent.greet'),
        ('Hi', 'intent.greet'),
        ('how are you ? ', 'intent.greet'),
        ('Hey', 'intent.greet'),
        ('what is the weather in chennai ?', 'intent.know_weather'),
        ('how is the weather in Tamil Nadu ?', 'intent.know_weather'),
        ('how is the weather today in chennai ?', 'intent.know_weather'),
        ('will it rain today in chennai ?', 'intent.know_weather'),
]

Обучение и прогнозирование модели

pipe.fit(X , Y)
pipe.predict(["how is the wheather in chennai ?"])

Извлечение сущности

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

Давайте создадим простой экстрактор сущностей для определения города, который указывает человек с помощью SpaCy, распознавание именованных сущностей (NER) SpaCy было обучено в корпусе OntoNotes 5 и поддерживает следующие типы сущностей

nlp = spacy.load('en_core_web_sm')
doc = nlp("what is the weather in Toronto ?")
print("CITY IDENTIFIED USING OntoNotes 5 TRAINED DATA:     {}".format(doc.ents[0]))

Создание пользовательской модели распознавания сущностей

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

nlp = spacy.blank('en') #blank model
ner = nlp.create_pipe('ner')  # create a NER pipe
nlp.add_pipe(ner, last=True) # add the pipe to model

Определите данные, на которых будет обучаться модель

DATA = [
(u"what is the weather in Chennai." , {"entities" : [(23 , 30 , 'CITY')]}) ,
(u"Will it rain today in Toronto ?" ,{"entities" : [(22 , 29, 'CITY')]}),
]

Затем обучите свою модель с данными.

optimizer = nlp.begin_training() #this starts the training and 
returns the optimizer used

Поскольку я использовал только несколько примеров для обучения, я итеративно обучу модель еще 30 раз.

for i in range(30):
    for text, annotations in DATA:
        nlp.update([text], [annotations], sgd=optimizer)
doc = nlp("will it rain in  Chennai ?")
print("CITY IDENTIFIED : {}".format(doc.ents[0]))

Если у вас есть намерения и объекты, идентифицированные, то позже мы могли бы сгенерировать для него правильный ответ, поэтому, чтобы быть точным, если намерение связано с погодой и если объект города идентифицирован, мы могли бы запросить сторонний погодный API, чтобы узнать погода в городе определяется и генерирует адекватный ответ с точной информацией для клиентов.