小言_互联网的博客

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

327人阅读  评论(0)

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

一、自然语言处理与智能

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

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

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文件


  
  1. #导入库
  2. import nltk
  3. import pickle as pk
  4. import numpy as np
  5. import json as js
  6. import random
  7. from tensorflow import keras
  8. from tensorflow.python.keras.models import load_model
  9. from nltk.stem import WordNetLemmatizer
  10. wordlem = WordNetLemmatizer()
  11. from tkinter import *
  12. from tkinter import Text
  13. from tkinter import Button
  14. import tkinter
  15. nltk.download( 'punkt')
  16. nltk.download( 'wordnet')
  17. #加载训练模型
  18. load = load_model( 'data/model.h5')
  19. #加载数据和中间结果
  20. chatbot = js.loads( open( 'data/chatbot.json').read())
  21. wordlist = pk.load( open( 'data/wordlist.pkl', 'rb'))
  22. category = pk.load( open( 'data/category.pkl', 'rb'))
  23. def tokenization( text):
  24. #分词
  25. word_tokens = nltk.word_tokenize(text)
  26. # 词形还原
  27. #for i in sw:
  28. word_tokens = [wordlem.lemmatize(i.lower()) for i in word_tokens]
  29. return word_tokens
  30. #词袋模型
  31. def bow( text, wordlist):
  32. #分词
  33. tokens = tokenization(text)
  34. bow = [ 0]* len(wordlist)
  35. for token in tokens:
  36. for i,flag in enumerate(wordlist):
  37. if flag == token:
  38. #查找匹配成功则标识为1
  39. bow[i] = 1
  40. print ( "词袋模型匹配结果: %s" % flag)
  41. return(np.array(bow))
  42. #预测结果
  43. def predict( text, load):
  44. #设置阈值,过滤阈值以下内容
  45. err_level = 0.20
  46. outlist = []
  47. bow_outcome= bow(text,wordlist)
  48. result = load.predict(np.array([bow_outcome]))[ 0]
  49. #根据概率结果排序
  50. outcome = [[i,j] for i,j in enumerate(result) if j>err_level]
  51. outcome.sort(key= lambda x: x[ 1], reverse= True)
  52. for j in outcome:
  53. outlist.append({ "k": category[j[ 0]], "probability": str(j[ 1])})
  54. return outlist
  55. #设置应答信息
  56. def getResponse( pred, intents_json):
  57. ptype = pred[ 0][ 'k']
  58. print( "用户提问类型:",ptype)
  59. ctype = intents_json[ 'chatbot']
  60. for type in ctype:
  61. if( type[ 'category']== ptype):
  62. result = random.choice( type[ 'output'])
  63. print( "提供给用户的响应信息:",result)
  64. break
  65. return result
  66. #预测消息响应
  67. def chatbot_Response( query):
  68. pred = predict(query, load)
  69. outcome = getResponse(pred, chatbot)
  70. return outcome
  71. #设置用户和智能客服之间的消息交互
  72. def chatbotInteract():
  73. query = txt.get( "1.0", 'end-1c').strip()
  74. txt.delete( "0.0",END)
  75. chatwnd.tag_config( 'question', background= "white", foreground= "black")
  76. chatwnd.tag_config( 'answer', background= "white", foreground= "blue")
  77. chatwnd.config(state=NORMAL)
  78. chatwnd.insert(END, "用户问题:\n" + query + '\n\n', 'question')
  79. outcome = chatbot_Response(query)
  80. chatwnd.insert(END, "客服回答:\n" + outcome + '\n\n', 'answer')
  81. chatwnd.config(state=NORMAL)
  82. chatwnd.yview(END)
  83. #设置智能客服应用界面风格
  84. tk_window = tkinter.Tk(screenName= None, baseName= None)
  85. tk_window.title( "智能客服")
  86. tk_window.geometry( "500x600")
  87. tk_window.resizable( False, False)
  88. #设置文本框
  89. chatwnd = Text(tk_window, borderwidth= 2, cursor= None,state=NORMAL, background= "white", height= "12", width= "70", font= "Arial",wrap=WORD)
  90. #设置滚动条
  91. srb = Scrollbar(tk_window, command=chatwnd.yview, activebackground= None,background= "white",borderwidth= 2,highlightcolor= "purple",cursor= "arrow",
  92. jump= 0,orient=VERTICAL,width= 16,elementborderwidth= 1)
  93. srb.pack( side = RIGHT, fill = Y )
  94. chatwnd[ 'yscrollcommand'] = srb. set
  95. #设置信息输入框风格
  96. txt = Text(tk_window, borderwidth= 0, cursor= None,background= "white",width= "25", height= "8", font= "Arial",wrap=WORD)
  97. #设置发送消息按钮风格
  98. msgBtn = Button(tk_window, font=( "kaiti", 14), text= "咨询", width= 12, height= 8,highlightcolor= None,image= None,justify=CENTER,state=ACTIVE,
  99. borderwidth= 0, background= "Blue", activebackground= "#524e78",fg = 'white',relief=RAISED,
  100. command= chatbotInteract )
  101. #显示组件内容
  102. srb.place(x= 404,y= 12, height= 398)
  103. chatwnd.place(relx= 0.0, rely= 0.35, relwidth= 0.8, relheight= 0.66, anchor= 'w')
  104. msgBtn.place(bordermode=OUTSIDE,x= 175, y= 540, height= 50)
  105. txt.place(x= 2, y= 411, height= 100, width= 400)
  106. tk_window.mainloop()

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


转载:https://blog.csdn.net/jiebaoshayebuhui/article/details/128197118
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场