需要源码和数据集请点赞关注收藏后评论区留言私信~~~
一、自然语言处理与智能
自然语言处理技术是智能客服应用的基础,在自然语言处理过程中,首先需要进行分词处理,这个过程通常基于统计学理论,分词的精细化可以提升智能客服的语言处理能力,统计分词和马尔可夫模型是常用的方法,但在非常用词汇的识别精度方面稍显逊色,而精度高低直接影响分词结果的准确性,多样性分词有助于发现形式上的不合理性
自然语言处理技术是智能客服中的重要的环节,也是决定智能客服应用质量好坏和问题处理效率高低的关键因素,创建智能客服通常系统先进行大量学习来充实语言知识库,并结合各种典型案例提升系统的处理能力。智能客服系统重点关注三部分:
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()
创作不易 觉得有帮助请点赞关注收藏~~~
转载:https://blog.csdn.net/jiebaoshayebuhui/article/details/128197118