基于开源WQ装备知识图谱的智能问答优化

基于笔者之前写的博客基础上:https://blog.csdn.net/zhanghan11366/article/details/142139488【基于开源WQ装备知识图谱的智能问答全流程构建】进行优化。

优化一、

解决你提出的多武器、多关系解析问题,并确保每个武器只匹配其对应的关系,结合分句功能

  1. 改进点:
  • 分句功能:将问题分成多个句子,每个句子分别处理。
  • 关系和武器的精确匹配:确保每个武器只匹配其对应的关系。
  • 灵活解析:可以识别并处理句子中多个武器、多个关系。
  1. 改进点说明:
  • 分句处理:问题会被切分为多个句子,使用 split_sents 函数根据常见的标点符号(如句号、问号、感叹号)进行分割。每个句子会独立处理。
  • 多武器和多关系匹配:在每个句子中,分别提取出相关的武器和关系,并进行相应的查询。确保不会混淆多个武器和它们的对应关系。
  • 缓存武器节点:程序启动时会从 Neo4j 缓存所有武器节点,避免重复查询,提高效率。

主要代码如下:

import re
from neo4j import GraphDatabase


# 全局缓存武器节点
cached_weapons = []

# 查询Neo4j数据库
def query_neo4j(query, parameters=None):
    with driver.session() as session:
        result = session.run(query, parameters)
        return [record for record in result]

# 分句功能
def split_sents(content):
    return [sentence.strip() for sentence in re.split(r'[??!!。;;\n\r]', content) if sentence.strip()]

# 生成回答模块
def generate_answer(sentence):
    # 解析问题,提取武器和关系类型
    parsed_sentence = parse_question(sentence)
    weapons = parsed_sentence.get('weapons')
    relations = parsed_sentence.get('relations')

    if not weapons or not relations:
        return f"无法识别句子中的武器或关系类型: {sentence}"

    answers = []
    for weapon in weapons:
        for relation in relations:
            # 构建查询语句
            query = (
                f"MATCH (w:Weapon {{name: $weapon}})-[r:`{relation}`]->(e) "
                "RETURN e.name AS entity"
            )
            result = query_neo4j(query, parameters={"weapon": weapon})

            # 生成单个武器-关系的回答
            if result:
                entity_list = [record["entity"] for record in result]
                answers.append(f"{weapon}的{relation}是: {', '.join(entity_list)}")
            else:
                answers.append(f"没有找到{weapon}的{relation}信息。")

    return "\n".join(answers)

结果
在这里插入图片描述

优化二

查寻两个武器之间的关系:“PZL P.6战斗机"和"PZL P.1战斗机”。为了解决两两配对查询中可能存在重复结果的问题,可以对配对后的武器查询进行优化。

  1. 主要思路是:
  • 去重处理:在查询之前,使用集合来存储查询对,以避免重复查询同一对武器(无论顺序如何)。
  • 只查询唯一的武器组合:即 (‘weapon1’, ‘weapon2’) 和 (‘weapon2’, ‘weapon1’) 应该视为同一对武器,不必重复查询。
  1. 关键优化点
  • 使用 set():queried_pairs 集合用于存储已经查询过的武器对,确保每个组合只查询一次。这里使用 tuple(sorted([node1, node2])) 来生成无序的组合,即 (‘A’, ‘B’) 和 (‘B’, ‘A’) 会被视为同一个组合。
  • 避免重复查询:每次进行查询前,检查该武器组合是否已经存在于 queried_pairs 中。如果不存在,则进行查询,并将其添加到 queried_pairs 中。
  1. 优化后的效果
  • 同一对武器(如 PZL P.6战斗机 和 PZL P.1战斗机)无论顺序如何,只会查询一次,避免了重复结果。
    提升了查询效率,尤其是在输入包含多个武器节点时,系统不会因重复查询浪费时间。

主要代码:

def generate_answer(sentence):
    # 解析问题,提取武器和关系类型
    parsed_sentence = parse_question(sentence)
    weapons = parsed_sentence.get('weapons')
    print(weapons)
    relations = parsed_sentence.get('relations')

    # 处理两个武器节点之间的关系查询
    if len(weapons) == 2 and not relations:
        node1, node2 = weapons[0], weapons[1]
        return query_relation_between_weapons(node1, node2)

    if not weapons or not relations:
        return f"无法识别句子中的武器或关系类型: {sentence}"

    answers = []
    for weapon in weapons:
        for relation in relations:
            # 构建查询语句
            query = (
                f"MATCH (w:Weapon {{name: $weapon}})-[r:`{relation}`]->(e) "
                "RETURN e.name AS entity"
            )
            result = query_neo4j(query, parameters={"weapon": weapon})

            # 生成单个武器-关系的回答
            if result:
                entity_list = [record["entity"] for record in result]
                answers.append(f"{weapon}的{relation}是: {', '.join(entity_list)}")
            else:
                answers.append(f"没有找到{weapon}的{relation}信息。")

    return "\n".join(answers)

结果如下:
在这里插入图片描述

优化三

查找任意两个节点之间的关系。并在生成每个回答时,仅保留那些有实际关系的答案,避免输出那些无效的“没有找到关系”的信息。可以通过简单的条件检查实现这一点。

主要代码如下:

def generate_answer(sentence):
    # 解析问题,提取节点和关系类型
    parsed_sentence = parse_question(sentence)
    nodes = parsed_sentence.get('nodes')
    relations = parsed_sentence.get('relations')

    # 处理多个节点之间的两两关系查询
    if len(nodes) > 1 and not relations:
        answers = []
        # 使用集合存储查询对,避免重复查询
        queried_pairs = set()

        # 两两配对查询,避免重复的节点组合
        for i in range(len(nodes)):
            for j in range(i + 1, len(nodes)):
                node1, node1_type = nodes[i]
                node2, node2_type = nodes[j]
                # 生成无序的节点对,用于去重
                pair = tuple(sorted([(node1, node1_type), (node2, node2_type)]))


                # 仅当这个配对未被查询过时才进行查询
                if pair not in queried_pairs:
                    queried_pairs.add(pair)  # 记录这个节点配对
                    answer = query_relation_between_nodes(node1, node1_type, node2, node2_type)
                    if answer:  # 仅添加有关系的答案
                        answers.append(answer)

        # 过滤掉没有关系的答案
        return "\n".join(answers) if answers else "没有找到相关的关系。"

    if not nodes or not relations:
        return f"无法识别句子中的节点或关系类型: {sentence}"

    # 单节点与关系类型的查询
    answers = []
    for node, node_type in nodes:
        for relation in relations:
            # 构建查询语句
            query = (
                f"MATCH (n:{node_type} {{name: $node}})-[r:`{relation}`]->(e) "
                "RETURN e.name AS entity"
            )
            result = query_neo4j(query, parameters={"node": node})

            # 生成单个节点-关系的回答
            if result:
                entity_list = [record["entity"] for record in result]
                answers.append(f"{node}的{relation}是: {', '.join(entity_list)}")
            else:
                answers.append(f"没有找到{node}的{relation}信息。")

    return "\n".join(answers)

结果展示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百元内真无线蓝牙耳机推荐有哪些?四大百元性价比品牌公开推荐

在当今这个科技迅速发展的时代,真无线蓝牙耳机以其便携性和自由度成为了许多人日常生活中不可或缺的配件,然而,面对市场上琳琅满目的产品,消费者往往感到眼花缭乱,难以抉择,百元内真无线蓝牙耳机推荐有哪些…

Python | 练习作业 2

为学生登录系统新增搜索功能。 第二天作业的解题思路: # 1.创建一个空列表保存搜索结果 # 2.让用户输入要搜索的内容 # 3.遍历学生信息,检查学生的id name age gender score # 中的属性值 是否跟用户搜索的内容一致 # 4.如果有一致的属性 那么就将该学生…

通过nginx代理转发实现共用80和443端口

目录 项目场景: 问题:怎么实现端口共用? 一、域名解析到nginx服务器 二、创建vhost解析到实际的服务器 三、防火墙的配置 项目场景: 公司自建服务器,有一条专线带有公网IP,如何满足不同的域名解析共用…

春日美食汇:基于SpringBoot的订餐平台

2 系统关键技术 2.1JSP技术 JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。将Java程序添加到传统的web页面HTML文件()。htm,。Html) [1]。 JSP这种能够独立使用的编程语言可以嵌入在html语言里面运行,正因为JSP参照了许多编程语言的特性&#xf…

RHCE--复习(一)之系统延迟任务及定时任务

