首页 > 解决方案 > 我想要 Chatterbot 的回复列表?

问题描述

我正在使用Python 的ChatterBot库制作一个基于上下文的聊天机器人,并且我已经使用 ListTrainer 训练了聊天机器人,我在 Trainer 中传递了问题和答案。响应工作正常,但现在我需要一个仅包含问题的响应列表,该列表可以根据用户之前提出的问题显示在用户旁边。

我正在使用一个包含所有问题和答案的 JSON 文件。

我使用Django 作为这个项目的后端。我需要知道我是否需要创建一个逻辑适配器,它可以根据上一个问题给我一个问题列表,或者有没有其他方法。就像为此创建第二个聊天机器人一样。

import json
from django.views.generic.base import TemplateView
from django.views.generic import View
from django.shortcuts import render,redirect
from django.http import JsonResponse
from chatterbot import ChatBot
from chatterbot.ext.django_chatterbot import settings
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer, ListTrainer
import requests

class ChatterBotAppView(TemplateView):
    template_name = 'chatbot/chatbot.html'

class ChatterBotApiView(View):
    """
    Provide an API endpoint to interact with ChatterBot.
    """
    """
    Training Only Once 
    """
    chatterbot = ChatBot(**settings.CHATTERBOT)
    # # train(chatterbot)
    # trainer = ChatterBotCorpusTrainer(chatterbot)
    # trainer.train("chatterbot.corpus.english")        
    # trainer.train("chatterbot.corpus.english.greetings")     

    # trainer = ListTrainer(chatterbot)
    path = '../Json Files/final.json'
    with open(path,'r') as f:
        data = json.load(f)
        for category, values in data.items():
            for question, answer in values.items():
                trainer.append([question,answer])


    def post(self, request, *args, **kwargs):
        """
        Return a response to the statement in the posted data.
        * The JSON data should contain a 'text' attribute.
        """
        input_data = json.loads(request.body.decode('utf-8'))
        print(input_data)
        if 'text' not in input_data:
            return JsonResponse({
                'text': [
                    'The attribute "text" is required.'
                ]
            }, status=400)

        response = self.chatterbot.get_response(input_data)
    
        if 'stocks' in input_data['path']:
            print('yes stocks')

        response_data = response.serialize()
        return JsonResponse({'response_data': response_data},  status=200)

    def get(self, request, *args, **kwargs):
        """
        Return data corresponding to the current conversation.
        """
        return JsonResponse({
            'name': self.chatterbot.name
        })

urls.py 如下:

from django.urls import path,include
from .views import ChatterBotApiView
from .views import ChatterBotAppView

from . import views

urlpatterns = [
    path('', ChatterBotAppView.as_view(), name='main'),
    path('api/chatterbot/',ChatterBotApiView.as_view(), name='chatterbot'),
]

这是 base.html 文件,其中主要部分是调用从第 152 行开始的 POST 请求。Rest 仅用于 UI 和附加消息。$submit 变量用于调用 API。 这些按钮只是为了在聊天机器人中显示问题的选项。

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
        integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous" />
    <link rel="stylesheet" href="{% static 'css/chatbot.css' %}" />
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>

<body>
    <div id="body">
        <div id="chat-circle" class="btn btn-raised">
            {% csrf_token %}
            <div id="chat-overlay"></div>
        </div>
        <div class="chat-box">
            <div class="chat-box-header">
                Groww ChatBot
                <span class="chat-box-toggle"><i class="material-icons">close</i></span>
            </div>
            <div class="chat-box-body">
                <div class="chat-box-overlay"></div>
                <div class="chat-logs" id="chat-logs"></div>
                <!--chat-log -->
            </div>
            <div class="chat-input">
                <form>
                    <input type="text" autocomplete="off" id="chat-input" placeholder="Send a message..." />
                    <button type="submit" class="chat-submit" id="chat-submit">
                        <i class="material-icons">send</i>
                    </button>
                </form>
            </div>
        </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.2.1/js.cookie.min.js"  ></script>

