
Интеллектуальные информационные системы 4 курс Попов / Кольцова АА ЛР1
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Сочинский государственный университет»
Кафедра Информационных технологий
ОТЧЁТ
по лабораторной работе № 1
«Разработка естественно-языкового интерфейса интеллектуальной системы поддержки принятия решений»
Выполнила: студентка группы 20-ПИ
Кольцова Адриана Андреевна
Дата: 20.08.2023
Проверил: д.т.н. проф. Попов Д.И.
Дата: _______________
Замечания:
______________________________________________________________________________________________________________________________________________________________________________________________________
Сочи 2023
Задание к лабораторной работе
Разработать чат-бот, который мог бы вести диалог с пользователем на разные темы, но в какой-то момент плавно переводил диалог на рекламу товаров, которые студент выбирает самостоятельно на свое усмотрение. Можно включить в чат-бот какие-то дополнительные функции (например, обработка голосовых команд/вопросов/сообщений и озвучивание ответов голосом и т.п.), которые отсутствуют в данном руководстве. В этом случает, обязательно указать в отчете о дополнительных возможностях чат-бота. В зависимости от возможностей чат-бота оценка по лабораторной работе будет различной («зачет» означает, что лабораторная принята с положительным результатом). В самом начале работы после титульного листа указывается таблица характеристик бота и один столбец, на который претендует ваша работа.
Решение
Этот код создает бота, который отвечает на команду "/start" сообщением "Готов" и обрабатывает текстовые сообщения, отправляя их на обработку в функцию NLPbot.bot, а затем отправляет результат обработки обратно пользователю через Telegram:
import telebot
import NLPbot
print("StartBot")
telegbot = telebot.TeleBot("6395693460:ADFfG_jLgO_izS1DA_ayQ43423fj-4VFD4BE")
@telegbot.message_handler (commands=["start"])
def start(m, res=False):
print("GettingStart")
telegbot.send_message(m.chat.id, "Готов")
@telegbot.message_handler(content_types=["text"])
def handle_text(message):
print("Get message: " + message.text)
text = NLPbot.bot(message.text)
telegbot.send_message(message.chat.id, text)
telegbot.polling(none_stop=True, interval=0)
Этот код создает бота, который способен классифицировать намерения текстовых сообщений и отвечать на них с помощью заранее определенных ответов, а также пытается генерировать ответы на основе анализа диалогов:
import random
import nltk
from big_config import BOT_CONFIG
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
X_text = []
y = []
for intent, value in BOT_CONFIG['intents'].items():
X_text += value['examples']
y += [intent] * len(value['examples'])
vectorizer = CountVectorizer(analyzer='char_wb',ngram_range=(3, 3),lowercase=True)
X = vectorizer.fit_transform(X_text)
clf = LogisticRegression()
clf.fit(X,y)
def get_intent(text):
text_vector = vectorizer.transform([text]).toarray()[0]
probas_list = clf.predict_proba([text_vector])[0]
probas_list = list(probas_list)
max_proba = max(probas_list)
if max_proba > 0.2:
index = probas_list.index(max_proba)
return clf.classes_[index]
def response_by_intent(intent):
responses = BOT_CONFIG['intents'][intent]['responses']
return random.choice(responses)
def get_failure_phrase():
failure_phrase = BOT_CONFIG['failure_phrases']
return random.choice(failure_phrase)
with open("dialogues.txt", encoding="utf-8") as f:
content = f.read()
blocks = content.split('\n\n')
dataset = [] #Вопрос-Ответ пары
alpabet = ' 1234567890-qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэёячсмитьбю'
def clean_str(r):
r = r[2:].lower()
r = [c for c in r if c in alpabet]
return ''.join(r)
for block in blocks:
replicas = block.split('\n')[:2]
if len(replicas)==2:
pair = (clean_str(replicas[0]),clean_str(replicas[1]))
if pair[0] and pair[1]:
dataset.append(pair)
dataset = list(set(dataset))
def get_generative_replica(text):
text = text.lower()
for question, answer in dataset:
if abs(len(text)- len(question)) / len(question) < 0.2:
distance = nltk.edit_distance(text, question)
diffetence = distance / len(question)
if diffetence < 0.2:
print(answer)
return answer
def bot(text):
intent = get_intent(text)
if intent:
return response_by_intent(intent)
#generative model
replica = get_generative_replica(text)
if replica:
return replica
return get_failure_phrase()
Этот конфигурационный файл позволяет боту понимать, какие намерения пользователи могут иметь (на основе примеров) и какие ответы бот должен предоставлять в ответ на эти намерения. Когда пользователь отправляет сообщение боту, бот использует этот конфигурационный файл для определения наилучшего ответа на основе распознанного намерения.
BOT_CONFIG = {'intents':
{'hello': {'examples': ['Доброе утро',
'Хай',
'Добрый день',
И там много-много кода
Файл dialogues.txt должен содержать разнообразные диалоги или разговоры, которые используются для обучения чат-бота. Модель бота может изучать этот текст и адаптировать свои ответы на основе обнаруженных шаблонов и структуры диалогов.
По итогу в задании выполнены: минимальные функции вопрос-ответ, наличие расширенного списка датасета по намерениям, наличие датасета диалогов dialogues.txt, наличие машинного обучения (ML) для анализа намерений, использование API Telegram, использование сценариев рекламы товара.
Итог: