javascript - 我想要 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 😄";
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>
在此先感谢您的帮助。
解决方案
推荐阅读
- ruby-on-rails - 无需注册即可识别用户的强大方法?
- c# - 如何在 Windows 7 上以编程方式读取另一个应用程序(未安装)的按钮操作
- c++ - 有效地将堆栈对象(由函数的值返回)分配给堆?
- r - R:根据其他列分类的变量的每日总和
- javascript - 无法在 beforeunload 事件上重置寡妇
- python - 在scrapy Request中放置python请求的数据属性的位置
- php - 如何修复php表单验证密码错误?
- c++ - 是否可以为所有子类创建一个实例?
- maven - 在spring boot项目中无法从swagger上传我的multipart api的文件(没有可用的选择文件选项)
- javascript - 三元运算符 - 3 个条件