</body>
<script>
    var chatterbotUrl = '{% url "chatterbot" %}';
    var csrftoken = Cookies.get('csrftoken');
    var answer = '{{request.get_full_path}}';
    console.log(answer);
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
</script>
<script>
var chatterbotUrl = '{% url "chatterbot" %}';
var path_req = "{{ request.get_full_path }}";
console.log(path_req);
$(function () {
    console.log("AM I working");
    var INDEX = 0;
    $("#chat-submit").click(function (e) {
        e.preventDefault();
        var msg = $("#chat-input").val();
        if (msg.trim() == "") {
            return false;
        }
        get_message(msg, "self");
        setTimeout(function () {
            // generate_message(msg, "user");
            get_message(msg, "user");
        }, 1000);
    });

    // function generate_message(msg, type) {
    //     INDEX++;
    //     var str = "";
    //     str += "<div id='cm-msg-" + INDEX + "' class=\"chat-msg " + type + '">';
    //     str += '          <span class="msg-avatar">';
    //     str +=
    //         '            <img src="https://img.icons8.com/windows/32/000000/webcam-man.png"/>';
    //     str += "          </span>";
    //     str += '          <div class="cm-msg-text">';
    //     str += msg;
    //     str += "          </div>";
    //     str += "        </div>";
    //     $(".chat-logs").append(str);
    //     $("#cm-msg-" + INDEX)
    //         .hide()
    //         .fadeIn(300);
    //     if (type == "self") {
    //         $("#chat-input").val("");
    //     }
    //     $(".chat-logs")
    //         .stop()
    //         .animate({ scrollTop: $(".chat-logs")[0].scrollHeight }, 1000);
    // }

    function add_message(msg, type) {
        INDEX++;
        var str = "";
        str +=
            "<div id='cm-msg-" +
            INDEX +
            "' class=\"chat-msg " +
            type +
            '" style="">';
        // str += '          <span class="msg-avatar">';
        // str +=
        //     '            <img src="https://img.icons8.com/windows/32/000000/webcam-man.png"/>';
        // str += "          </span>";
        str += '          <div class="cm-msg-text">';
        str += msg;
        str += "          </div>";
        str += "        </div>";
        $(".chat-logs").append(str);
        sessionStorage.setItem(
            "logs",
            document.getElementById("chat-logs").innerHTML
        );
        $("#cm-msg-" + INDEX)
            .hide()
            .fadeIn(300);
        if (type == "self") {
            $("#chat-input").val("");
        }
        $(".chat-logs")
            .stop()
            .animate({ scrollTop: $(".chat-logs")[0].scrollHeight }, 1000);
    }

    function get_message(msg, type) {
        if (type == "self") {
            add_message(msg, type);
        } else {
            var inputData = {
                text: msg,
                path: path_req,
            };
            // Submit post request to the URL of chatterbot api
            var $submit = $.ajax({
                type: "POST",
                url: chatterbotUrl,
                data: JSON.stringify(inputData),
                contentType: "application/json",
            });

            $submit.done(function (res) {
                console.log("Sucess request");
                console.log(res);
                add_message(res.response_data['text'], type);
                let buttons = [];
                for(let i=0;i<res.buttons.length;i++){
                    var obj = {
                        name: res.buttons[i],
                        value: res.buttons[i],
                    }
                    buttons.push(obj)
                }
                generate_button_message(buttons);
            });

            $submit.fail(function () {
                // TODO: Handle errors
            });
        }
    }

    function generate_button_message(buttons) {
        /* Buttons should be object array 
        [
          {
            name: 'Existing User',
            value: 'existing'
          },
          {
            name: 'New User',
            value: 'new'
          }
        ]
      */
        INDEX++;
        var btn_obj = buttons
            .map(function (button) {
                return (
                    '              <li class="button"><a href="javascript:;" class="btn btn-primary chat-btn" chat-value="' +
                    button.value +
                    '">' +
                    button.name +
                    "</a></li>"
                );
            })
            .join("");
        var str = "";
        // str += "<div id='cm-msg-" + INDEX + '\' class="chat-msg user">';
        // str += '          <span class="msg-avatar">';
        // str +=
        //     '            <img src="https://img.icons8.com/windows/32/000000/webcam-man.png">';
        // str += "          </span>";
        // str += '          <div class="cm-msg-text">';
        // str += msg;
        // str += "          </div>";
        str += '          <div class="cm-msg-button">';
        str += "            <ul>";
        str += btn_obj;
        str += "            </ul>";
        str += "          </div>";
        str += "        </div>";
        $(".chat-logs").append(str);
        $("#cm-msg-" + INDEX)
            .hide()
            .fadeIn(300);
        $(".chat-logs")
            .stop()
            .animate({ scrollTop: $(".chat-logs")[0].scrollHeight }, 1000);
        // $("#chat-input").attr("disabled", true);
    }

    $(document).delegate(".chat-btn", "click", function () {
        var value = $(this).attr("chat-value");
        var name = $(this).html();
        // $("#chat-input").attr("disabled", false);
        $(this).prop("disabled", true);
        get_message(value, "self");
        get_message(value, "user");
    });

    $("#chat-circle").click(function () {
        $("#chat-circle").toggle("scale");
        $(".chat-box").toggle("scale");
        if ($(".chat-msg").length == 0) {
            if (sessionStorage.getItem("logs")) {
                // Restore the contents of the text field
                document.getElementById(
                    "chat-logs"
                ).innerHTML = sessionStorage.getItem("logs");
            } else {
                let msg =
                    "Hey! How are you doing?\n I'm here to help you &#128516;";
                add_message(msg, "user");

                var buttons = [
                    {
                        name: "Invest using a credit/debit card",
                        value: "Can I invest using a credit/debit card?",
                    },
                    {
                        name: "I need to add a bank account",
                        value: "Why do I need to add a bank account?",
                    },
                ];
                generate_button_message(buttons);
            }
        }
    });

    $(".chat-box-toggle").click(function () {
        $("#chat-circle").toggle("scale");
        $(".chat-box").toggle("scale");
    });
});

</script>
</html>

在此先感谢您的帮助。

标签: javascriptpythondjangochatbotchatterbot

解决方案


推荐阅读