【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)

news2024/9/22 9:36:33

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、自然语言处理与智能

自然语言处理技术是智能客服应用的基础,在自然语言处理过程中,首先需要进行分词处理,这个过程通常基于统计学理论,分词的精细化可以提升智能客服的语言处理能力,统计分词和马尔可夫模型是常用的方法,但在非常用词汇的识别精度方面稍显逊色,而精度高低直接影响分词结果的准确性,多样性分词有助于发现形式上的不合理性

自然语言处理技术是智能客服中的重要的环节,也是决定智能客服应用质量好坏和问题处理效率高低的关键因素,创建智能客服通常系统先进行大量学习来充实语言知识库,并结合各种典型案例提升系统的处理能力。智能客服系统重点关注三部分:

1:知识库完善

2:服务满意度

3:处理未知场景的自我学习能力

与传统人工客服相比 智能客服应用一般具有以下优势

可以提供24小时无间断在线服务。

具备持续自主学习能力 。

处理速度快,处理效率高,

可以应对短时大容量服务请求。

成本优势。

从用户问题到答复输出涉及的流程基本框架如下图

 二、智能应用开发库如下

 Gensim 

 NLTK 

SpaCy 

TensorFlow TensorFlow是一个基于数据流编程(dataflow programming)的系统,被广泛应用于图形分类、音频处理、推荐系统和自然语言处理等场景的实现,提供基于Python语言的四种版本:CPU版本(tensorflow)、GPU加速版本(tensorflow-gpu)以及每日编译版本(tf-nightly、tf-nightly-gpu)。

 Theano

Keras

三、充实智能客服的情感

智能客服系统既依赖于专业性数据,也与自然处理理解等人工智能技术紧密相关,在解决用户业务诉求的过程中,难免用到用户咨询以及无法解决的问题等状况,因此提升其情感分析能力,具备多维度服务能力,对提高客户整体满意度有十分重要的积极意义,智能客服,人工客服和用户之间的关系可以简要概括如下图

智能客服处理流程如下图

 四、聊天客服机器人实战

开发环境简介:

我们将使用深度学习技术构建一个聊天机器人,在包含聊天意图类别、用户输入和客服响应的数据集上进行训练。基于循环神经网络(LSTM)模型来分类用户的输入消息所属类别,然后从响应列表中基于随机算法提供响应输出。该实例在执行环境Tensorflow(2.6.0)和Python(3.6.5)中运行成功,其他需要的库为NLTK和Keras。

数据集和模型简介:

所需数据和模型说明如下:

chatbot.json :预定义消息分类、输入消息和客服响应的数据文件。

wordtoken.pkl : pickle 文件,存储包含词汇列表的Python 对象。

category.pkl :pickle 文件,包含消息类别列表。

model.h5 :经过训练的模型,包含模型以及神经元权重相关信息。

数据结构

本实例数据基于JSON(JavaScript Object Notation),JSON是一种轻量级的数据交换格式,完全独立于语言,机器容易解析和生成。JSON 建立在两种结构上:

1)名称:值(name:value)的集合。在计算机语言中称为对象、记录、结构、字典、哈希表、键控列表或关联数组。

(2)值有序列表。通常实现方式为数组、向量、列表或序列,属于通用数据结构,可与通用编程语言互换。

效果展示

语料库如下

 训练过程如下

 

用户在图形界面输入问题 客服机器人会给出相应回答 

 当用户提出了语料库之外的问题 客服便会显示以下回答

 

 五、代码

项目结构如下 

部分代码如下  需要全部代码请点赞关注收藏后评论区留言私信~~~

test文件

#导入库
import nltk
import pickle as pk
import numpy as np
import json as js
import random

from tensorflow import keras
from tensorflow.python.keras.models import load_model
from nltk.stem import WordNetLemmatizer
wordlem = WordNetLemmatizer()
from tkinter import * 
from tkinter import  Text  
from tkinter import  Button  
import tkinter

nltk.download('punkt')
nltk.download('wordnet')
#加载训练模型
load = load_model('data/model.h5')

#加载数据和中间结果
chatbot = js.loads(open('data/chatbot.json').read())
wordlist = pk.load(open('data/wordlist.pkl','rb'))
category = pk.load(open('data/category.pkl','rb'))


def tokenization(text):
    #分词
    word_tokens = nltk.word_tokenize(text)
    # 词形还原
    #for i in sw:
    word_tokens =  [wordlem.lemmatize(i.lower()) for i in word_tokens] 
    return word_tokens

#词袋模型
def bow(text, wordlist):
    #分词
    tokens = tokenization(text)
    bow = [0]*len(wordlist)  
    for token in tokens:
        for i,flag in enumerate(wordlist):
            if flag == token: 
                #查找匹配成功则标识为1
                bow[i] = 1
                print ("词袋模型匹配结果: %s" % flag)
    return(np.array(bow))

