智能问答支持自定义问答

news2024/11/24 13:47:05
# -*- coding: utf-8 -*-
# @Time    : 2023-5-12  14:15
# @Author  : shenzh
# @FileName: chat_bot_v1.py
# @Software: PyCharm
"""
    Description:一期智能机器人设计完成,支持自定义问题和答案随时增加功能
        
"""
import json
import jieba


from sklearn.feature_extraction.text import TfidfVectorizer
import pysparnn.cluster_index as ci

import pickle
import pandas as pd


def increase_other_qa(txt_path):

    dict_list = []
    txt_qa = pd.read_csv(txt_path)
    ques_list = txt_qa['question']
    answer_list = txt_qa['answer']
    for index in range(len(ques_list)):
        txt_dict = {}
        txt_dict['q'] = ques_list[index]
        txt_dict['a'] = answer_list[index]
        dict_list.append(txt_dict)
    return dict_list


def get_tfidf_index(qa_path, txt_path, tv_path, cp_path):
    # 数据保存路径

    qa = json.load(open(qa_path, encoding='utf-8'))
    dict_list = increase_other_qa(txt_path)

    for dict_res in dict_list:
        json_str = dict(dict_res)
        # print(json_str)
        qa.append(json_str)

    corpus = []
    for id, item in enumerate(qa):
        tmp = item['q'] + item['a']
        # print(tmp)
        tmp = jieba.cut(tmp)
        tmp = ' '.join(tmp)
        corpus.append(tmp)
    # print(corpus)
    # Generate bag of word
    # TfidfVectorizer is a combination of CountVectorizer and TfidfTransformer
    # Here we use TfidfVectorizer
    tv = TfidfVectorizer()

    # deal with corpus
    tv.fit(corpus)

    # get all words
    # 词典
    tv.get_feature_names()

    # get feature
    # 获取每对 QA 的TF-IDF
    tfidf = tv.transform(corpus)

    # build index
    # 创建索引
    cp = ci.MultiClusterIndex(tfidf, range(len(corpus)))

    # save
    pickle.dump(tv, open(tv_path, 'wb'))
    pickle.dump(cp, open(cp_path, 'wb'))
    return qa, tv_path, cp_path


def predict_ans(question, qa, tv_path, cp_path, answer_num, distance_flag):
    # 分词
    cutted_qustion = jieba.cut(question)
    cutted_qustion = ' '.join(cutted_qustion)

    # retrieve qa, tv and cp built in gen.pysparnn
    # 加载之前保存的数据
    # qa = json.load(open(qa_path))
    tv = pickle.load(open(tv_path, 'rb'))
    cp = pickle.load(open(cp_path, 'rb'))

    # construct search data
    # 构造搜索数据
    search_data = [cutted_qustion]
    search_tfidf = tv.transform(search_data)

    # search from cp, k is the number of matched qa that you need
    # 搜索数据,会获取到前 k 个匹配的 QA
    result_array = cp.search(search_tfidf, k=int(answer_num), k_clusters=2, return_distance=distance_flag)
    # print(result_array)
    result = result_array[0]
    # print(result)
    # print("Top matched QA:")
    # print('====================='

    '''
     [{
        "que": "空气净化器pro噪音大吗",
        "ans": "您好,可以开启睡眠模式,几乎没有噪音",
        "sim_value": 1
    }]
    
    '''
    faq_list = []
    if distance_flag:
        for distance_value, id in result:
            faq_dict = {}
            distance_value2 = 1 - round(distance_value, 2)
            # print('ORI_Q:' + question)
            # print('Q:' + qa[int(id)]['q'])
            # print('A:' + qa[int(id)]['a'])
            # print('DV:' + str(distance_value2))
            # print('=====================')

            faq_dict['que'] = qa[int(id)]['q']
            faq_dict['ans'] = qa[int(id)]['a']
            faq_dict['sim_value'] = str(distance_value2)
            faq_list.append(faq_dict)

    else:
        for id in result:
            faq_dict = {}
            # print('ORI_Q:' + question)
            # print('Q:' + qa[int(id)]['q'])
            # print('A:' + qa[int(id)]['a'])
            # print('=====================')

            faq_dict['que'] = qa[int(id)]['q']
            faq_dict['ans'] = qa[int(id)]['a']
            faq_dict['sim_value'] = ""
            faq_list.append(faq_dict)

    return faq_list
if __name__ == '__main__':
    qa_path = '../data/qa.json'  ##通用型的问题和答案
    txt_path = '../data/qa_.csv'  ##外加指定的问题和答案
    tv_path = '../data/tv.pkl'
    cp_path = '../data/cp.pkl'

    qa, tv_path, cp_path = get_tfidf_index(qa_path, txt_path, tv_path, cp_path)
    question = '需要配备电源插座吗?'  ##问题
    answer_num = 2  ##返回推荐结果的个数
    distance_flag = True  ##结果的相似度的值
    predict_ans(question, qa, tv_path, cp_path, answer_num, distance_flag)

qa.json样例数据

qa_.csv

 

 

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

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

相关文章

NOV Diagram for .NET Crack

NOV Diagram for .NET Crack 增加了对Microsoft.NET 7.0的支持-NOV现在完全支持.NET Core 7.0,此外还支持Microsoft.NET Framework 4.7.2、.NET Core 5.0和.NET Core 6.0的内部版本。 添加了对读取Microsoft Visio 2003-2010绘图(VSD文件)的支持。 改进了SVG导出。 …

哈希表应用——位图

应用场景:海量数据处理(这里的海量是指一般数据量非常大如以亿为单位的数据量) 目录 面试题 位图概念 位图的实现 位图的应用 应用一 应用二 位图应用变形 面试题 给40亿个不重复的无符号整数,没排过序。给一个无符号整数&…

Java之多线程进阶

目录 一.上节内容复习 1.线程池的实现 2.自定义一个线程池,构造方法的参数及含义 3.线程池的工作原理 4.拒绝策略 5.为什么不推荐系统提供的线程池 二.常见的锁策略 1.乐观锁和悲观锁 2.轻量级锁和重量级锁 3.读写锁和普通互斥锁 4.自旋锁和挂起等待锁 5.可重入锁和…

精彩回顾 | Fortinet Accelerate 2023·中国区巡展厦门站

Fortinet Accelerate 2023中国区 5月16日,Fortinet Accelerate 2023中国区巡展来到魅力“鹭岛”——厦门,技术、产品和业务专家,携手亚马逊云科技、唯一网络等云、网、安合作伙伴,与交通、物流、金融等各行业典型代表客户&#x…

GPT大语言模型Vicuna本地化部署实践(效果秒杀Alpaca) | 京东云技术团队

​ 背景 上一篇文章《[GPT大语言模型Alpaca-lora本地化部署实践]》介绍了斯坦福大学的Alpaca-lora模型的本地化部署,并验证了实际的推理效果。 总体感觉其实并不是特别理想,原始Alpaca-lora模型对中文支持并不好,用52k的中文指令集对模型进…

信息安全工程实验——口令攻击和钓鱼攻击(自用)

