Проблемы чат-бота Python с функцией learn_response

#python #discord.py #chatterbot

#python #discord.py #чат-бот

Вопрос:

Я кодирую Discord-бота, который использует ChatterBot для взаимодействия.

Я хочу создать команду, которая заставляет бота изучать ввод через чат.

 @client.command(aliases=['tc'])
async def treinocustom(ctx, response, input_statement):
    chatbot.learn_response(response, input_statement)
    ctx.send('Thanks for the feedback')
  

Но когда я выполняю команду, эта ошибка отображается на консоли:

 Ignoring exception in command treinocustom:
Traceback (most recent call last):
  File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:/Users/user/PycharmProjects/SamuelBot/SamuelBot.py", line 227, in treinocustom
    chatbot.learn_response(arg1, arg2)
  File "C:Usersuseranaconda3envsenvbomlibsite-packageschatterbotchatterbot.py", line 225, in learn_response
    statement.in_response_to = previous_statement
AttributeError: 'str' object has no attribute 'in_response_to'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandsbot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 855, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:Usersuseranaconda3envsenvbomlibsite-packagesdiscordextcommandscore.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'in_response_to'
  

Что я могу сделать, чтобы это исправить?

Комментарии:

1. я не знаком с используемой вами библиотекой, но, похоже, это ошибка типа. Похоже, что вы передали строку библиотечной функции, которая ожидает объект statement (или, по крайней мере, объект, имеющий in_response_to атрибут). Возможно, проверьте документацию на learn_response , чтобы увидеть, какие аргументы он ожидает.

2. @cruculence Функция говорит: def learn_response(self, statement, previous_statement=None):

3. поскольку в Python довольно слабая система ввода, сигнатура функции сама по себе не очень эффективна с точки зрения определения того, как действовать с ошибками типа / интерфейса. Если вы посмотрите документацию библиотеки, там, вероятно , есть более подробное объяснение того, как использовать функцию, или пример кода. Если это бесполезно, может быть, поискать документацию или исходный код для класса Statement?

4. ссылка на @truculence на официальном сайте показано только, что функция существует и требует (statement, previous_statement) , и единственным классом является class ChatBot(object)

5. возможно, это поможет ссылка

Ответ №1:

Итак, проблема здесь в том, что функция chatterbot learn_response() принимает в качестве аргументов НЕ строки, а специальный тип данных (локальный для chatterbot), называемый a Statement . Итак, чтобы получить ваш ответ в этом типе данных, вы должны сначала импортировать его с помощью:

from chatterbot.conversation import Statement

в верхней части вашего кода. Во-вторых, просто внесите эти изменения в свою treinocustom() функцию:

 @client.command(aliases = ["tc"])
async def treinocustom(ctx, *, parts):
    if parts.count(">") == 1:
        Question, Answer= [i.strip() for i in parts.split('>')]
        #here, we are changing the strings 'Question' and 'Answer' to a Statment datatype.
        input_statement = Statement(text=Question) 
        correct_response = Statement(text=Answer)
        chatbot.learn_response(correct_response, input_statement)
        await ctx.send("Ok, I have learnt the correct response to this query!")
    else:
        await ctx.send("Please enter only two arguments!")
  

Итак, что я заметил в вашем коде, так это то, что аргументы response и input_statement будут принимать только одно слово в качестве входных данных, но на самом деле нам нужны предложения в качестве входных данных.

Однако в этой функции выше пользователь может дать команду следующим образом:

[bot_prefix] tc what is your name? > My name is ChatterBot!

Во-вторых, я преобразовал Question и Answer строки в Statement s, которые распознает функция learn_response().

В-третьих, команда будет работать, даже если пользователь вводит, сколько пробелов до и после «>», другими словами, даже

[bot_prefix] tc what is your name? > My name is ChatterBot!

будет работать отлично! это связано с strip() используемой функцией…

Я столкнулся с той же проблемой, что и вы, но, покопавшись в репозитории chatterbot на githup, я нашел несколько очень хороших примеров кодов и выяснил из них правильное использование функции. Если вам интересно, вы можете найти learn_response() пример кода здесь.