精华内容
下载资源
问答
  • 知识图谱 问答系统

    2018-03-27 20:39:26
    肖仰华-大规模概念图谱构建与...腾讯-大规模知识图谱的构建与应用-苏州大学 KG Refinement by Knowledge Intensive Crowdsourcing 面向智能问答的知识获取 陈虹-知识图谱及其变种在行业实践中的应用与思考-ZTE中兴
  • 该KBQA系统可以解析输入的自然语言问句,主要运用REFO库的"对象正则表达式"匹配得到结果, 进而生成对应 SPARQL 查询语句,再通过API请求后台基于TDB知识图谱数据库的 Apache Jena Fuseki 服务, 得到结果。...
  • 细致介绍了一种基于知识图谱问答系统,构建了一个推理模型,在建模问题回答过程中是十分有效的。
  • 基于知识图谱问答系统 -- SpringBoot整合Neo4j开发问答系统 PS:资源的下载积分会随下载次数自动增加越来越多,如果您积分不够的话可以私信我重置下载分数
  • 电影知识图谱问答系统项目总结

    千次阅读 2019-03-06 22:35:17
    本次问答系统是复现实验,使用rdf作为知识存储的工具,原始的项目源码,原始参考:知乎专栏 作者源码是python2写的,我将其改写为python3,更改后项目源码链接,提取码:8fk4 在复现系统的过程中将自己遇到的一些...

    本次问答系统是复现实验,使用rdf作为知识存储的工具,原始的项目源码,原始参考:知乎专栏

    作者源码是python2写的,我将其改写为python3,更改后项目源码链接,提取码:8fk4

    在复现系统的过程中将自己遇到的一些问题记录下来,方便自己以后查阅以及让读者少走一些弯路

    源码文件结构展示:

    项目的主逻辑文件在 ./KG-demo-for-movie-master/kg_demo_movie下,其中crawler文件夹用于爬取数据,由于数据原作者已给出,所以这个文件夹不用,另一个文件夹KB_query,其子文件(如下图)为问答的逻辑文件

    • "external_dict"包含的是人名和电影名两个外部词典。csv文件是从mysql-workbench导出的,按照jieba外部词典的格式,我们将csv转为对应的txt。

    • "word_tagging",定义Word类的结构(即我们在REfO中使用的对象);定义"Tagger"类来初始化词典,并使用jieba对句子进行分词和词性标注,并实现自然语言到Word对象的方法,运行效果如下:

    • "jena_sparql_endpoint",用于完成与Fuseki的交互。首先我们需要启动fuseki服务,下载解压Apache-Jena和Apache-Jena-fuseki,下载地址:清华镜像站(fuseki使用方法请看我的另一篇博客),Jena我们后面用,先看Jena_fuseki

    进入fuseki文件夹,双击fuseki-server.bat脚本文件,出现如图所示的界面

    然后我们用浏览器访问:http://localhost:3030

     

    查询输入如下代码: 

    PREFIX : <http://www.kgdemo.com#>
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    
    SELECT DISTINCT ?x WHERE {
    ?p :personName '周润发'.?p :hasActedIn ?m.?m :movieTitle ?x.?m :movieRating ?r.filter(?r >7)
    }

    查询效果如下图: 

    这样fuseki服务器就启动好了,接下来在回到代码,在代码中访问fuseki服务,获取其返回值,例如我们查询周星驰的电影:

    my_query = """
            PREFIX : <http://www.kgdemo.com#>
            PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            
            SELECT DISTINCT ?x WHERE {
            ?s :personName '周星驰'.?s :hasActedIn ?m.?m :movieTitle ?x
            }
            limit 1000
        """

    代码输出效果:

    {'head': {'vars': ['x']}, 'results': {'bindings': [{'x': {'type': 'literal', 'value': '鹿鼎记 II : 神龙敎'}}, {'x': {'type': 'literal', 'value': 'Xiao tou a xing'}}, {'x': {'type': 'literal', 'value': '武状元苏乞儿'}}, {'x': {'type': 'literal', 'value': '最佳女婿'}}, {'x': {'type': 'literal', 'value': '大内密探零零发'}}, {'x': {'type': 'literal', 'value': '刑警本色'}}, {'x': {'type': 'literal', 'value': '长江七号'}}, {'x': {'type': 'literal', 'value': '无敌幸运星'}}, {'x': {'type': 'literal', 'value': '睹侠'}}, {'x': {'type': 'literal', 'value': '群星会'}}, {'x': {'type': 'literal', 'value': '少林足球'}}, {'x': {'type': 'literal', 'value': 'Man hua wei long'}}, {'x': {'type': 'literal', 'value': '师兄撞鬼'}}, {'x': {'type': 'literal', 'value': '整蛊专家'}}, {'x': {'type': 'literal', 'value': '逃学威龙'}}, {'x': {'type': 'literal', 'value': '审死官'}}, {'x': {'type': 'literal', 'value': 'Yi ben man hua chuang tian ya II miao xiang tian ka'}}, {'x': {'type': 'literal', 'value': '97 ga yau hei si'}}, {'x': {'type': 'literal', 'value': '阴阳界'}}, {'x': {'type': 'literal', 'value': '算死草'}}, {'x': {'type': 'literal', 'value': '龙的传人'}}, {'x': {'type': 'literal', 'value': '特技猛龙'}}, {'x': {'type': 'literal', 'value': '咖喱辣椒'}}, {'x': {'type': 'literal', 'value': '幸运一条龍'}}, {'x': {'type': 'literal', 'value': '喜剧之王'}}, {'x': {'type': 'literal', 'value': '龙在天涯'}}, {'x': {'type': 'literal', 'value': '望夫成龙'}}, {'x': {'type': 'literal', 'value': '破坏之王'}}, {'x': {'type': 'literal', 'value': '回魂夜'}}, {'x': {'type': 'literal', 'value': '济公'}}, {'x': {'type': 'literal', 'value': '捕风汉子'}}, {'x': {'type': 'literal', 'value': '神击大道'}}, {'x': {'type': 'literal', 'value': '国产凌凌漆'}}, {'x': {'type': 'literal', 'value': '龙凤茶楼'}}, {'x': {'type': 'literal', 'value': '千王之王 2000'}}, {'x': {'type': 'literal', 'value': 'Film ohne Fesseln - Das neue Hongkong Kino'}}, {'x': {'type': 'literal', 'value': '西游记第壹佰零壹回之月光宝盒'}}, {'x': {'type': 'literal', 'value': '新精武门1991'}}, {'x': {'type': 'literal', 'value': '百变星君'}}, {'x': {'type': 'literal', 'value': '江湖最后一个大路'}}, {'x': {'type': 'literal', 'value': '赌圣'}}, {'x': {'type': 'literal', 'value': '功夫'}}, {'x': {'type': 'literal', 'value': '风雨同路'}}, {'x': {'type': 'literal', 'value': '义胆群英'}}, {'x': {'type': 'literal', 'value': 'Fei zhou he shang'}}, {'x': {'type': 'literal', 'value': '豪门夜宴'}}, {'x': {'type': 'literal', 'value': '食神'}}, {'x': {'type': 'literal', 'value': '流氓差婆'}}, {'x': {'type': 'literal', 'value': '唐伯虎点秋香'}}, {'x': {'type': 'literal', 'value': '赌覇'}}, {'x': {'type': 'literal', 'value': '西游记大结局之仙履奇缘'}}, {'x': {'type': 'literal', 'value': '英雄本色'}}, {'x': {'type': 'literal', 'value': '九品芝麻官之白面包靑天'}}, {'x': {'type': 'literal', 'value': '一本漫画天涯'}}, {'x': {'type': 'literal', 'value': 'Final Justice'}}, {'x': {'type': 'literal', 'value': '建国大业'}}, {'x': {'type': 'literal', 'value': '琉璃樽'}}, {'x': {'type': 'literal', 'value': '逃学威龙 II'}}, {'x': {'type': 'literal', 'value': '家有囍事'}}, {'x': {'type': 'literal', 'value': '鹿鼎记'}}, {'x': {'type': 'literal', 'value': '逃学威龙 III 龙过鸡年'}}, {'x': {'type': 'literal', 'value': '赌侠 III 之上海滩赌圣'}}]}}
    ['鹿鼎记 II : 神龙敎', 'Xiao tou a xing', '武状元苏乞儿', '最佳女婿', '大内密探零零发', '刑警本色', '长江七号', '无敌幸运星', '睹侠', '群星会', '少林足球', 'Man hua wei long', '师兄撞鬼', '整蛊专家', '逃学威龙', '审死官', 'Yi ben man hua chuang tian ya II miao xiang tian ka', '97 ga yau hei si', '阴阳界', '算死草', '龙的传人', '特技猛龙', '咖喱辣椒', '幸运一条龍', '喜剧之王', '龙在天涯', '望夫成龙', '破坏之王', '回魂夜', '济公', '捕风汉子', '神击大道', '国产凌凌漆', '龙凤茶楼', '千王之王 2000', 'Film ohne Fesseln - Das neue Hongkong Kino', '西游记第壹佰零壹回之月光宝盒', '新精武门1991', '百变星君', '江湖最后一个大路', '赌圣', '功夫', '风雨同路', '义胆群英', 'Fei zhou he shang', '豪门夜宴', '食神', '流氓差婆', '唐伯虎点秋香', '赌覇', '西游记大结局之仙履奇缘', '英雄本色', '九品芝麻官之白面包靑天', '一本漫画天涯', 'Final Justice', '建国大业', '琉璃樽', '逃学威龙 II', '家有囍事', '鹿鼎记', '逃学威龙 III 龙过鸡年', '赌侠 III 之上海滩赌圣']
    

     当然,如果代码真的这样写的话就是硬编码了,代码就被写死了,我们需要的效果是用户输入一句自然语言我们可以解析出一条查询语句,然后向fuseki服务器请求,如何将问句转换成sparql? 

    • "question2sparql",这个文件就是将自然语言转为对应的SPARQL语句,看懂这个代码之前,我们需要知道基于规则的匹配

    • "question_temp",这个文件定义了SPARQL模板和匹配规则,我们就是通过这个匹配规则将自然语言转换成sparql的,主要的一些规则如下,当然这个只是句子的规则,还有词法的规则

    rules = [
        Rule(condition_num=2, condition=person_entity + Star(Any(), greedy=False) + movie + Star(Any(), greedy=False), action=QuestionSet.has_movie_question),
        Rule(condition_num=2, condition=(movie_entity + Star(Any(), greedy=False) + actor + Star(Any(), greedy=False)) | (actor + Star(Any(), greedy=False) + movie_entity + Star(Any(), greedy=False)), action=QuestionSet.has_actor_question),
        Rule(condition_num=3, condition=person_entity + Star(Any(), greedy=False) + person_entity + Star(Any(), greedy=False) + (movie | Star(Any(), greedy=False)), action=QuestionSet.has_cooperation_question),
        Rule(condition_num=4, condition=person_entity + Star(Any(), greedy=False) + compare + number_entity + Star(Any(), greedy=False) + movie + Star(Any(), greedy=False), action=QuestionSet.has_compare_question),
        Rule(condition_num=3, condition=person_entity + Star(Any(), greedy=False) + category + Star(Any(), greedy=False) + movie, action=QuestionSet.has_movie_type_question),
        Rule(condition_num=3, condition=person_entity + Star(Any(), greedy=False) + genre + Star(Any(), greedy=False) + (movie | Star(Any(), greedy=False)), action=QuestionSet.has_specific_type_movie_question),
        Rule(condition_num=3, condition=person_entity + Star(Any(), greedy=False) + several + Star(Any(), greedy=False) + (movie | Star(Any(), greedy=False)), action=QuestionSet.has_quantity_question),
        Rule(condition_num=3, condition=person_entity + Star(Any(), greedy=False) + comedy + actor + Star(Any(), greedy=False), action=QuestionSet.is_comedian_question),
        Rule(condition_num=3, condition=(person_entity + Star(Any(), greedy=False) + (when | where) + person_basic + Star(Any(), greedy=False)) | (person_entity + Star(Any(), greedy=False) + person_basic + Star(Any(), greedy=False)), action=QuestionSet.has_basic_person_info_question),
        Rule(condition_num=2, condition=movie_entity + Star(Any(), greedy=False) + movie_basic + Star(Any(), greedy=False), action=QuestionSet.has_basic_movie_info_question)
    ]

    我们仔细观察,这些规则其实都是将人问问题的模式都考虑到了,如果你想法奇特,问了一个天马行空的问题,那系统就理解不了这句话,无法生成sparql进行查询,我们举个例子:我们问“周润发演了什么电影”,它就会匹配到上述规则的第一条,因为规则一condition后面跟的规则,首先就是person_entity人物实体,然后随便你再说点什么,它会匹配到Star(Any(), greedy=False),然后你提到电影这两个字,它会匹配到movie,后边你说或者不说话,它会匹配到Star(Any(), greedy=False);那么你可能就问了,凭什么周润发就能匹配到是一个人物实体?是这样,我们前面不是对句子进行了分词和词性标注吗,凡是标注为nr,我就认为这是个人物实体,标注为nz,我就认为是一个电影实体,另外还定义了很多其他比如电影分类、生日、出生地等,有了这些定义好的变量我们就可以进行匹配识别了

    pos_person = "nr"
    pos_movie = "nz"
    pos_number = "m"
    
    person_entity = (W(pos=pos_person))
    movie_entity = (W(pos=pos_movie))
    number_entity = (W(pos=pos_number))
    
    adventure = W("冒险")
    fantasy = W("奇幻")
    animation = (W("动画") | W("动画片"))
    drama = (W("剧情") | W("剧情片"))
    thriller = (W("恐怖") | W("恐怖片"))
    action = (W("动作") | W("动作片"))
    comedy = (W("喜剧") | W("喜剧片"))
    history = (W("历史") | W("历史剧"))
    western = (W("西部") | W("西部片"))
    horror = (W("惊悚") | W("惊悚片"))
    crime = (W("犯罪") | W("犯罪片"))
    documentary = (W("纪录") | W("纪录片"))
    science_fiction = (W("科幻") | W("科幻片"))
    mystery = (W("悬疑") | W("悬疑片"))
    music = (W("音乐") | W("音乐片"))
    romance = (W("爱情") | W("爱情片"))
    family = W("家庭")
    war = (W("战争") | W("战争片"))
    TV = W("电视")
    genre = (adventure | fantasy | animation | drama | thriller | action
             | comedy | history | western | horror | crime | documentary |
             science_fiction | mystery | music | romance | family | war | TV)
    
    actor = (W("演员") | W("艺人") | W("表演者"))
    movie = (W("电影") | W("影片") | W("片子") | W("片") | W("剧"))
    category = (W("类型") | W("种类"))
    several = (W("多少") | W("几部"))
    
    higher = (W("大于") | W("高于"))
    lower = (W("小于") | W("低于"))
    compare = (higher | lower)
    
    birth = (W("生日") | W("出生") + W("日期") | W("出生"))
    birth_place = (W("出生地") | W("出生"))
    english_name = (W("英文名") | W("英文") + W("名字"))
    introduction = (W("介绍") | W("是") + W("谁") | W("简介"))
    person_basic = (birth | birth_place | english_name | introduction)
    
    rating = (W("评分") | W("分") | W("分数"))
    release = (W("上映"))
    movie_basic = (rating | introduction | release)
    
    when = (W("何时") | W("时候"))
    where = (W("哪里") | W("哪儿") | W("何地") | W("何处") | W("在") + W("哪"))

    这样匹配好之后就会调用规则中的 action = QuestionSet.has_movie_question,这个函数来生成sparql

     def has_movie_question(word_objects):
            select = u"?x"
            sparql = None
            for w in word_objects:
                if w.pos == pos_person:
                    e = u"?s :personName '{person}'." \
                        u"?s :hasActedIn ?m." \
                        u"?m :movieTitle ?x".format(person=w.token.decode('utf-8'))
    
                    sparql = SPARQL_SELECT_TEM.format(prefix=SPARQL_PREXIX,
                                                      select=select,
                                                      expression=e)
                    break
            return sparql
    • "query_main",main函数,用户运行程序的入口函数,在启动这个程序之前,需要先启动fuseki服务器,如上所述。

    主函数运行效果如下:

    以上是这个项目的大概思路,其中用到的D2R,从关系数据库中提取rdf,使用Jena进行推理等,我这里并没有涉及,我的另一篇博客中有关于D2R的介绍。

    总结:这种基于规则的问答可解释性比较强,如果某个问题解析错误,我们只要找到对应的匹配规则进行调试即可;相对于深度学习的端到端黑盒模型,如果有的地方问答出现谬误,我们并不能准确给出其原因,也并不能立即找到合适的解决方案;这种问答模型比较适合固定的业务领域,适合问题数量和问题模式可数可罗列的情况,我们可以将规则做的很细致,将其鲁棒性调试到最优,让其有很强的泛化能力;但是,如果用于开放领域的问答,那么问题的数量将是不可数的,我们没办法做出足够多的规则去匹配,这就需要借助一些机器学习和深度学习的方法;在没有数据或者数据极少的情况下,我们可以利用正则规则马上上线一个初级的问答系统。在现实情况中,由于上述优点,工业界也比较青睐用正则来做语义解析。基于规则的缺陷也是显而易见的,它并不能理解语义信息,而是基于符号的匹配。换个角度说,用规则的方法,就需要规则的设计者能够尽可能考虑到所有情况,然而这是不可能的。暂且不考虑同义词、句子结构等问题,光是罗列所有可能的问题就需要花费很大的功夫。尽管如此,在某些垂直领域,比如“音乐”,“电影”,由于问题集合的规模在一定程度上是可控的,基于规则的问答系统还是有很大的用武之地的。

    展开全文
  • 中文简介:通过知识图谱的Swift发展,面向知识图谱的中文领域问答系统已成为当前最新最热的研究方向之一,对于提高专业领域服务智能化程度具有较高的意义和价值。中文口语语义表达形式,不符合语法规范以及电商领域...
  • Python+Neo4j医药知识图谱自动问答系统源码,知识图谱构建,自动问答,基于kg的自动问答。以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。
  • 基于知识图谱问答系统,BERT做命名实体识别和句子相似度 介绍 本项目主要由两个重要的点组成,一是基于BERT的命名实体识别,二是基于BERT的句子相似度计算,本项目将这两个模块进行融合,构建基于BERT的KBQA问答...
  • 复旦大学博士论文,系统而全面地介绍了基于知识图谱的智能问答相关关键技术
  • Question Answering over Knowledge Bases-基于知识图谱问答系统综述
  • 知识图谱问答系统.zip

    2021-03-10 08:50:33
    中文简介:随着知识图谱的迅速发展,面向知识图谱的中文领域问答系统已成为目前最新最热的研究方向之一,对于提高专业领域服务智能化程度具有较高的意义和价值。本系统针对中文口语语义表达多样化、不符合语法规范...
  • 以“晴天”为例,本系统适当能够回答晴天的歌词是什么,晴天是哪首专辑的歌曲,该专辑是哪一年发行的,该专辑对应的歌手是谁,该歌手的的基本信息是什么。关于项目的更多细节在知乎中有更详细的介绍,知乎网址: : ...
  • 运行完成后,打开浏览器,就可以看到数据集 然后运行问答系统 运行效果 该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4...

    1、项目背景

    中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。
    项目地址:https://github.com/liuhuanyong/QASystemOnMedicalKG
    本人为小白,然后一步步完成的。
    知识图谱构建,自动问答,基于kg的自动问答。以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。
    关于知识图谱概念性的介绍就不在此赘述。目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,11类规模约30万实体关系的知识图谱。 本项目将包括以下两部分的内容:

    1.基于垂直网站数据的医药知识图谱构建
    2.基于医药知识图谱的自动问答

    项目环境

    windows环境
    本人是在Windows环境下的虚拟机运行的,下面只介绍一下本人的踩坑之路。当然,也可以直接在自己电脑下运行。
    Windows10镜像+Vmware15.5
    链接:https://pan.baidu.com/s/1rSZZ8OAjs-LybO098p5dGw 提取码:y663
    Pycharm2020安装包
    链接:https://pan.baidu.com/s/1eA9ga_h4kCnrO6TF7qBs1Q 提取码:i4e5
    neo4j-community-4.1.1社区版
    链接:https://pan.baidu.com/s/1Tb65vaw3Pj1YxTHhIycWjg 提取码:t317
    jdk-8u241-windows
    链接:https://pan.baidu.com/s/1VKZTax2zgZStexWbAXOEsg 提取码:exlk
    windows下安装jdk以及环境变量配置

    neo4j的环境变量配置
    配置环境变量
    在这里插入图片描述
    下图中增加的NEO4J-HOME变量地址根据自己电脑的存储位置编辑。
    在这里插入图片描述

    在这里插入图片描述
    最主要的就是环境配置(这个点让我很难受,若是大家也有类似情况,先静静,继续搞)
    环境配置好以后,打开win+R,输入cmd。
    然后输入neo4j.bat console
    在这里插入图片描述
    出现这样的界面,则表示安装完成。
    然后复制界面上的网址http://localhost:7474/
    浏览器打开,出现以下界面,首次登录,会提示你修改密码。默认账号和密码都是neo4j
    在此期间,这个页面要保持打开.
    然后打开安装好的Pycharm,直接将刘焕勇老师在github上的开源项目导入。
    数据导入:运行源码中的 python build_medicalgraph.py,导入的数据较多,估计需要几个小时。(此时可能运行不成功,是因为缺少py2eo库,可以直接在pycharm中安装,如下图所示)在这里插入图片描述
    在这里插入图片描述
    输入命令pip install py2neo 安装py2neo库。
    安装成功后,查看是否安装
    在这里插入图片描述

    然后还有代码中要添加,在这里插入图片描述

    还有在电脑自己下载的neo4j文件中的conf文件夹中,在文件最后添加dbms.security.auth_enabled=false

    在这里插入图片描述
    在这里插入图片描述
    之后再次运行代码,第一次时间可能比较久,好几个小时,等待中。
    运行完成后,打开浏览器,就可以看到数据集
    在这里插入图片描述
    然后运行问答系统
    运行效果
    在这里插入图片描述

    该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4万,实体关系规模30万。schema的设计根据所采集的结构化数据生成,对网页的结构化数据进行xpath解析。

    项目的数据存储采用Neo4j图数据库,问答系统采用了规则匹配方式完成,数据操作采用neo4j声明的cypher。

    项目的不足之处在于疾病的引发原因、预防等以大段文字返回,这块可引入事件抽取,可将原因结构化表示出来。
    面对已知的问题,可以给出合适的答案,对于模板匹配不到的问题或问句类型,经常遇到的有三种回答方式:

    1、给出一个无厘头的答案;

    2、婉转的回答不知道,提示用户换种方式去问;

    3、转移话题,回避问题。

    展开全文
  • 医疗知识图谱问答系统探究(一)

    万次阅读 多人点赞 2019-03-15 21:26:39
    这是阿拉灯神丁Vicky的...果然,功夫不负有心人,找到了中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。 项目地址:https://github.com/liuhuanyong/...

    这是 阿拉灯神丁Vicky 的第 23 篇文章

    1、项目背景

    为通过项目实战增加对知识图谱的认识,几乎找了所有网上的开源项目及视频实战教程。

    果然,功夫不负有心人,找到了中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。

    项目地址:https://github.com/liuhuanyong/QASystemOnMedicalKG

    用了两个晚上搭建了两套,Mac版与Windows版,哈哈,运行成功!!!

    从无到有搭建一个以疾病为中心的一定规模医药领域知识图谱,以该知识图谱完成自动问答与分析服务。该项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,11类规模约30万实体关系的知识图谱。 本项目将包括以下两部分的内容:

    1、基于垂直网站数据的医药知识图谱构建

    2、基于医药知识图谱的自动问答

    2、项目环境

    2.1 windows系统

    搭建中间有很多坑,且行且注意。

    配置要求要求配置neo4j数据库及相应的python依赖包。neo4j数据库用户名密码记住,并修改相应文件。

    安装neo4j,neo4j 依赖java jdk 1.8版本以上:

    java jdk安装方法可参考:windows系统下安装JDK8,下载地址:https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-windows-x64.exe

    安装neo4j可参考博文:windows安装neo4j,下载地址:https://go.neo4j.com/download-thanks.html?edition=community&release=3.4.1&flavour=winzip

    安装python可参考:Windows环境下安装python2.7

    根据neo4j 安装时的端口、账户、密码配置设置设置项目配置文件:answer_search.py &  build_medicalgraph.py (github下载项目时根据个人需要也可使用git)

    数据导入python build_medicalgraph.py,导入的数据较多,估计需要几个小时。

    python build_medicalgraph.py导入数据之前,需要在该文件main函数中加入:

     

     build_medicalgraph.py

    启动问答python chat_graph.py

    2.2 Mac系统

    mac本身自带python、java jdk环境,可直接安装neo4j图数据库,项目运行步骤与windows基本一样。

     

    2.3 Neo4j数据库展示

    2.4 问答系统运行效果

    3、项目介绍

    该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4万,实体关系规模30万。schema的设计根据所采集的结构化数据生成,对网页的结构化数据进行xpath解析。

    项目的数据存储采用Neo4j图数据库,问答系统采用了规则匹配方式完成,数据操作采用neo4j声明的cypher。

    项目的不足之处在于疾病的引发原因、预防等以大段文字返回,这块可引入事件抽取,可将原因结构化表示出来。

    3.1 项目目录

    .
    ├── README.md
    ├── __pycache__      \\编译结果保存目录
    │   ├── answer_search.cpython-36.pyc
    │   ├── question_classifier.cpython-36.pyc
    │   └── question_parser.cpython-36.pyc
    ├── answer_search.py
    ├── answer_search.pyc
    ├── build_medicalgraph.py    \\知识图谱数据入库脚本
    ├── chatbot_graph.py    \\问答程序脚本
    ├── data
    │   └── medicaln.json \\本项目的全部数据,通过build_medicalgraph.py导neo4j
    ├── dict
    │   ├── check.txt    \\诊断检查项目实体库
    │   ├── deny.txt      \\否定词库
    │   ├── department.txt  \\医疗科目实体库
    │   ├── disease.txt    \\疾病实体库
    │   ├── drug.txt      \\药品实体库
    │   ├── food.txt      \\食物实体库
    │   ├── producer.txt    \\在售药品库
    │   └── symptom.txt    \\疾病症状实体库
    ├── document
    │   ├── chat1.png    \\系统运行问答截图01
    │   ├── chat2.png      \\系统运行问答截图01
    │   ├── kg_route.png    \\知识图谱构建框架
    │   ├── qa_route.png    \\问答系统框架图
    ├── img    \\README.md中的所用图片
    │   ├── chat1.png
    │   ├── chat2.png
    │   ├── graph_summary.png
    │   ├── kg_route.png
    │   └── qa_route.png
    ├── prepare_data
    │   ├── build_data.py    \\数据库操作脚本
    │   ├── data_spider.py    \\网络资讯采集脚本
    │   └── max_cut.py      \\基于词典的最大向前/向后脚本
    ├── question_classifier.py    \\问句类型分类脚本
    ├── question_classifier.pyc    
    ├── question_parser.py    \\问句解析脚本
    ├── question_parser.pyc

    3.2 知识图谱的实体类型

    3.3 知识图谱的实体关系类型

    3.4 知识图谱的属性类型

    3.5 问答项目实现原理

    本项目的问答系统完全基于规则匹配实现,通过关键词匹配,对问句进行分类,医疗问题本身属于封闭域类场景,对领域问题进行穷举并分类,然后使用cypher的match去匹配查找neo4j,根据返回数据组装问句回答,最后返回结果。

    问句中的关键词匹配:

    根据匹配到的关键词分类问句

    问句解析

    查找相关数据

    根据返回的数据组装回答

    3.6 问答系统支持的问答类型

    4、项目总结

    基于规则的问答系统没有复杂的算法,一般采用模板匹配的方式寻找匹配度最高的答案,回答结果依赖于问句类型、模板语料库的覆盖全面性,面对已知的问题,可以给出合适的答案,对于模板匹配不到的问题或问句类型,经常遇到的有三种回答方式:

    1、给出一个无厘头的答案;

    2、婉转的回答不知道,提示用户换种方式去问;

    3、转移话题,回避问题;

    例如,本项目中采用了婉转的方式回答不知道:

    基于知识图谱的问答系统的主要特征是知识图谱,系统依赖一个或多个领域的实体,并基于图谱进行推理或演绎,深度回答用户的问题,基于知识图谱的问答系统更擅长回答知识性问题,与基于模板的聊天机器人有所不同的是它更直接、直观的给用户答案。对于不能回答、或不知道的问题,一般直接返回失败,而不是转移话题避免尴尬。

    整个问答系统的优劣依赖于知识图谱中知识的数量与质量。也算是利弊共存吧!知识图谱图谱具有良好的可扩展性,扩展了知识图谱也就是扩展了问答系统的知识库。如果问句在射程范围内,可轻松回答,但如果不幸脱靶,则体验大打折扣。

    从知识图谱的角度分析,大多数知识图谱规模不足,主要原因还是数据来源以及技术上知识的抽取与推理困难。

    个人博客:www.bobinsun.cn

    题图

    展开全文
  • 构建图谱所需的数据从OpenKg中文开放知识图谱获取 图谱中涉及到的知识有医生,救护人员以及他们的信息,履历,事迹。虽然样本量不大,但是也能学习很多的相关知识。 新冠开放知识图谱.英雄 . JSON文件中存储了所...

    该项目是我的一次课程设计,开发的语言是python。从网上学习了各种相关知识后写出的一个KBQA系统,希望这个系统的搭建过程也能给读者一些有用的经验。

    一,数据获取

    知识图谱的数据一般是非结构性的,获得的渠道有多种,如利用爬虫工具爬取相关的文本等等。

    这里,我们构建图谱所需的疫情数据从OpenKg中文开放知识图谱获取

    图谱中涉及到的知识有医生,救护人员以及他们的信息,履历,事迹。虽然样本量不大,但是对于数据所需的处理也比较繁琐。

    新冠开放知识图谱.英雄 .

    相关图片
    JSON文件中存储了所需要的数据,这些数据是结构化的
    在这里插入图片描述

    数据说明

    通过下载得来的schema文件可以发现,JSON文件中的数据包括22个类别,和48个属性节点。
    概念:21个
    实例:747个
    数值属性:291个
    对象属性:1160个
    类别Class: people,school,institutions,battle,countries,field…

    属性Property: nativePlace,gender,deathTime,birthDate,national…

    二,关系抽取

    要获得构建制图图谱系统所需的三元组数据,需要对以获取的数据,进行节点和关系边的提取。在这里,主要建立类别与属性之间的关系边。

    提取节点和属性用的代码,由于这部分代码的重复性片段较多,因此展示了具有代表性操作的代码片段:

            with open(filename, encoding='utf-8') as f:
                #用于存储节点的列表的定义
                characterjson = json.load(f)
                characterlist=[]
                articlelist=[]
                institutionlist=[]
                teamlist=[]
            for data in characterjson['@graph']:
                #team_dict   救援队类节点的提取 
                if (data['@type'] == "http://www.openkg.cn/COVID-19/character/class/C548"):
                    team.append(data['label']['@value'])
                    team_dict = {}
                    team_dict['team'] = data['label']['@value']
                    teamlist.append(team_dict)
    
                    if 'P45' in data:
                        team_dict['supportSite'] = data['P45']
    
                    if 'P49' in data:
                        team_dict['departureDate'] = data['P49']
                        departureDate.append([data['label']['@value'], data['P49']])
    
    
                #institution dict   救助机构类节点的提取
                if (data['@type'] == "http://www.openkg.cn/COVID-19/character/class/C3"):
                    institutions.append(data['label']['@value'])
                    institution_dict = {}
                    institution_dict['institution'] = data['label']['@value']
                    institutionlist.append(institution_dict)
                    if 'P24' in data:
                        institution_dict['cities'] = data['P24']
    
                    if 'P25' in data:
                        institution_dict['To_enact'] = data['P25']
                    if 'P26' in data:
                        institution_dict['publish'] = data['P26']
    
            #相关关系边的提取
            for data in characterjson['@graph']:
                if (data['@type'] == "http://www.openkg.cn/COVID-19/character/class/C1"):
                    for i in characterlist:
                       if 'colleagues' in i:
                         if type(i['colleagues']) is list:
                           for j in range(len(i['colleagues'])):
                             if(data['@id']==i['colleagues'][j]):
    
                                i['colleagues'][j]=data['label']['@value']
                                colleagues.append([i['people'],data['label']['@value']])
    
                                break
                         else :
                             if (data['@id'] == i['colleagues']):
    
                                 i['colleagues'] = data['label']['@value']
                                 colleagues.append([i['people'], data['label']['@value']])
    
                                 break
    

    将所有的节点和关系边提取到列表后,可以用set()函数来去除重复的节点后将其存储起来。

    三,数据库连接与使用

    Neo4j 数据库

    Neo4j数据库是存储图数据最常用的数据库之一,他的优点很明显。
    1.与Python交互方便
    2.容易上手,应用方便。
    3.数据存储容量大,可输出结构化数据文件。
    在这里插入图片描述

    通过py2neo来链接与操作数据库

    from py2neo import Graph,Node
    class CharacterGraph:
        def __init__(self):
            self.data_path = './data/character-covid-19-v0.2.json'
            self.g = Graph(
                host="127.0.0.1",
                http_port=7474,
                user="neo4j",
                password="123456")
        def create_node(self, label, nodes):
            for node_name in nodes:
                node = Node(label, name=node_name)
                self.g.create(node)
            return
        def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
            set_edges = []
            for edge in edges:
                set_edges.append('###'.join(edge))
            for edge in set(set_edges):
                edge = edge.split('###')
                p = edge[0]
                q = edge[1]
                query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name)
                try:
                    self.g.run(query)
                except Exception as e:
                    print(e)
            return
    

    Neo4j生成相应的节点和关系边

    在这里插入图片描述

    至此,我们已经完成了对数据的处理与存储了,对于搭建一个KBQA系统来说,工作已经完成了一半了,在下一篇文章,我将会展示问答系统的搭建流程。

    展开全文
  • 从无到有搭建一个医疗领域知识图谱(知识图谱规模较小),并基于此知识图谱搭建问答系统实现自动问题解析和回答。
  • 基于知识图谱问答系统,BERT做命名实体识别和句子相似度,分为online和outline模式
  • 电影知识图谱问答系统项目总结-附件资源
  • 注:KBQA即是我们通常所说的基于知识图谱问答系统。这里简单构建的EasyKBQA,数据来源于网络,源码地址看下面补充说明。   流程原理: 该问答系统可以解析输入的自然语言问句,主要运用REFO库的"对象正则...
  • 基于知识图谱的自动问答系统,有代码,和说明文档,大家可以看看.很很好的知识图谱的入门案例代码
  • 基于neo4j的简易医疗问答知识图谱,数据从ask120中爬取得到
  • 基于知识图谱的《红楼梦》人物关系可视化及问答系统
  • 复旦大学知识图谱培训ppt10:面向知识图谱问答系统(Question Answering over Knowledge Bases)
  • 基于医疗知识图谱问答系统源码详解

    万次阅读 多人点赞 2019-05-06 16:19:55
    项目还是找的中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。 该项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类...
  • 一个简单的基于知识图谱问答系统 数据集:数据集为2019年语言智能大赛的关系撤除数据集 实体识别模型:利用Transformer模型进行实体识别(以后会变更为bert) 事实识别:自己构造了几十条数据,利用逻辑回归进行...
  • 基于知识图谱的医疗领域问答系统【QASystemOnMedicalKG】 1 代码来源 本代码来源于github项目地址,主要是构建以疾病为中心的具有一定规模的医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。其中知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,723
精华内容 2,689
关键字:

知识图谱问答系统