#预测结果
def predict(text, load):
    #设置阈值,过滤阈值以下内容
    err_level = 0.20
    outlist = []
    bow_outcome= bow(text,wordlist)
    result = load.predict(np.array([bow_outcome]))[0]
 
    #根据概率结果排序
    outcome = [[i,j] for i,j in enumerate(result) if j>err_level]
    outcome.sort(key=lambda x: x[1], reverse=True)
    for j in outcome:
        outlist.append({"k": category[j[0]], "probability": str(j[1])})
    return outlist

#设置应答信息
    
def getResponse(pred, intents_json):
    ptype = pred[0]['k']
    print("用户提问类型:",ptype)
    ctype = intents_json['chatbot']
    for type in  ctype:
        if(type['category']== ptype):
            result = random.choice(type['output'])
            print("提供给用户的响应信息:",result)
            break
    return result    


#预测消息响应
def chatbot_Response(query):
    pred = predict(query, load)
    outcome = getResponse(pred, chatbot)
    return outcome




#设置用户和智能客服之间的消息交互
def chatbotInteract():
    query = txt.get("1.0",'end-1c').strip()
    txt.delete("0.0",END)


    chatwnd.tag_config('question', background="white", foreground="black")
    chatwnd.tag_config('answer', background="white", foreground="blue")
    chatwnd.config(state=NORMAL)
    chatwnd.insert(END, "用户问题:\n" + query + '\n\n','question')

    outcome = chatbot_Response(query)
    chatwnd.insert(END, "客服回答:\n" + outcome + '\n\n','answer')   
        
    chatwnd.config(state=NORMAL)
    chatwnd.yview(END)


 
#设置智能客服应用界面风格
tk_window = tkinter.Tk(screenName=None, baseName=None)
tk_window.title("智能客服")
tk_window.geometry("500x600")
tk_window.resizable(False, False)

#设置文本框
chatwnd = Text(tk_window, borderwidth=2, cursor=None,state=NORMAL, background="white", height="12", width="70", font="Arial",wrap=WORD)

#设置滚动条
srb = Scrollbar(tk_window, command=chatwnd.yview, activebackground=None,background="white",borderwidth=2,highlightcolor="purple",cursor="arrow",
jump=0,orient=VERTICAL,width=16,elementborderwidth=1)
srb.pack( side = RIGHT, fill = Y )
chatwnd['yscrollcommand'] = srb.set


#设置信息输入框风格
txt = Text(tk_window, borderwidth=0, cursor=None,background="white",width="25", height="8", font="Arial",wrap=WORD)

#设置发送消息按钮风格
msgBtn = Button(tk_window, font=("kaiti",14), text="咨询", width=12, height=8,highlightcolor=None,image=None,justify=CENTER,state=ACTIVE,
                    borderwidth=0, background="Blue", activebackground="#524e78",fg ='white',relief=RAISED,
                    command= chatbotInteract )




#显示组件内容

srb.place(x=404,y=12, height=398)
chatwnd.place(relx=0.0, rely=0.35, relwidth=0.8, relheight=0.66, anchor='w')
msgBtn.place(bordermode=OUTSIDE,x=175, y=540, height=50)
txt.place(x=2, y=411, height=100, width=400)


tk_window.mainloop()

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白课程,前端入门新手,必须了解的回调函数概念和应用实例

******内容预警******新手内容,大佬请绕道 做为一个纯纯的小白,我相信很多人是没有回掉函数这个概念的,虽然很多文档和教程中都有提到,但是很多人看完文档也不会用。因为菜鸟的开发任务,都是简单画一下html页面&#x…

分布式定时调度:xxl-job 最佳实践详解

文章目录一、定时任务概述1.1. 什么是定时任务1.2. 常见定时任务方案1.3. 分布式定时任务面临的问题1.4. 分布式定时任务xxl-job二、xxl-job架构设计2.1. 设计思想2.2. 架构设计图三、xxl-job安装3.1.下载源码3.2. 导入数据库3.3. 启动调度中心3.4. 配置部署“执行器项目3.5. 案…

护眼灯有用吗?双十二买什么样的护眼灯真的有效果

对于很多人来说,健康是一个越来越重视的话题,特别是现代社会生活节奏很快,很多人的眼睛都吃不消,所以不管是为了好看,还是为了能够看得足够远,都会注意保护眼睛,所以越来越多的人开始考虑护眼台…

网站变灰,6行代码,通通变灰

人狠话不多,直接上代码 -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale1); 通通变灰&…

Java中Map集合体系的基本使用和常用API

文章目录Map集合体系Map集合概述和使用Map集合体系的特点Map集合常用的APIMap集合体系 Map集合概述和使用 Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合整体…

本地代码上传到gitlab

