• 【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数据集、演示 超详细)


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

    一、问答智能客服简介

    QA问答是Question-and-Answer的缩写,根据用户提出的问题检索答案,并用用户可以理解的自然语言回答用户,问答型客服注重一问一答处理,侧重知识的推理。

    从应用领域视角,可将问答系统分为限定域问答系统和开放域问答系统。

    根据支持问答系统产生答案的文档库、知识库,以及实现的技术分类,可分为自然语言的数据库问答系统、对话式问答系统、阅读理解系统、基于常用问题集的问答系统、基于知识库的问答系统等。

    智能问答客服功能架构

    典型的问答系统包含问题输入 问题理解 信息检索 信息抽取 答案排序 答案生成和结果输出等,首先由用户提出问题,检索操作通过在知识库中查询得到相关信息,并依据特定规则从提取到的信息中抽取相应的候选答案特征向量,最后筛选候选答案结果输出给用户 

     智能问答客服框架

    1: 问题处理 问题处理流程识别问题中包含的信息,判断问题的主题信息和主题范畴归属,比如是属于一般类问题还是属于特定主题类问题,然后提取与主题相关的关键信息,比如人物信息、地点信息和时间信息等。

    2 :问题映射 根据用户咨询的问题,进行问题映射消除歧义。通过字符串相似度匹配和同义词表等解决映射问题,根据需要执行拆分和合并操作。

    3 :查询构建 通过对输入问题进行处理,将问题转化为计算机可以理解的查询语言,然后查询知识图谱或者数据库,通过检索获得相应备选答案。

    4 :知识推理 根据问题属性进行推理,问题基本属性如果属于知识图谱或者数据库中的已知定义信息,则可以从知识图谱或者数据库中查找,直接返回答案。如果问题属性是未定义类问题,则需要通过机器算法推理生成答案。

    5: 消岐排序 根据知识图谱中查询返回的一个或者多个备选答案,结合问题属性进行消歧处理和优先级排序,输出最佳答案。

    二、智能医疗客服问答实战

    定制性智能客服程序一般需要实现选择语料库,去除噪声信息后 根据算法对预料进行训练,最后提供人机接口问答对话,基于互联网获得的医学语料库,并通过余弦相似度基本原理,设计并开发以下问答型智能医疗客服应用程序

    项目结构如下 

    效果展示 

    下面是csv文件中定义的一些病例

    预先定义好的欢迎语句 

     

     

    运行chatrobot文件  弹出以下窗口 输出问题后点击提交咨询即可  

     

    对于语料库中没有的问题会自动推断给出答案(通常不太准确) 

     

     

     三、代码

    部分代码如下 全部代码和数据集请点赞关注收藏后评论区留言私信

    1. # -*- coding:utf-8 -*-
    2. from fuzzywuzzy import fuzz
    3. import sys
    4. import jieba
    5. import csv
    6. import pickle
    7. print(sys.getdefaultencoding())
    8. import logging
    9. from fuzzywuzzy import fuzz
    10. import math
    11. from scipy import sparse
    12. from sklearn.feature_extraction.text import CountVectorizer
    13. from sklearn.feature_extraction.text import TfidfTransformer
    14. from scipy.sparse import lil_matrix
    15. from sklearn.naive_bayes import MultinomialNB
    16. import warnings
    17. from tkinter import *
    18. import time
    19. import difflib
    20. from collections import Counter
    21. import numpy as np
    22. filename = 'label.csv'
    23. def tokenization(filename):
    24. corpus = []
    25. label = []
    26. question = []
    27. answer = []
    28. with open(filename, 'r', encoding="utf-8") as f:
    29. data_corpus = csv.reader(f)
    30. next(data_corpus)
    31. for words in data_corpus:
    32. word = jieba.cut(words[1])
    33. tmp = ''
    34. for x in word:
    35. tmp += x
    36. corpus.append(tmp)
    37. question.append(words[1])
    38. label.append(words[0])
    39. answer.append(words[2])
    40. with open('corpus.h5','wb') as f:
    41. pickle.dump(corpus,f)
    42. with open('label.h5','wb') as f:
    43. pickle.dump(label,f)
    44. with open('question.h5', 'wb') as f:
    45. pickle.dump(question, f)
    46. with open('answer.h5', 'wb') as f:
    47. pickle.dump(answer, f)
    48. return corpus,label,question,answer
    49. def train_model():
    50. with open('corpus.h5','rb') as f_corpus:
    51. corpus = pickle.load(f_corpus)
    52. with open('label.h5','rb') as f_label:
    53. label = pickle.load(f_label,encoding='bytes')
    54. vectorizer = CountVectorizer(min_df=1)
    55. transformer = TfidfTransformer()
    56. tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
    57. words_frequency = vectorizer.fit_transform(corpus)
    58. word = vectorizer.get_feature_names()
    59. saved = tfidf_calculate(vectorizer.vocabulary_,sparse.csc_matrix(words_frequency),len(corpus))
    60. model = MultinomialNB()
    61. model.fit(tfidf,label)
    62. with open('model.h5','wb') as f_model:
    63. pickle.dump(model,f_model)
    64. with open('idf.h5','wb') as f_idf:
    65. pickle.dump(saved,f_idf)
    66. return model,tfidf,label
    67. class tfidf_calculate(object):
    68. def __init__(self,feature_index,frequency,docs):
    69. self.feature_index = feature_index
    70. self.frequency = frequency
    71. self.docs = docs
    72. self.len = len(feature_index)
    73. def key_count(self,input_words):
    74. keys = jieba.cut(input_words)
    75. count = {}
    76. for key in keys:
    77. num = count.get(key, 0)
    78. count[key] = num + 1
    79. return count
    80. def getTfidf(self,input_words):
    81. count = self.key_count(input_words)
    82. result = lil_matrix((1, self.len))
    83. frequency = sparse.csc_matrix(self.frequency)
    84. for x in count:
    85. word = self.feature_index.get(x)
    86. if word != None and word>=0:
    87. word_frequency = frequency.getcol(word)
    88. feature_docs = word_frequency.sum()
    89. tfidf = count.get(x) * (math.log((self.docs+1) / (feature_docs+1))+1)
    90. result[0, word] = tfidf
    91. return result
    92. if __name__=="__main__":
    93. tokenization(filename)
    94. train_model()

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

  • 相关阅读:
    第七章认识Express框架
    【Java学习】语法:包、权限修饰符、final、常量、枚举、抽象类、接口
    Qt 窗口与部署应用程序发布包 day6
    eth ens 合约技术代码细节
    Spring Boot MyBatis Plus 配置数据源详解
    QT打包发布
    算法提升:图的启发式搜索算法(A算法、A*算法)
    Tailwindcss 提取组件
    【定时开关机】windows 10 如何设置定时开关机
    [PSQL] SQL基础教程读书笔记(Chapter1-4)
  • 原文地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/128199100