#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. 接雨水…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...