TA的每日心情 | 开心 2023-5-29 11:12 |
---|
签到天数: 271 天 [LV.8]以坛为家I
海贼
- 积分
- 710
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转最有爱的海贼王论坛。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 bulb 于 2020-5-6 22:27 编辑
****TalkOP海贼王分析区****
地址:http://bbs.talkop.com/forum-fenxi-1.html
作者ID:41536
首发日期:2020.05.06
*********转载请保留*********
各位大家好,好久不见,离上次本系列的更新内容已经过了近三个月(鸽了快三个月),有些遗忘的同学可以可以进入下面回顾一下(P.S. 可视化的网页在之前的基础上又更新了一波,包括人物头像,关系展示等,会在文章末尾部分另外说明)。
【技术向】海贼王实体关系可视化---用知识图谱打开海贼王(一)
地址:http://bbs.talkop.com/thread-121506-1-1.html
今天是第二篇:你问我答
主要是给大家带来和介绍一个快速查询各个角色信息的工具,效果大概如下图所示
相关代码部分在:https://github.com/mrbulb/ONEPIECE-KG/tree/master/vivirecard-KB_query
项目地址:https://github.com/mrbulb/ONEPIECE-KG
入门版
首先需要关注下面的公众号,接着就可以使用查询功能
目前查询一共支持以下几种的问题,
* 对于生日/英文名/血型/星座/霸气/身高的查询
* 谁出生在哪里/出生在某个地方的有谁
例如
雷利的身高是多少?
罗杰的血型是啥
路飞有什么霸气
谁出生在风车村?
当超出这些问题,或者后台系统不知道答案之后,就会回答:I can't understand. 或I don't know.
高级版
上面的入门版是基于REfO将自然语言转换为SPARQL查询语句,之后在Fuseki上查询得到的。
入门版为了方便大家使用,只能支持一些简单的查询,实际上我们可以利用SPARQL进行一些更为高级的查询,例如山治喷鼻血晕倒时,谁可以给他献血(又迫害山治2333)?谁和薇薇一样,是来自阿拉巴斯坦的老乡?怎么从生命卡资料中获取时间线?
想要解锁更高级的查询,就可以自己直接编写SPARQL语句来查询,下面将带大家来实际上手操作一下
1. Jena Fuseki 的安装
下面是 Jena Fuseki 的安装步骤:
1. 前往 Jena 官网下载 Fuseki 压缩包文件 apache-jena-fuseki-3.6.0.zip: http://archive.apache.org/dist/jena/binaries/apache-jena-fuseki-3.6.0.zip
2. 将上述压缩包解压到本机的任意目录,该目录即为 Fuseki 的安装目录;例如, 解 压到目录 C:\tools\apache-jena-fuseki-3.6.0;如图 3-2 所示。
3. Fuseki 的运行需要 Java 环境的支持,版本要求是 JDK 8 以上,如机器中没有安 装 JDK 或版本不满足要求,请安装。安装地址: https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
2. 启动 Fuseki
启动 Fuseki 启动 Jena Fuseki 的步骤如下:
1. 运行“命令提示符”,进入命令行; 在Windows操作系统上可以按 Windows键+R 进入
2. 进入 Fuseki 安装目录,执行命令cd C:\tools\apache-jena-fuseki-3.6.0
3. 在该目录下新建文件夹store,用于保存 Jena TDB 数据库文件,执行命令
mkdir store
4. 启动 Fuseki,执行命令:
fuseki-server --loc=store --update /talkop-vivre-card
命令行输入和输出如下图所示;
5. 使用浏览器打开 Fuseki Web 用户界面,地址为 http://localhost:3030/
3. 导入知识图谱
知识图谱数据可以从本帖附件,或者右边的链接中获取:https://github.com/mrbulb/ONEPIECE-KG/blob/master/vivirecard-KB_query/data/talkop_vivre_card/ntriples_talkop_vivre_card.nt
整个导入的步骤如下
- 在下图所示的 Fuseki 用户界面中单击【 add data】按钮,向数据集/talkop-vivre-card 中
添加数据,转到如下图所示的页面,单击【select files…】 按钮,浏览到 ntriples_talkop_vivre_card.nt文件并将其选中,单击【upload now】将文件上传;
如文件上传成功,则显示如下图所示的界面。
2. 验证是否导入成功
(1) 点击 info 选项后点击 count triples in all graphs,若导入成功则会输出三元组数量
(2) 点击 query 选项后,运行下面查询语句,若导入成功则会输出查询结果
SELECT ?subject ?predicate ?object
WHERE {
?subject ?predicate ?object
}
LIMIT 25
4. 使用SPARQL语言查询
关于SPARQL语言的介绍和入门可以参考:https://zhuanlan.zhihu.com/p/32703794
下面我们给出一些例子来展现一下它的效果
SPARQL查询示例
1. 查询某个角色的全部属性
PREFIX : <http://kg.course/talkop-vivre-card/>
select ?s ?p ?o ?value where {
?s :名称 ?o .
?s ?p ?value .
filter regex(str(?o), '海牛')
}
结果
"s" , "p" , "o" , "value" ,
":0185" , ":ID" , 【功夫海牛】 , "0185" ,
":0185" , ":中文名" , 【功夫海牛】 , 功夫海牛 ,
":0185" , ":初登场" , 【功夫海牛】 , "漫画第18卷 第161话" ,
":0185" , ":名称" , 【功夫海牛】 , 【功夫海牛】 ,
":0185" , ":外文名" , 【功夫海牛】 , "None" ,
":0185" , ":属于" , 【功夫海牛】 , 海牛 ,
":0185" , ":登场篇章" , 【功夫海牛】 , "阿拉巴斯坦/Alabasta Saga" ,
2. 筛选生日范围
PREFIX : <http://kg.course/talkop-vivre-card/>
select ?s ?name ?o where {
?s :生日 ?o .
?s :名称 ?name .
filter(?o > '4月21日' && ?o < '4月29日')
}
limit 5
结果
"s" "name" "o"
"0062" "【克洛/Kuro】" "4月22日"
"0200" "【加卡/Chaka】" "4月26日"
"0375" "【卡莉法/Kalifa】" "4月23日"
"1033" "【夏洛特•蒙多尔/Charlotte Mont-D’or】" "4月23日"
"0435" 【法古弗利德】 "4月28日"
3. 查询路飞的血型
PREFIX : <http://kg.course/talkop-vivre-card/>
select ?s ?p ?o ?value where {
?s :名称 ?o .
?s :血型 ?value .
filter regex(str(?o), '路飞')
}
4. 各个血型人数的统计
PREFIX : <http://kg.course/talkop-vivre-card/>
SELECT DISTINCT ?o (COUNT(?o) as ?oCount) WHERE
{
?s :血型 ?o .
}
GROUP BY ?o
order by DESC(?oCount)
结果
"o" , "oCount" ,
"F型" , "95" ,
"S型" , "95" ,
"X型" , "90" ,
"XF型" , "48" ,
"S型RH-" , "9" ,
, "2" ,
"S型RH阴性" , "1" ,
"X型(巴斯)、XF型(安道)、F型(卡比尔)" , "1" ,
不明 , "1" ,
? , "1" ,
5. 查询和山治一样是熊猫血 S型RH阴性 的有谁?
PREFIX : <http://kg.course/talkop-vivre-card/>
select ?s ?name ?o where {
?s :血型 ?o .
?s :名称 ?name
filter regex(?o, 'S型RH',"i")
}
结果
"s" , "name" , "o" ,
":0005" , "【山治/Sanji】" , "S型RH-" ,
":0742" , "【费舍·泰格/Fisher Tiger】" , "S型RH-" ,
":0798" , "【洛克/Rock】" , "S型RH-" ,
":0799" , "【斯科奇/Scotch】" , "S型RH-" ,
":0902" , "【德林杰/Dellinger】" , "S型RH-" ,
":0987" , "【文斯莫克·勇治/Vinsmoke Yonji】" , "S型RH-" ,
":0997" , "【夏洛特·普拉琳涅/Charlotte Praline】" , "S型RH-" ,
":1013" , "【文斯莫克·伊治/Vinsmoke Ichiji】" , "S型RH-" ,
":1014" , "【文斯莫克·尼治/Vinsmoke Niji】" , "S型RH-" ,
":0005" , "【山治/Sanji】" , "S型RH阴性" ,
6. 根据生命卡信息得到时间线
PREFIX : <http://kg.course/talkop-vivre-card/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select ?s ?name ?p ?o where {
?s ?p ?o .
?s :名称 ?name
filter regex(str(?p), '年前')
BIND(STRBEFORE(str(?p), "年前") AS ?domain)
BIND(STRAFTER(str(?domain), "http://kg.course/talkop-vivre-card/") AS ?domain2)
BIND(xsd:integer(STRAFTER(str(?domain), "http://kg.course/talkop-vivre-card/")) AS ?domain3)
}
ORDER BY DESC(?domain3)
结果"s" "name" "p" "o"
"0484" "【奥兹/Oars】" "500年前" 把国家连岛一起搬回去,建立了恶棍之国
"0317" "【卡尔加拉/Kargara】" "400年前" "与蒙布朗•罗兰度离别(*「400年前」是约数)"
"0317" "【卡尔加拉/Kargara】" "400年前" "杀死卡西神(*「400年前」是约数)"
"0317" "【卡尔加拉/Kargara】" "400年前" "遇见蒙布朗•罗兰度(*「400年前」是约数)"
"0318" "【蒙布朗·诺兰度/Mont Blanc Noland】" "400年前" 漂流到加亚岛,将岛屿从“树热”中拯救出来(*“四百年前”为估算)
"0318" "【蒙布朗·诺兰度/Mont Blanc Noland】" "400年前" 第三次出海前往“伟大航路”(*“四百年前”为估算)
"0318" "【蒙布朗·诺兰度/Mont Blanc Noland】" "400年前" 返回卢布尼尔王国,将“黄金乡”报告给国王(*“四百年前”为估算)
"0318" "【蒙布朗·诺兰度/Mont Blanc Noland】" "400年前" 造访格林比特,拯救咚塔塔一族(*“四百年前”为估算)
7. 查询各个人物资料中,所有和罗杰相关的历史事件信息
PREFIX : <http://kg.course/talkop-vivre-card/>
select ?name ?p ?o where {
?s :名称 ?name.
?s ?p ?o .
filter regex(str(?o), '罗杰',"i").
filter regex(str(?p), '年前',"i").
}
limit 50
结果
"name" "p" "o"
"【香克斯/Shanks】" "25年前" 罗杰海贼团解散
"【巴基/Buggy】" "25年前" 罗杰海贼团解散
"【斯摩格/Smoker】" "24年前" "见证了哥尔•D•罗杰的处刑"
"【库洛卡斯/Crocus】" "28年前" 作为罗杰海贼团的船医随行
"【克洛克达尔/Crocodile】" "24年前" "观看哥尔·D·罗杰的处刑"
"【波特卡斯•D•艾斯/Portgas D Ace】" "22年前" 作为罗杰和露玖的孩子而出生
8. 获取所有可供查询的属性名(predicate)
PREFIX : <http://kg.course/talkop-vivre-card/>
SELECT DISTINCT ?p WHERE {
?s ?p ?o .
}
结果
"p"
"0年前"
"中文名"
"出身地"
"初登场"
"名称"
"名言"
以上所有的代码可以在右边的链接获取:https://paste.ubuntu.com/p/x5w5wvTQSZ/
看到这里有很多人可能会有疑问,这里的很多事情,貌似用excel的功能也能完成,那么使用SPARQL的优势在于哪里?
的确我们这边构建的关系知识图谱是属于比较低层级的,大多数都是实体和属性之间的联系,但实际上很多属性其实应该被当做实体对待,因为他们自己也有很多的关联信息。
例如路飞出生在风车村,风车村在我们目前的知识图谱中是一个简单的属性,但实际上这也可以被当做一个实体,风车村的所属国家是哥亚王国,所属海域是东海。
只利用普通的excel表格式的查询,很难捕捉各个实体背后的关系,但利用SPARQL语句,就能以非常优雅的方式来将这些知识联系起来,从中抽取信息。
待后续整个知识图谱构建完成后,采用SPARQL语言查询的方式就能发挥更大的力量。
感谢
本次技术的开发参考的是SimmerChan和weizhixiaoyi的项目实践,感谢他们的无私分享
https://github.com/SimmerChan/KG-demo-for-movie
https://github.com/weizhixiaoyi/DouBan-KGQA
更新信息
我们对之前可视化关系图谱做了一些的更新,目前选择每个阶段时还会展示对应角色的头像和关系名,帮助你快速回忆起相关角色和情节,详情可访问:https://mrbulb.github.io/ONEPIECE-KG
同时在上述的微信服务号中回复"关系图谱",也能够获取相应访问连接
|
评分
-
查看全部评分
|