Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
17.12.2023
Размер:
459.1 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Сочинский государственный университет»

Кафедра Информационных технологий

ОТЧЁТ

по лабораторной работе № 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, использование сценариев рекламы товара.

Итог: