场景化应用实战系列六:检索问答系统

news2025/5/23 12:46:52

目录

景化应用实战系列六:检索问答系统

一、目标设定

二、关键知识点梳理

三、案例讲解与实战操作

1. 数据准备与预处理

2. 倒排表构建

3. 文本相似度计算

4. 检索问答系统实现

5. 系统优化与改进


一、目标设定

构建一个高效的检索问答系统,能够快速准确地回答用户的问题,提升用户体验和信息检索效率。

二、关键知识点梳理

  1. 倒排表构建

    • 理解倒排表的基本概念和原理,了解如何通过分词和建立索引实现倒排表。

    • 掌握倒排表在文本检索中的应用,能够利用倒排表实现快速的文本检索功能。

  2. 文本相似度计算

    • 学习文本相似度计算的方法,如余弦相似度、Jaccard 相似度等。

    • 能够将文本相似度计算应用于文本匹配和检索,以提高检索的准确性和相关性。

  3. 检索问答系统实现

    • 整合倒排表和文本相似度计算,构建完整的检索问答系统。

    • 实现对用户输入问题的理解、分析和检索,以及对检索结果的处理和回答生成。

  4. 优化与改进

    • 探索倒排表和文本相似度计算的优化方法,提高检索效率和准确性。

    • 持续改进问答系统,以更好地满足用户需求和提高用户体验。

三、案例讲解与实战操作

1. 数据准备与预处理

import json
import jieba

# 加载知识库数据
with open('knowledge_base.json', 'r', encoding='utf-8') as f:
    knowledge_base = json.load(f)

# 文本预处理函数
def preprocess_text(text):
    # 分词
    segs = jieba.lcut(text)
    # 去除停用词(假设已有一个停用词列表 stopwords)
    filtered_segs = [word for word in segs if word not in stopwords]
    return filtered_segs

# 预处理知识库中的问题和答案
stopwords = set(line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines())
for item in knowledge_base:
    item['question'] = preprocess_text(item['question'])
    item['answer'] = preprocess_text(item['answer'])

2. 倒排表构建

# 构建倒排表
inverted_index = {}
for doc_id, item in enumerate(knowledge_base):
    for word in item['question']:
        if word not in inverted_index:
            inverted_index[word] = []
        inverted_index[word].append(doc_id)

# 查看倒排表
for word in inverted_index:
    print(f"词: {word}, 文档列表: {inverted_index[word]}")

3. 文本相似度计算

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 示例文本相似度计算
def calculate_similarity(text1, text2):
    # 将文本转换为 TF-IDF 向量
    vectorizer = TfidfVectorizer()
    tfidf_matrix = vectorizer.fit_transform([text1, text2])
    # 计算余弦相似度
    similarity = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
    return similarity[0][0]

# 示例:计算两个文本的相似度
text1 = '如何构建倒排表'
text2 = '倒排表的构建方法'
similarity = calculate_similarity(text1, text2)
print(f"文本相似度: {similarity}")

4. 检索问答系统实现

# 检索问答系统函数
def retrieval_qa_system(user_question):
    # 预处理用户问题
    processed_question = preprocess_text(user_question)
    # 根据倒排表获取相关文档
    related_docs = set()
    for word in processed_question:
        if word in inverted_index:
            related_docs.update(inverted_index[word])
    # 如果没有相关文档,返回默认回答
    if not related_docs:
        return "抱歉,我没有找到相关的信息。"
    # 计算用户问题与相关文档的相似度
    max_similarity = -1
    best_answer = ""
    for doc_id in related_docs:
        doc_text = ' '.join(knowledge_base[doc_id]['question'])
        similarity = calculate_similarity(user_question, doc_text)
        if similarity > max_similarity:
            max_similarity = similarity
            best_answer = ' '.join(knowledge_base[doc_id]['answer'])
    return best_answer

# 示例:用户提问
user_question = "如何计算文本相似度"
answer = retrieval_qa_system(user_question)
print(f"用户问题: {user_question}")
print(f"系统回答: {answer}")

5. 系统优化与改进

# 更新倒排表
def update_inverted_index(knowledge_base):
    inverted_index = {}
    for doc_id, item in enumerate(knowledge_base):
        for word in item['question']:
            if word not in inverted_index:
                inverted_index[word] = []
            inverted_index[word].append(doc_id)
    return inverted_index

# 定期更新知识库和倒排表
def update_knowledge_base_and_inverted_index():
    # 假设有一个函数可以获取最新的知识库数据
    latest_knowledge_base = get_latest_knowledge_base()
    # 预处理更新后的知识库
    for item in latest_knowledge_base:
        item['question'] = preprocess_text(item['question'])
        item['answer'] = preprocess_text(item['answer'])
    # 更新倒排表
    inverted_index = update_inverted_index(latest_knowledge_base)
    return latest_knowledge_base, inverted_index

# 示例:优化后更新系统
knowledge_base, inverted_index = update_knowledge_base_and_inverted_index()

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

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

相关文章

已经 上线 Vue 项目 国际化 i18n 中译英

省流说明:本文不是把项目中译英,只是抽取js、vue文件里的中文到JSON文件中,en.json里的value还是需要自己翻译成英文 ### 安装 `npm install vve-i18n-cli -D` ### package.json 里添加脚本命令,简化命令使用 ```json { "scripts": { "i18n": …

RISC-V 开发板 MUSE Pi Pro Gstreamer 编码UVC及MIPI CSI摄像头视频流

视频讲解: RISC-V 开发板 MUSE Pi Pro Gstreamer 编码UVC及MIPI CSI摄像头视频流 Gstreamer 在视频编码、解码、保存等场景下非常常用,其基于插件化的架构,可以玩的很花,进迭时空的Spacemit GStreamer 支持 spacemitdec 专有插件&…

【RA-Eco-RA2L1-48PIN】ADC 电压表

【RA-Eco-RA2L1-48PIN】ADC 电压表 本文介绍了 RA-Eco-RA2L1-48PIN 开发板通过瑞萨 e2 Studio 灵活软件包(FSP)编程实现 ADC 串口采集电压的项目设计,包括 串口通信、打印字符串、UART 和 ADC 配置、关键代码、ADC 电压转换、电压值串口打印…

KS107BG型超声体模的结构及性能

KS107BG型超声体模适用于工作频率在5~10MHz之间的B超设备的性能检测。 一、外部结构 体模外壳和底座由有机玻璃加工组装而成,底面板上开有两个直径36mm的圆孔,其上封有2mm厚的真空橡皮,作为抽气及注射保养液的入口。体模外壳外表…

目标检测评估指标mAP详解:原理与代码

目标检测评估指标mAP详解:原理与代码 目标检测评估指标mAP详解:原理与代码一、前言:为什么需要mAP?二、核心概念解析2.1 PR曲线(Precision-Recall Curve)2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…

【风控】模型算法区分度指标KS

一、KS指标的定义原理 背景 KS(Kolmogorov–Smirnov)原本用于检验样本分布与理论分布或两个样本分布是否一致。风控建模中,将“好样本”(Good)与“坏样本”(Bad)的模型输出概率看作两组经验分布…

win11下jenkins+docker+maven自动部署springboot项目

win11下jenkinsdockermaven自动部署springboot项目 一、前置软件安装二、jenkins配置三、springboot项目准备四、jenkins打包部署项目到本地docker中五、jenkins打包部署项目到远程服务器docker中 一、前置软件安装 docker安装 需要开启wsl,以管理员身份运行docke…

《决策科学与艺术》No1: 决策树:概念、原理、发展历史、特点及应用

决策树:概念、原理、发展历史、特点及应用 摘要 决策树是一种广泛使用的机器学习和决策分析方法,以其可解释性、简洁性和多功能性著称。本文全面介绍了决策树的概念基础、基本原理、发展历程、显著特征及其在商业、医疗、金融和工程等多个领域的典型应用…

【苍穹外卖】Day01—Mac前端环境搭建

目录 一、安装Nginx (一)安装Homebrew (二)Homebrew安装Nginx 1. 执行安装命令: 2. 验证安装: (三)启动与停止Nginx 二、配置Nginx 1. 替换nginx.conf 2. 替换html文件夹 三…

软考中级软件设计师——设计模式篇

一、设计模式核心分类 设计模式分为 3 大类,共 23 种模式(考试常考约 10-15 种): 分类核心模式考试重点创建型模式工厂方法、抽象工厂、单例、生成器、原型单例模式的实现(懒汉、饿汉)、工厂模式的应用场…

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…

微软全新开源命令行文本编辑器:Edit — 致敬经典,拥抱现代

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言:命令行的新利器二、Edit:致敬经典,拥抱现代1. 命令行的“新升级”2. 为什么要有 Edit?三、核心功能与特性一览1. 完全开源、MIT 许可证…

年会招标抽奖活动软件———仙盟创梦IDE

年会是企业一年的总结与欢庆时刻,而抽奖环节更是点燃全场气氛的关键。如何让抽奖环节既大气又充满仪式感?选对抽奖软件至关重要!本文精心挑选了 3 款兼具实用性与氛围感的年会抽奖软件,从界面设计到功能特色,全方位为你…

智防火灾,慧控能耗:物联网赋能金融行业电气安全革新

摘要 随着金融行业对电气安全需求的不断提升,传统用电管理模式已难以满足现代金融机构对火灾防控、能耗管理和智能运维的要求。本文基于物联网、云计算及大数据分析技术,提出一套针对金融行业的安全用电解决方案。该方案通过智能化硬件部署与平台化管理…

在 JavaScript 中正确使用 Elasticsearch,第二部分

作者:来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践,并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间! Elasticsearch 拥有大量新…

更新nvidia-container-toolkit 1.17.7-1后,运行--gpus all 卡死问题

用Arch每日一滚,结果今天用 sudo docker run -it --runtimenvidia --gpus all居然卡死了,排雷排了几小时,才从开源库发现问题 nvidia-container-toolkit 1.17.7-1 是有问题的,而且在ubuntu和arch上都存在问题。 只好Downgrade 1.…

通义灵码 2.5 版深度评测:智能编程的边界在哪里?

通义灵码 2.5 版深度评测:智能编程的边界在哪里? 评测目标 全面测试智能体模式:是否真正具备自主决策能力?MCP 工具集成体验:能否提升开发效率?AI 记忆自感知能力:是否能真正理解开发者习惯&a…

电商项目-商品微服务-规格参数管理,分类与品牌管理需求分析

本文章介绍:规格参数管理与分类与品牌管理的需求分析和表结构的设计。 一、规格参数管理 规格参数模板是用于管理规格参数的单元。规格是例如颜色、手机运行内存等信息,参数是例如系统:安卓(Android)后置摄像头像素&…

零基础设计模式——创建型模式 - 工厂方法模式

第二部分:创建型模式 - 工厂方法模式 (Factory Method Pattern) 上一节我们学习了单例模式,它关注如何保证一个类只有一个实例。现在,我们来看另一个重要的创建型模式——工厂方法模式。它关注的是如何创建对象,但将创建的决定权…

蓝桥杯5130 健身

问题描述 小蓝要去健身,他可以在接下来的 1∼n 天中选择一些日子去健身。 他有 m 个健身计划,对于第 i 个健身计划,需要连续的 天,如果成功完成,可以获得健身增益 si​ ,如果中断,得不到任何…