系统延迟任务及定时任务 #关闭图形命令(第二次开启的时候)[rootlocalhost ~]# systemctl set-default multi-user.target#windos系统级别类型 0-6个级别#查看级别类型[rootlocalhost ~]# runlevel 一、延迟任务 在系统中我们的维护工作大多数时在服务器…

自选择问题和处理效应模型

这里写目录标题 自选择问题和处理效应模型Tobit 模型假定Heckman过程逆米歇尔比率推导过程逆米希尔比率推导过程自选择问题典型事实分析一定要列出来的关于OLS,Heckman-2sls,Heckman三种模型的估计结果对比Heckman两阶段算逆米希尔比率分解 处理效应模型…

labview禁用8080端口

需求背景 最近电脑上安装了labview全家桶,发现idea的8080端口项目启动报错,一直提示8080端口被占用。最简单的办法就是找到8080端口的服务,然后关闭这个服务。但是我不想这么做,我想把labview的web服务器的端口给修改了。 操作教程 1、cmd查看8080端口 2、windows进程 同…

pgAdmin 4备份数据库失败,解决

pgAdmin4中,必须先设置二进制路径;binary paths pgAdmin4操作路径,File—>Preferences—>Paths—>Binary paths 找到postgreSQL的安装目录,bin目录复制,然后设置在截图标记位置; 再去备份数据库就…

flux.1模型在40hx上绘图实践

flux.1是新成立的AI绘画团队。核心成员来自于Stability AI。Stability AI曾经开创了AIGC的新纪元,但管理团队在经营理念上一直有分歧,到了SD3的推出后,团队在开源还是闭源的问题上,产生了重大冲突,直到模型又一次无意外…

零基础5分钟上手亚马逊云科技-为网站服务器配置DNS域名

简介 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技AWS云计算平台…

SAP 公司间采购配置简介

SAP 公司间采购配置简介 说明后台配置说明 上一篇博文中我们演示了公司间采购的前台的操作,本文将针对公司间采购的后台的配置进行说明。 后台配置 1、定义工厂的装运数据 路径:IMG—物料管理—采购—采购订单—设置库存调拨订单—定义工厂的装运数据 在这里插入图片描述 …

集成电感器TPS82130

集成电感器TPS82130 简介 TPS82130是集成了电感跟0603一样大的BUCK降压模块。输入电压3-17V,输出电压0.9-6V,输出电流3A,0.8V参考电压。 TPS82130属于系统级的封装电源模块,目前价格大概是4.5元。它可以实现100%的占空比&#x…

Zookeeper工作机制、特点、数据结构、应用场景、配置参数解读

ZK工作机制 从涉及模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,zk就负责通知已在zk上注册的那些观察者做出相应…

什么是CPU、GPU、NPU?(包懂+会)

目录 举例子 CPU:主厨 GPU:大量的厨房助理 NPU:面包机 总结 讲理论 CPU(中央处理器) GPU(图形处理单元) NPU(神经网络处理单元) 对比分析 举例子 CPU&#xff…

基于SpringBoot+Vue的个性化旅游推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

监控系统添加vcenter上的esxi主机

监控系统的软件选择: 监控系统要求 快速搭建 能快捷地添加vcenter上的主机(esxi) 能实现动态添加主机监控 可供选择的监控软件 Prometheus vmware_exporter添加 vcenter及esxi监控,报奇怪的错误,解决时间比较长&a…

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …

Qt 中openMp 配置

Qt 中openMp 配置 前言 openMP是使用CPU进行并行计算,在实际项目中处理耗时的for循环等,简单有效,本文记录下使用Qt \C项目开发时如何配置openMP 二、工程配置 1.Qt Creator pro工程 区分编译器,配置pro文件 MSVXXX编译器&am…

曝光破21亿,新茶饮行业如何掘金抖音?

沪上阿姨CEO单卫钧曾说:“新茶饮有几个特点,第一个是资本化,第二个是连锁化,第三个就是线上化。” 具体到线上化,除了美团、饿了么这些传统渠道之外,越来越多茶饮咖啡品牌开始布局抖音、快手等内容平台。在…

【kubernetes】配置管理中心Configmap运用

一,介绍 Configmap(简写 cm)是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。 【局限性】:在ConfigMap不是用来保存大量数据的&am…