1、在本地代码目录中,鼠标右键Git Bash Here,会打开一个git命令操作窗口; 2、执行git init命令,此命令会在当前目录下创建一个.git文件夹, git init 3、将项目的所有文件添加到仓库中, git add -A 4、将add的文件…

【计算机毕业设计】75.教师工作考核绩效管理系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 随着社会不断进步与发展,生活节奏不断加快,信息已经成为我们生活中不可缺少的一部分,很多学校需要掌握大量的信息来了解特定学生的需求,传统的做法是组织大量的…

如何实现table表头固定但是tbody可以滚动【附源码实例】

【写在前面】经常看到表头固定,表身支持滚动的需求,由于项目经常会用到一些自定义的表格展示数据,之前经常发现每次都是自己去写,自己去重新定义样式,觉得特别的麻烦,现在我特针对这类的分享一下。 1、页面…

【电巢】新能源产业景气度加速向上,功率器件3000亿赛道国产替代已在路上!(附70+厂家名单部分厂家替代型号)

前言 目前消费电子疲软继续蔓延,半导体设计端分化明显,存储、CPU等产品需求延续弱势,但IGBT和SiC等功率器件逐步迎来收获期。半导体周期拐点已至,曙光乍现。 在整个半导体周期背景下,新能源汽车俨然已成为逆势窗口产业…

现在健身耳机哪个牌子好、2023年最好的健身房耳机推荐

很多朋友在运动健身的时候喜欢戴上耳机,在音乐的节奏中去运动,现在市面上的运动耳机选择也特别丰富,但是说实话,从专业角度来看能真正适合运动的蓝牙耳机其实还是比较罕见的。这也就导致了我们许多朋友在选购时特别容易踩坑&#…

React - redux 使用(由浅入深)

React - redux 使用(由浅入深)一. redux理解1. redux 介绍2. redux 使用情况3. redux 工作流程4. redux 三个核心概念4.1 Action4.2 Store4.3 Reducers5. redux 核心API5.1 createStore()5.2 Store5.2.1 Store 方法5.2.1.1 getState()5.2.1.2 dispatch(a…

Kotlin 开发Android app(十八):线程Thread和UI更新

多线程的好处是不言而喻的,它能帮我们刚更多的事情,同时干不同的事情在程序设计中是经常出现的,这种时候我们使用的是线程。 在Kotlin 中,使用的还是原先java 的那一套,用的还是Thread ,可能是在java 中T…

翻译: 如何学习编译器:LLVM Edition

编译器和编程语言是一个很大的话题。您不能只选择学习路径并在某个时候完成它。有许多不同的区域,每个区域都是无穷无尽的。 在这里,我想分享一些有助于学习编译器的链接。这份清单不可能详尽无遗——每个人都很忙,没有人有时间阅读龙书。 …

前端知识大全之CSS

目录 一、概念讲解 学习CSS之前必学的HTML (超链接) 二、正文代码 1.行内样式 2.内部样式(选择器) 3.外部样式 4.样式的优先级 5.简单选择器之定义单个标签(id) 6.简单选择器之定义多个标签&#xff…

低代码平台,企业业务创新的最佳路径

数字化转型的必然趋势及面临的问题 数字经济时代,数字化转型是企业在行业赛道上领先的必经之路,然而,数字化转型升级的道路并不是畅通无阻的,也不是企业单枪匹马就能干成的,各个企业在转型过程中都或多或少会遇到技术…

MySQL-索引

一、介绍 索引是数据库对象之一,用于提高字段检索效率,使用者只需要对哪个表中哪些字段建立索引即可,其余什么都不做,数据库会自行处理。 索引提供指向存储在表的指定列中的数据值的指针,如同图书的目录,…

【MMDetection】MMDetection中AnchorGenerator学习笔记

文章目录初始化-AnchorGenerator()Anchor平移-grid_priors计算有效anchor-valid_flags参考文献初始化-AnchorGenerator() TASK_UTILS.register_module() class AnchorGenerator:def __init__(self, strides, ratios, scalesNone, base_sizesNone, scale_majorTrue, octave_bas…

numpy的部分通用函数浅谈

numpy的部分通用函数 1.数组算术运算符 运算符对应的通用函数描述np.add加法运算(即112)-np.substract减法运算(即3-21)-np.negative负数运算(即-2)*Nnp.multiply乘法运算(即2*36)/np.divide除…

Optional用法与争议点

Optional用法与争议点 简介 要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值判断问题,Java8中提供了一个新的工具类Optional,用于提示程序员注意null值,并在特定场景中简化代…

软件测试8年,却被应届生踩在头上,是应届生太牛了,还是我们太弱了?

前几天有个朋友向我哭诉,说他在公司干了8年的软件测试,却被一个实习生代替了,该何去何从? 这是一个值得深思的问题,作为职场人员,我们确实该思考,我们的工作会被实习生代替吗?这是一个很尖锐的问题&…