#gStore-weekly | gAnswer源码解析 调用NE模块流程
简介
gAnswer系统的主要思想,是将自然语言问题转化为语义查询图,再和RDF图做子图匹配。在转换成查询图的第一步就是确定查询图的节点,即节点提取(Node Extraction, NE)。
查询图中的节点由实体(entity)、类型(type)和通配符(wild-cards)构成,因此节点提取的主要工作就是提取问题中的实体和类型的提及(mention),以及给出在知识库中对应的候选。
具体而言,节点提取模块分为离线和在线两部分。离线部分主要是建立实体提及词典(Entity Mention Dictionary),从而将实体提及映射到一定置信度的候选实体上;在线部分首先利用文本处理工具获取问题中的单词和它们的词性标注,再枚举所有词组,通过在字典中查询判断该词组是否为实体或类型。在gAnswer中采用CrossWikis dictionary作为实体提及词典,通过第三方工具standfordNLP来获取单词,以及用开源程序库Lucene实现在字典中查询。
gAnswer中调用NE模块流程
gAnswer中调用NE模块部分如下图所示,在创建的Query类对象中,首先对自然语言问题进行预处理,将部分单词改成等价的其他单词,并去除标点符号,从而减少后续步骤中语法依存分析的错误率;再调用getMergedQuestionList方法返回修改后的问题,并在mWordList对象中保存提取的节点信息。
// step 0: Node (entity & type & literal) Recognition
long t0 = System.currentTimeMillis(), t, NRtime;
Query query = new Query(input);
qlog = new QueryLogger(query);
ArrayList<Sparql> rankedSparqls = new ArrayList<Sparql>();
NRtime = (int)(System.currentTimeMillis()-t0);
System.out.println("step0 [Node Recognition] : "+ NRtime +"ms");
GAnswer.java中调用NE部分
public Query(String _question)
{NLQuestion = _question;NLQuestion = removeQueryId(NLQuestion);TransferedQuestion = getTransferedQuestion(NLQuestion); // step1. NODE RecognitionMergedQuestionList = getMergedQuestionList(TransferedQuestion);// build SentencesList = new ArrayList<Sentence>();for(String mergedQuestion: MergedQuestionList){Sentence sentence = new Sentence(this, mergedQuestion);sList.add(sentence);}
}
Query类的构造函数
getMergedQuestionList方法会新建一个EntityRecognition类的对象,通过process方法实现节点提取。首先通过standfordNLP获取问题中的单词和它们的词性标注,再三重循环对所有词组进行枚举:首先判断是否为category(category是针对DBpedia2016数据集手动筛选出的专有名词),如果不是会继续判断该词组是否为entity或type。
在判断entity时,会分别对该词组的基本形式(baseForm)以及在文中出现的原始形式(originalForm)用lucene和DBpedia Lookup在预处理的词典中进行查找,并返回候选实体及其分数,存放在emList中。
Lucene是由Apache软件基金会支持和提供的一套用于全文检索的开源程序库,提供了简单却强大的接口,能够在较理想的时间内完成对全文的索引和搜寻。在离线部分用lucene对DBpedia2016建立索引后,在线部分可直接通过调用新建lucene.search.IndexSearcher类完成对一个词组的搜索。
DBpedia Lookup是一个基于DBpedia的用于检索RDF数据的实体检索服务,通过配置RDF数据的索引,可将待查询的关键字解析为实体标识符。gAnswer首先通过离线生成的实体提及词典查找每个词组对应的提及,再利用远程的DBpedia Lookup服务进行实体链接。
// Search entity
ArrayList<EntityMapping> emList = new ArrayList<EntityMapping>();
if(!entOmit && !stopEntList.contains(baseWord))
{System.out.println("Ent Check: "+originalWord);checkEntCnt++;// Notice, the second parameter is whether use DBpedia Lookup.emList = getEntityIDsAndNamesByStr(originalWord, (UpperWordCnt>=len-1 || len==1),len);if(emList == null || emList.size() == 0){emList = getEntityIDsAndNamesByStr(baseWord, (UpperWordCnt>=len-1 || len==1), len);}if(emList!=null && emList.size()>10){ArrayList<EntityMapping> tmpList = new ArrayList<EntityMapping>();for(int i=0;i<10;i++){tmpList.add(emList.get(i));}emList = tmpList;}
}
判断entity
在判断type时,会分别将该词组的originalForm和baseForm利用lucene在DBpedia2016中查找,并根据得分排序候选答案;若没找到,再在YAGOtype中搜索。上述结果存放在tmList中。
// Search type
int hitMethod = 0; // 1=dbo(baseWord), 2=dbo(originalWord), 3=yago|extend()
ArrayList<TypeMapping> tmList = new ArrayList<TypeMapping>();
if(!typeOmit)
{System.out.println("Type Check: "+originalWord);//checkTypeCnt++;//search standard type tmList = tr.getTypeIDsAndNamesByStr(baseWord);if(tmList == null || tmList.size() == 0){tmList = tr.getTypeIDsAndNamesByStr(originalWord);if(tmList != null && tmList.size()>0)hitMethod = 2;}elsehitMethod = 1;//Search extend type (YAGO type)if(tmList == null || tmList.size() == 0){tmList = tr.getExtendTypeByStr(allUpperWord);if(tmList != null && tmList.size() > 0){preLog += "++++ Extend Type detect: "+baseWord+": "+" prefferd relaiton:"+tmList.get(0).prefferdRelation+"\n";hitMethod = 3;}}
}
判断type
之后gAnswer会将字符串类型的词组名称、是否为category, entity, type, literal这四个布尔变量,以及emList, tmList全部封装在mWordList中,完成第一步筛选。之后会剔除重复的词组并对候选词组按分数排序,得到处理后的mWordLIst,用于后续问题分析、建立查询图等步骤。
相关文章:
#gStore-weekly | gAnswer源码解析 调用NE模块流程
简介 gAnswer系统的主要思想,是将自然语言问题转化为语义查询图,再和RDF图做子图匹配。在转换成查询图的第一步就是确定查询图的节点,即节点提取(Node Extraction, NE)。 查询图中的节点由实体(entity&am…...
vscode 配置 lua
https://luabinaries.sourceforge.net/ 官网链接 主要分为4个步骤 下载压缩包,然后解压配置系统环境变量配置vscode的插件测试 这里你可以选择用户变量或者系统环境变量都行。 不推荐空格的原因是 再配置插件的时候含空格的路径 会出错,原因是空格会断…...
vscode设置代码模板
一键生成vue3模板代码 效果演示 输入vue3 显示快捷键 按回车键 一键生成自定义模板 实现方法 进入用户代码片段设置 选择片段语言 vue.json输入自定义的代码片段 prefix是触发的内容,按自己的喜好来就行; body是模板代码,写入自己需要的…...
用css实现原生form中radio单选框和input的hover已经focus的样式
一.问题描述:用css实现原生form中radio单选框和input的hover已经focus的样式 在实际的开发中,一般公司ui都会给效果图,比如单选按钮radio样式,input输入框hover的时候样式,以及focus的时候样式,等等&#…...
uniapp:录音权限检查,录音功能
1.可以使用:plus.navigator.checkPermission检查运行环境的权限 2.如果是"undetermined"表示程序未确定是否可使用此权限,此时调用对应的API时系统会弹出提示框让用户确认:plus.audio.getRecorder() <template><view cla…...
Rust开发——切片(slice)类型
1、什么是切片 在 Rust 中,切片(slice)是一种基本类型和序列类型。在 Rust 官方文档中,切片被定义为“对连续序列的动态大小视图”。 但在rust的Github 源码中切片被定义如下: 切片是对一块内存的视图,表…...
如何给shopify motion主题的产品系列添加description
一、Description是什么 Description是一种HTML标签类型,通过指定Description的内容,可以帮助搜索引擎以及用户更好的理解当前网页包含的主要了内容。 二、Description有什么作用 1、基本作用,对于网站和网页做一个简单的说明。 2、吸引点击&…...
力扣刷题-二叉树-二叉树最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。(注意题意) 示例 1: 输入:root [3,9,20,null,null,15,7] 输出&#x…...
注解方式优雅的实现 Redisson 分布式锁
1前言 日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证…...
PHP/Laravel通过经纬度计算距离获取附近商家
实际开发中,常常需要获取用户附近的商家,思路是 获取用户位置(经纬度信息)在数据库中查询在距离范围内的商家 注: 本文章内计算距离所使用地球半径统一为 6378.138 km public function mpa_list($latitude,$longitude,$distance){// $latitude 34.306465;// $longitude 10…...
grafana面板介绍
grafana 快速使用 背景 随着公司业务的不断发展,紧接来的是业务种类的增加、服务器数量的增长、网络环境的越发复杂以及发布更加频繁,从而不可避免地带来了线上事故的增多,因此需要对服务器到应用的全方位监控,提前预警…...
实验三 循环结构程序设计(Python)
第1关:打印图形 zm=input("") #代码开始#代码结束def print_pattern(letter):if not letter.isalpha() or not letter.isupper():print("请输入大写字母")returnstart_char = Aend_char = letterfor i in range(ord(start_char), ord(end_char) + 1):spa…...
Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
Flutter笔记 目录与文件存储以及在Flutter中的使用(上) 文件系统基础知识与路径操作 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:h…...
注意了!申请流量卡时地址一定不要填写学校,不好下卡哦!
当我们在网上购买流量卡时,都会要求让填写准确的收货地址,但是对于收货地址你填对了吗? 很多朋友在提交流量卡申请之后,往往会被运营商拒审,对于拒审的原因除了比较常见的信息填写有有误、涉及禁发地区、重复申…...
minio使用shell上传文件
minio使用shell上传文件 前言1. 编写调用脚本2.测试脚本上传3.候选脚本 前言 业务场景需要实现,服务器文件上传至存储服务。一种方式是安装minio的linux客户端,另一种方式是通过调用minio的api接口实现文件上传。后一种方式不需要依赖minio的客户端使用…...
LeetCode538. Convert BST to Greater Tree
文章目录 一、题目二、题解 一、题目 Given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus the sum of all keys greater than the original key in BST. As a remin…...
iPaaS和RPA,企业自动化应该如何选择?
全球著名的咨询调查机构Gartner在2022年初再次发布了《2022年12大技术趋势》报告。 Gartner是全球最具权威的IT研究与顾问咨询公司,成立于1979年,在界定及分析那些决定了商业进程的发展趋势与技术方面,它拥有二十年以上的丰富经验,…...
AI实践与学习1_Milvus向量数据库实践与原理分析
前言 随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES集群已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。…...
3Dexcite deltgen 2022x 新功能
3DEXCITE DELTAGEN 2022x 现已发布,此次新版发布包含 DELTAGEN 2022x,DELTAGEN MARKETING SUITE 2022x,DELTAGEN XPLORE 2022x,以及软件开发工具包 SDK FOR DELTAGEN 2022x 版本。赶快来获取最新 DG 版本,了解新增内容…...
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形 文章链接:柱状图中最大的矩形 视频链接:柱状图中最大的矩形 1. LeetCode 84. 柱状图中最大的矩形 1.1 思路 本题是给一个数组形象得画出图后求矩形的最大面积是多少。本题和42. 接雨水…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