目录 实验目的 实验原理 实验内容 练习1windows口令破解 1、基本操作 2、思考与总结 练习2:QQ 邮箱的钓鱼攻击 1、构造钓鱼页面 2、接收钓鱼所得的账号和密码(分档) 3、实验验证 4、思考与总结 实验目的 (1&#xff09…

网络安全实验——信息收集与主机发现

目录 实验目的 实验原理 实验内容 1.信息搜集 1.ping探测 2. Nmap扫描 3. 探测总结 2.主机发现程序开发 3.主机发现 实验总结 实验目的 1.了解信息搜集的一般步骤。 2.学会熟练使用ping命令。 3.学会利用Nmap等工具进行信息搜集。 4.了解IP助手函数。 5.掌握Sen…

Python学习29:存款买房(B)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业,…

李莫愁给张无忌朋友圈点赞?详解SpringBoot事件机制

Spring Boot的事件机制是基于Spring框架的事件机制实现的。Spring Boot中的事件机制可以让我们在应用程序中监听和响应特定的事件,例如应用程序启动、关闭、上下文刷新等。 接下来,我们通过一个案例,来讲解具体怎么使用。 这个案例就是李莫…

一文看懂增值税发票识别OCR:从技术原理到 API Java 示例代码接入

引言 增值税发票识别OCR API是一项重要的技术创新,它在如今信息化的商业环境中发挥着重要作用。通过利用该API,企业和机构能够实现增值税发票的自动化识别和信息提取,从而在财务管理、票据核对、报销流程等方面带来许多好处。 本文将详细介…

Istio virtual service 超时和重试

在使用xshell去远程连接服务器的时候没有反应,这样可能等了几分钟,这样按下crtlc终止就行了。 有些时候微服务是多个服务组成的,a服务会去调用b服务,可能因为网络问题或者连接问题,没有连接成功,那么会尝试…

怎么把音频的声音调大?

怎么把音频的声音调大?我们平时会经常使用到音频文件,但声音大小不一,可能会让我们感到不适应。如果太大,甚至会使人吓一跳;如果太小,则难以听清楚。为了轻松聆听音频,我们需要将声音调整到合适…

ConvNeXt网络详解,最新ConvNeXt结合YOLO,催生YOLOv5目标检测巨变

目录 引言一、ConvNeXt的介绍1、目标检测的重要性2、YOLOv5的介绍3、ConvNeXt原理和特点4、ConvNeXt结构 二、相关研究综述1、目标检测的基础原理和流程2、YOLOv5的特点与局限性3、ConvNeXt技术在目标检测中的应用现状 三、ConvNeXt在YOLOv5中的应用与改进1、安装PyTorch和torc…

什么是栈,为什么函数式编程语言都离不开栈?

文章目录 一、什么是栈,什么是FILO二、栈的作用是什么,为什么编程语言函数调用都选择用栈?三、使用C模拟实现解析栈1.结构体的定义2.栈的创建及销毁3.实现入栈操作4.获取栈顶元素及出栈操作5.获取栈中有效元素个数 源代码分享 一、什么是栈&a…

临时被拉去已经在进行中的项目组「救火」,该怎么开展管理?

当你被临时拉去参与正在进行中的项目组,需要进行所谓的「救火」工作时,你需要注意的是如何开展管理,以确保项目能够成功完成。 首先,你需要了解项目的当前状态。了解项目的进展情况、目标和计划,以及团队成员的角色和…

Vmware Linux磁盘空间扩容

Linux磁盘空间扩容 VMware虚拟机中配置(1)进入虚拟机设置界面,选择扩展磁盘容量。(2) 本次是在原来30G的基础上扩展为50G。 Linux中设置(1) 可以看出sda3是根分区,下面按照博客提示&…

栈的实现(附含经典例题)

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚍代码仓库:阿博编程日记 🍥欢迎关注:欢迎友友们点赞收藏关注哦🌹 文章目录 🍀前言🏄‍♂️数…

Redis系列--哨兵模式

一、什么是哨兵 Redis Sentinel(哨兵)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程, 这些进程使用 gossip协议(基于流行病传播方式的节点或者进程之间信息交换的协议,在分布式系统中被广泛使用) 来接收关于Master是否下线…

MySQL5.0完全卸载教程

一、停止MySQL服务 在系统服务中找到mysql服务并停止即可。 二、卸载mysql应用程序 在控制面板中卸载mysql应用程序 三、删除mysql文件夹 找到mysql一开始安装路径的文件夹,然后删除掉该整个文件夹。 四、删除注册表 (1)按winR键,…

架构师日记-从代码到设计的性能优化指南 | 京东云技术团队

一 前言 服务性能是指服务在特定条件下的响应速度、吞吐量和资源利用率等方面的表现。据统计,性能优化方面的精力投入,通常占软件开发周期的10%到25%左右,当然这和应用的性质和规模有关。性能对提高用户体验,保证系统可靠性&…