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

    2018-03-27 20:39:26
    肖仰华-大规模概念图谱构建与...腾讯-大规模知识图谱构建与应用-苏州大学 KG Refinement by Knowledge Intensive Crowdsourcing 面向智能问答的知识获取 陈虹-知识图谱及其变种在行业实践中的应用与思考-ZTE中兴
  • 细致介绍了一种基于知识图谱问答系统构建了一个推理模型,在建模问题回答过程中是十分有效的。
  • 基于知识图谱问答系统 -- SpringBoot整合Neo4j开发问答系统 PS:资源的下载积分会随下载次数自动增加越来越多,如果您积分不够的话可以私信我重置下载分数
  • 该项目基于医疗信息,利用neo4j构建知识图谱,最后根据刘焕勇老师的开源项目(https://github.com/liuhuanyong/QASystemOnMedicalKG)搭建问答系统
  • 毕设项目——用知识图谱搭建自动问答系统语料库 #### 涉及技术: 1. 基于 `requests` 和 `bs4` 的爬虫 2. 基于 `jieba` 的自然语言处理 3. `Neo4j` 图数据库
  • Python+Neo4j医药知识图谱自动问答系统源码,知识图谱构建,自动问答,基于kg的自动问答。以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。
  • 知识图谱构建java源码NOUS:动态知识图中的构建、查询和推理 知识图谱 (KG) 的自动构建仍然是一项昂贵的技术挑战,大多数企业和学术机构都无法实现。 NOUS 是一个端到端框架,用于为任意应用程序域开发自定义知识...
  • 对于输入的自然语言问句,问答系统分别进行实体属性识别、意图分类、图谱查询、相似度计算、答案筛选和结果返回六个部分,下面就每个部分的功能和逻辑进行说明,具体代码部分请参考主程序。 实体属性识别 NER识别...

    (八)问答流程

    对于输入的自然语言问句,问答系统分别进行实体属性识别、意图分类、图谱查询、相似度计算、答案筛选和结果返回六个部分,下面就每个部分的功能和逻辑进行说明,具体代码部分请参考主程序。

    • 实体属性识别

      NER识别问题中的实体、属性,返回SENT、PROP和OENT,先对SENT、OENT进行实体映射(如果字典中存在,就映射,否则,不做映射),再将其结果送给图谱查询。

    • 意图分类

      使用已训练模型对问答意图进行分类,将问题分类为SP->O、SPP->O、PO->S、OP->S、SO->P中的一种(做分类模型是为了降低相似度计算次数,提高效率)。

    • 图谱查询

      图谱查询分为直接查询和间接查询。

      • 直接查询

        对于输入信息较为完整的问句,直接图谱搜索获取问答结果。

        例:杭州的人口是多少?,图谱直接查询:杭州:人口,获取查询结果。

      • 间接查询

        对于输入信息不完全,图谱直接查询无结果的问题,需要根据问题意图进行相应间接查询。

        • SP->O

          查询与S相关的属性及属性值,查询S的歧义关系的实体属性属性值,并按照歧义权重进行排序。

        • OP->S、PO->S

          查询属性指向S的关系,获取属性值为S的实体、属性。

        • SO->P

          查询S和O五步关系内的关系路径,返回路径结果,并对路径进行处理,得到标准路径。

    • 相似度计算

      对于直接查询无结果的问答,通过间接查询,获取对应实体、属性,去除问题中的停用词、实体的指称,进行相似度计算,选取相似度最高的路径作为答案路径,返回对应的答案。

      • SP->O

        进行相似度批量计算(去除停用词的问题,歧义列表实体+属性),选取相似度最高的实体属性,返回对应的答案,对于相似度一样的,返回权重最大的结果,如果权重一样相似度一样,返回两条结果,逗号分开。

      • SPP->O

        先进行SP->O查询,将查询结果O1作为实体,再查询O1的相关属性,执行O1P->O,进行相似度匹配,获取相似度最高的结果。

      • OP->S、PO->S

        相似度计算批量(问题,属性+实体),选取相似度最高的属性+实体,返回对应的实体S。

    • 答案筛选

      根据相似度值,返回相似度最高的路径答案作为最后的答案。

    • 结果返回

    ​ 结果返回四部分:程序答案,查询路径,路径得分(相似度值),查询耗时。

    展开全文
  • 基于知识图谱问答系统,BERT做命名实体识别和句子相似度 介绍 本项目主要由两个重要的点组成,一是基于BERT的命名实体识别,二是基于BERT的句子相似度计算,本项目将这两个模块进行融合,构建基于BERT的KBQA问答...
  • 由于本实验室目前正在使用知识图谱搭建问答系统,故而这里将使用知识图谱的方式构建该智能问答系统。这里将构建一个关于歌曲信息的问答系统。以“晴天”为例,本系统应当能够回答晴天的歌词是什么,晴天是哪首专辑的...

    点击上方,选择星标置顶,不定期资源大放送

    阅读大概需要15分钟

    Follow小博主,每天更新前沿干货

    作者:张墨一

    知乎链接:https://zhuanlan.zhihu.com/p/58248608

    本文仅作学术分享,若侵权,请联系后台删文处理

    1 任务背景:

    本次实验拟设计一个智能问答系统,并应当保证该智能问答系统可以回答5个及其以上的问题。由于本实验室目前正在使用知识图谱搭建问答系统,故而这里将使用知识图谱的方式构建该智能问答系统。这里将构建一个关于歌曲信息的问答系统。以“晴天”为例,本系统应当能够回答晴天的歌词是什么,晴天是哪首专辑的歌曲,该专辑是哪一年发行的,该专辑对应的歌手是谁,该歌手的的基本信息是什么。

    本系统的环境配置过程以及全部代码均已上传Github。下面的文章主要介绍的是系统总体结构以及部分代码解析。

    • Github地址:https://github.com/zhangtao-seu/Jay_KG

    2 系统总体工作流程图

    在搭建系统之前,第一步的任务是准备数据。这里的准备的数据包括周杰伦的姓名,个人简介,出生日期,以及发行的所有专辑名字,《叶惠美》专辑的名字,简介以及发行日期,《以父之名》、《晴天》的歌曲名和歌词。

    准备好数据之后,将数据整理成RDF文档的格式。这里采用手工的方式在protégé中构建本体以及知识图谱。本体作为模式层,这里声明了三个类,包括歌手类、专辑类和歌曲类;声明了四种关系,也叫objectProperty,包括include,include_by,release和release_by。其中include和include_by声明为inverseOf关系,表示专辑和歌曲之间的包含和被包含的关系。Release和release_by声明为inverseOf关系表示歌手和专辑之间的发行和被发行的关系;声明了8种数据属性,也叫DataProperty,分别为singer_name,singer_birthday,singer_introduction,album_name,album_introduction,album_release_date,song_name和song_content。将上述准备好的数据以individual和dataProperty的形式写进知识图谱。至此,就准备好了我们的RDF/OWL文件了。

    接着,为了使用RDF查询语言SPARQL做后续的查询操作,这里使用Apache Jena的TDB和Fuseki组件。TDB是Jena用于存储RDF的组件,是属于存储层面的技术。Fuseki是Jena提供的SPARQL服务器,也就是SPARQL endpoint。这一步中,首先利用Jena将RDF文件转换为tdb数据。接着对fuseki进行配置并打开SPARQL服务器,就可以通过查询语句完成对知识图谱的查询。

    最后,将自然语言问题转换成SPARQL查询语句。首先使用结巴分词将自然语言问题进行分词以及词性标注。这里将专辑名字和歌曲名字作为外部词典以保证正确的分词和词性标注。以“叶惠美”为例,结巴分词将“叶惠美”标注为nr,即人名,这里“叶惠美”作为专辑名字应该标注为nz,即专有名词。对于不同类型的问题,我们将问题匹配给不同的查询语句生成函数从而得到正确的查询语句。将查询语句作为请求参数和Fuseki服务器通信就能得到相应的问题结果。上述工作流程图如图2-1所示。

    图2-1 系统工作流程图

    3 系统实现

    3.1 系统实现工具和环境

    使用protégé构建知识库的本体和知识图谱。首先是定义模式层,包括class,objectProperty和dataProperty。以歌曲类为例,其RDF代码为:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲 -->
    <owl:Class rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲">
     <rdfs:subClassOf>
     <owl:Restriction>
     <owl:onProperty rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#song_content"/>
     <owl:allValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
     </owl:Restriction>
     </rdfs:subClassOf>
     <rdfs:subClassOf>
     <owl:Restriction>
     <owl:onProperty rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#song_name"/>
     <owl:allValuesFrom rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
     </owl:Restriction>
     </rdfs:subClassOf>
    </owl:Class>

    可以看出class “歌曲”包含了song_name和song_content两个dataProperty。以include的关系为例,其RDF代码如下:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include -->
    <owl:ObjectProperty rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include">
    <owl:inverseOf rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#include_by"/>
    <rdfs:domain rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#专辑"/>
    <rdfs:range rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌曲"/>
    </owl:ObjectProperty>

    可以看出该关系和include_by是inverseOf的关系,其关系主语是专辑,宾语是歌曲。以singer_introduction的dataProperty为例,其RDF代码如下:

    <!-- http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#singer_introduction -->
    <owl:DatatypeProperty rdf:about="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#singer_introduction">
    <rdfs:domain rdf:resource="http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#歌手"/>
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
    </owl:DatatypeProperty>

    可以看出其主语是歌手类,其宾语是字符串。

    接着是数据层。图3-1和图3-2是系统的知识图谱可视化的结果。可以看出,“七里香”是一个专辑,“东风破”是一首歌曲。

    图3-1专辑知识图谱可视化

    图3-2 歌曲知识图谱可视化

    使用Feseki启动SPARQL服务器,可以在localhost:3030中实现数据的查询。以查询“以父之名”的专辑为例,图3-3展示其查询代码和查询结果,可以看出如下语句可以得到查询结果“叶惠美”。

    图3-3 Feseki平台的查询情况

    3.2 自然语言处理核心代码分析

    使用结巴分词将自然语言句子实现分词和词性标注。其核心代码如下:

    import jieba
    import jieba.posseg as pseg
    class Word(object):
    def __init__(self, token, pos):
     self.token = token
     self.pos = pos
    class Tagger:
    def __init__(self, dict_paths):
     # TODO 加载外部词典
     for p in dict_paths:
     jieba.load_userdict(p)
    @staticmethod
    def get_word_objects(sentence):
     # 把自然语言转为Word对象
     return [Word(word.encode('utf-8'), tag) for word, tag in pseg.cut(sentence)]

    这段代码可以将句子作为一个输入,输出句子的分子和词性,以“叶惠美是什么发布的?”为例,可以得到以下结果:

    图3-4 结巴分词示意图

    将句子作为参数传递给Rule对象,根据关键字匹配相一致的查询语句的生成函数,Rule对象和关键字匹配的代码如下:

    from refo import finditer, Predicate, Star, Any, Disjunction
    import re
     
    class W(Predicate):
     def __init__(self, token=".*", pos=".*"):
     self.token = re.compile(token + "$")
     self.pos = re.compile(pos + "$")
     super(W, self).__init__(self.match)
     
     def match(self, word):
     m1 = self.token.match(word.token.decode("utf-8"))
     m2 = self.pos.match(word.pos)
     return m1 and m2
     
    class Rule(object):
     def __init__(self, condition_num, condition=None, action=None):
     assert condition and action
     self.condition = condition
     self.action = action
     self.condition_num = condition_num
     
     def apply(self, sentence):
     matches = []
     for m in finditer(self.condition, sentence):
     i, j = m.span()
     matches.extend(sentence[i:j])
     return self.action(matches), self.condition_num
    # TODO 定义关键词
    pos_person = "nr"
    pos_song = "nz"
    pos_album = "nz"
    person_entity = (W(pos=pos_person))
    song_entity = (W(pos=pos_song))
    album_entity = (W(pos=pos_album))
    singer = (W("歌手") | W("歌唱家") | W("艺术家") | W("艺人") | W("歌星"))
    album = (W("专辑") | W("合辑") | W("唱片"))
    song = (W("歌") | W("歌曲"))
    birth = (W("生日") | W("出生") + W("日期") | W("出生"))
    english_name = (W("英文名") | W("英文") + W("名字"))
    introduction = (W("介绍") | W("是") + W("谁") | W("简介"))
    song_content = (W("歌词") | W("歌") | W("内容"))
    release = (W("发行") | W("发布") | W("发表") | W("出"))
    when = (W("何时") | W("时候"))
    where = (W("哪里") | W("哪儿") | W("何地") | W("何处") | W("在") + W("哪"))
     
    # TODO 问题模板/匹配规则
    """
    1.周杰伦的专辑都有什么?
    2.晴天的歌词是什么?
    3.周杰伦的生日是哪天?
    4.以父之名是哪个专辑里的歌曲?
    5.叶惠美是哪一年发行的?
    """
    rules = [
     Rule(condition_num=2, condition=person_entity + Star(Any(), greedy=False) + album + Star(Any(), greedy=False), action=QuestionSet.has_album),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + song_content + Star(Any(), greedy=False),
     action=QuestionSet.has_content),
     Rule(condition_num=2, condition=person_entity + Star(Any(), greedy=False) + introduction + Star(Any(), greedy=False),
     action=QuestionSet.person_inroduction),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + album + Star(Any(), greedy=False),
     action=QuestionSet.stay_album),
     Rule(condition_num=2, condition=song_entity + Star(Any(), greedy=False) + release + Star(Any(), greedy=False),
     action=QuestionSet.release_album),
    ]

    匹配成功后,通过action动作出发相对应的函数能够生成相对应的查询语句。以查询“以父之名是哪个专辑的歌曲?”为例,其生成查询语句的代码如下:

    # TODO SPARQL前缀和模板
    SPARQL_PREXIX = u"""
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
    PREFIX : <http://www.semanticweb.org/张涛/ontologies/2019/1/untitled-ontology-32#>
    """
    SPARQL_SELECT_TEM = u"{prefix}\n" + \
     u"SELECT {select} WHERE {{\n" + \
     u"{expression}\n" + \
     u"}}\n"
    class QuestionSet:
    @staticmethod
     def stay_album(word_object):
     # 以父之名是哪个专辑的歌曲
     select = u"?x"
     sparql = None
     
     for w in word_object:
     if w.pos == pos_song:
     e = u" :{song} :include_by ?o."\
     u" ?o :album_name ?x.".format(song=w.token.decode('utf-8'))
     sparql = SPARQL_SELECT_TEM.format(prefix=SPARQL_PREXIX,
      select=select,
     expression=e)
     break
     return sparql
    最后,将得到的查询语句作为请求参数和SPARQL服务器进行通信并对得到的结果进行解析就能得到我们想要的答案,其核心代码如下:
    from SPARQLWrapper import SPARQLWrapper, JSON
    from collections import OrderedDict
     
     
    class JenaFuseki:
     def __init__(self, endpoint_url='http://localhost:3030/jay_kbqa/sparql'):
     self.sparql_conn = SPARQLWrapper(endpoint_url)
     
     def get_sparql_result(self, query):
     self.sparql_conn.setQuery(query)
     self.sparql_conn.setReturnFormat(JSON)
     return self.sparql_conn.query().convert()
     
     @staticmethod
     def parse_result(query_result):
     """
     解析返回的结果
     :param query_result:
     :return:
     """
     try:
     query_head = query_result['head']['vars']
     query_results = list()
     for r in query_result['results']['bindings']:
     temp_dict = OrderedDict()
     for h in query_head:
      temp_dict[h] = r[h]['value']
     query_results.append(temp_dict)
     return query_head, query_results
     except KeyError:
     return None, query_result['boolean']

    以上就是将自然语言转换成SPARQL查询语言并与Feseki进行通信的核心代码。

    3.3 代码运行结果

    这里分别从歌手的简介,专辑的发行时间,歌手的所有专辑,歌曲属于哪个专辑以及歌曲的歌词等5类问题做问答,均能达到良好的表现效果。其问答情况如图3-5所示。

    图3-5 问答系统运行结果实例

    最后:

    代码部分参考了:https://zhuanlan.zhihu.com/knowledgegraph

    配置部分参考了:https://blog.csdn.net/keyue123/article/details/85266355

    重磅!自然语言处理技术交流群已成立!

    欢迎各位NLPer加入自然语言处理技术交流群,目前群内已有上百人!本群旨在交流文本分类、知识图谱、语音识别、阅读理解、机器翻译、情感分析、信息检索、问答系统自然语言处理领域内容。自然语言处理领域前沿信息将会第一时间在群里发布!欢迎大家进群一起交流学习!

    麻烦大家进群后请备注:研究方向+学校/公司+昵称(如文本分类+浙大+小民)

    广告商、博主请绕道!

    ???? 长按识别添加,邀请您入群!

    展开全文
  • (二)构建知识图谱 知识图谱构建使用neo4j作为图谱数据库,因数据量庞大(4572万个实体,1.41亿条关系),需使用neo4j-admin import工具导入,导入前需准备节点和关系的文件。 节点数据格式 neo4j节点数据使用以下...

    (三)构建知识图谱

    知识图谱构建使用neo4j作为图谱数据库,因数据量庞大(4572万个实体,1.41亿条关系),需使用neo4j-admin import工具导入,导入前需准备节点和关系的文件。

    • 节点数据格式

      neo4j节点数据使用以下数据格式,本文统一给实体增加Entity标签,便于检索。

      id:IDname:LABEL
      1姚明Entity
      2姚沁蕾Entity
      3中国Entity

      说明:此处id应唯一,一一对应相关实体.

    • 关系数据格式

      neo4j关系数据使用以下数据格式,:START_ID表示起始实体的id,:END_ID表示终止的实体id,本文统一增加Relation关系类型,便于检索。

      :START_ID:END_ID:TYPEname
      12Relation女儿
      13Relation国籍
      1Relation身高

      说明:id对应关系为 (:START_ID)-[r]->(:END_ID)

    • 数据抽取

      数据抽取部分包括三元组抽取,属性映射,城市映射和带有单位的属性值标准化等部分。话不多说,先上代码,再谈本文所遇到的问题。

      spo_extract代码如下:

      import os
      import csv
      import re
      import build_prop_dict
      
      dir_path = os.getcwd()
      
      attr_map = build_prop_dict.load_attr_map(dir_path + '/data/prop_mapping.txt')
      city_map = build_prop_dict.load_city_map(dir_path + '/data/city_mapping.txt')
      zz_map = build_prop_dict.load_attr_map(dir_path + '/data/zhengze_mapping.txt')
      
      spo_file = open('/mnt/zjb/data/allTypeCsv.csv', 'w', encoding='utf-8')
      alltypeCsv = csv.writer(spo_file)
      
      entity_file = open('/mnt/zjb/data/entity.csv','w', encoding='utf-8')
      spo_file = open('/mnt/zjb/data/relation.csv', 'w', encoding='utf-8')
      
      ent_csv = csv.writer(entity_file)
      ent_csv.writerow(("id:ID", "name", ":LABEL"))
      spo_csv = csv.writer(spo_file)
      spo_csv.writerow((":START_ID", ":END_ID", ":TYPE", "name"))
      
      def remove_stopwords(s):
          ans = (re.sub(r'[;::;、,,.。%【】、`?*①②③④◇●◆/(& --·)\\()“”〗""》〖《 \s\d]',
                        '', s)).replace('\u200b', '').replace("[", '').replace("]", '')
          return ans
      
      entity_dict = dict()
      idx = 0
      index = 0
      rela_dict = dict()
      with open('/mnt/zjb/data/ownthink_v2.csv', 'r', encoding='utf-8') as ownfile:
          reader = csv.reader((line.replace('\0', '') for line in ownfile))
          next(reader)
          entity_list = []
          for row in reader:
              if len(row) == 3:
                  row[1] = remove_stopwords(row[1])
                  row[2] = re.sub('<[^<]+?>', '', row[2]).replace('\n', '').strip()
                  if row[1] != '' and row[2] != '':
                      for i in range(3):
                          row[i] = row[i].replace('\u200b', '')
                          row[i] = row[i].strip()
                      if row[1] in attr_map:                  # 属性映射
                          if row[1] in zz_map:
                              row[2] = row[2] + zz_map[row[1]][0]
                          row[1] = attr_map[row[1]][0]
                      elif row[1] in zz_map:                  # 处理身高cm为身高,属性值+cm
                          temp_str = row[1]
                          row[1] = row[1].replace(
                              zz_map[row[1]][0], '')   # 替换掉cm kg等
                          row[2] = row[2] + zz_map[temp_str][0]
                      if row[0] in city_map:
                          row[0] = city_map[row[0]]
                      if row[0] not in entity_dict and row[0]:
                          idx += 1
                          entity_dict[row[0]] = idx
                          ent_csv.writerow((str(idx), row[0], 'Entity'))
                      if row[2] not in entity_dict and row[2]:
                          idx += 1
                          entity_dict[row[2]] = idx
                          ent_csv.writerow((str(idx), row[2], 'Entity'))
                      if row[0] and row[2] and row[1]:
                          rel = str(entity_dict[row[0]]) + \
                              str(entity_dict[row[2]])+'Relation'+row[1]
                          if rel not in rela_dict:
                              alltypeCsv.writerow(row)
                              spo_csv.writerow((str(entity_dict[row[0]]), str(
                                  entity_dict[row[2]]), 'Relation', row[1]))
                              index += 1
                              rela_dict[rel] = index
                  #    sys.stdout.write("%.2f"%(float(idx)*100/float(len_lines)))
                  #    sys.stdout.write("%\r")
                  #    sys.stdout.flush
      
      index_01 = index
      for key in list(entity_dict.keys()):
          entity = key
          ent_val = re.sub(u"\\[.*?\\]", '', key)
          if ent_val != entity:
              if ent_val in entity_dict:
                  temp_rela = str(entity_dict[ent_val]) + \
                      str(entity_dict[entity])+'Relation'+'歧义关系'
                  if temp_rela not in rela_dict:
                      alltypeCsv.writerow((ent_val, '歧义关系', entity))
                      spo_csv.writerow((str(entity_dict[ent_val]), str(
                          entity_dict[entity]), 'Relation', '歧义关系'))
                      index_01 += 1
                      rela_dict[temp_rela] = index_01
              else:
                  idx += 1
                  entity_dict[ent_val] = idx
                  spo_csv.writerow((str(idx), str(entity_dict[entity]), 'Relation', '歧义关系'))
                  ent_csv.writerow((str(idx), ent_val, 'Entity'))
                  index_01 += 1
                  temp_rela = str(entity_dict[ent_val]) + \
                      str(entity_dict[entity])+'Relation'+'歧义关系'
                  rela_dict[temp_rela] = index_01
                  alltypeCsv.writerow((ent_val, '歧义关系', entity))
      

      build_prop_dict 字典的程序如下:

      import ahocorasick
      import pickle
      from collections import defaultdict
      import os
      
      cwd = os.getcwd()
      
      def load_attr_map(attr_mapping_file):
          f = open(attr_mapping_file)
          mapping = defaultdict(list)
          for line in f:
              parts = line.strip().split(" ")
              for p in parts:
                  if p != '':
                      mapping[p].append(parts[0])
          return mapping
      
      def load_city_map(attr_mapping_file):
          f = open(attr_mapping_file)
          mapping = dict()
          for line in f:
              parts = line.strip().split(" ")
              mapping[parts[1]] = parts[0]
          return mapping
      
    • 代码介绍

      三元组提取时,首先要提取具有完整信息的三元组,即包含实体-属性-属性值的信息,其次还要剔除包含空字符、首尾空格、html标签以及不可见字符"\u200b",最后对每个实体建立唯一的id,用id建立对应的节点和关系数据,因源数据中只有部分数据包含歧义关系,对于一些没有歧义关系的实体,本文建立了对应的歧义关系,主要针对实体[xxxx]类型,建立(实体)-[歧义关系]->(实体[xxxx])。

      build_prop_dict 为映射程序,将源数据中出现一些属性、城市名、带有单位的属性值映射为对应的标准数据,主要使用字典进行映射。

    • 数据导入

      neo4j数据批量导入使用neo4j-admin import工具,针对neo4j 4.0 和neo4j 3.5.17,在此给出两种不同的导入方法(进入neo4j目录)。

      neo4j-4.0:

      bin/neo4j-admin import --nodes import/entity.csv --relationships import/relation.csv --multiline-fields=true
      

      neo4j-3.5.17:

      bin/neo4j-admin import --database=graph.db --nodes import/entity.csv --relationships:relation import/relation.csv --multiline-fields=true
      

      说明:在数据导入前,需要清空对应的数据库文件(4.0为neo4j,3.5.17为graph.db)

    • 建立标签

      为了大大提高检索效率,数据导入后应建立对应的标签,此处仅建立实体的名称和id。

      Cypher:

      CREATE INDEX ON:Entity(name)
      CREATE INDEX ON:Entity(id)
      
    • 修改数据

      原始数据中存在一部分错误数据,对与此类数据,需要在知识图谱构建完毕予以更新,经过测试,本文共发现了如下三种错误:

      • 错误1

        错误关系:《北京市见义勇为人员奖励和保护条例》实施办法->[市长]->王安顺

        解决办法:删除此条关系

        Cypher:

        MATCH (m:Entity{name:'《北京市见义勇为人员奖励和保护条例》实施办法'})-[r:Relation{name:'市长'}]->(n:Entity{name:'王安顺'}) delete r
        
      • 错误2

        错误关系:杭州[浙江省省会、副省级市]-[歧义权重]->(15254060)。

        解决办法:删除(杭州[浙江省省会、副省级市]-[歧义权重]->(15254060)),增加(杭州[浙江省省会]-[歧义权重]->(15254060))。

        Cypher:

        MATCH (m:Entity{name:'杭州[浙江省省会、副省级市]'})-[r:Relation{name:'歧义权重' }]->(n:Entity{name:'15254060'}) delete r 
        MATCH (m:Entity{name:'杭州[浙江省省会]'}),(n:Entity{name:'15254060'}) create (m)-[r:Relation{name:'歧义权重'}]->(n)
        
      • 错误3

        错误关系:北京-[描述]->《北京-中关村》为王持久作词,孙川谱曲,蔡国庆演唱的晚会歌曲,赞美了北京中关村作为电子科技产品的聚集地飞速发展。

        解决办法:删除(北京-[描述]->《北京-中关村》为王持久作词,孙川谱曲,蔡国庆演唱的晚会歌曲,赞美了北京中关村作为电子科技产品的聚集地飞速发展。),增加(北京-[描述]->北京,简称“京”,是中华人民共和国的首都、直辖市、国家中心城市、超大城市、国际大都市,全国政治中心、文化中心、国际交往中心、科技创新中心,是中国共产党中央委员会、中华人民共和国中央人民政府、全国人民代表大会、中国人民政治协商会议全国委员会、中华人民共和国中央军事委员会所在地,也是中部战区司令部驻地。)。

        Cypher:

        MATCH (m:Entity{name:'北京'})-[r:Relation{name:'描述' }]->(n:Entity) delete r
        MATCH (m:Entity{name:'北京'}),(n:Entity{name:'北京,简称“京”,是中华人民共和国的首都、直辖市、国家中心城市、超大城市、国际大都市,全国政治中心、文化中心、国际交往中心、科技创新中心,是中国共产党中央委员会、中华人民共和国中央人民政府、全国人民代表大会、中国人民政治协商会议全国委员会、中华人民共和国中央军事委员会所在地,也是中部战区司令部驻地。'}) create (m)-[r:Relation{name:'描述'}]->(n)
        
        
    展开全文
  • 基于mongodb存储的军事领域知识图谱问答项目,8大类,100余小类,共计5800项的知识库,该项目不使用图数据库进行存储,通过jieba进行问句解析,问句实体项识别,基于查询模板完成多类问题的查询,主要是提供一种工业...
  • 知识图谱问答系统

    2020-12-29 00:28:32
    知识图谱问答系统发布时间:2018-06-19 05:32,浏览次数:6061. 前言知识图谱(knowledge graph),是下一代搜索引擎、问答系统等智能应用的基础设施,目前出现的产品有:百度“知心”、搜狗“知立方”等。本篇将介绍...

    知识图谱和问答系统

    发布时间:2018-06-19 05:32,

    浏览次数:606

    1. 前言

    知识图谱(knowledge graph),是下一代搜索引擎、问答系统等智能应用的基础设施

    ,目前出现的产品有:百度“知心”、搜狗“知立方”等。本篇将介绍知识图谱基础知识,及其在自然语言处理方面(主要是问答系统)的应用。

    2. 知识图谱概念

    知识图谱,是一种基于有向图(directed graph)的数据结构,由节点(points)及有向边(directed

    edges)组成,图中的每个节点称为实体(Entity),边代表实体间的逻辑关系(Relation)。

    举一个例子,这是一个简单地描述旅游景点的知识图谱:

    现在来解释为什么“知识图谱是下一代搜索引擎、问答系统等智能应用的基础设施”,如果把智能系统看成一个大脑,那么知识图谱就是大脑中的一个知识库

    ,它使得机器能够从“关系”的角度去分析、思考问题。以上图为例,从知识图谱中可以获取“泰山的海拔高度为1545米”、“衡山和恒山发音相同”等简单知识。

    3. 知识图谱的表示

    知识图谱可以使用三元组(entity-1,relation,entity-2)

    来表示,每一条记录描述一个事实,例如:(五岳,五岳之一,泰山)表示“泰山是五岳之一”这样一个事实。需要注意的是,如果relation 是确定的,那么

    entity-1 与entity-2 的位置不能够颠倒的,因为一个三元组描述一条有向边(事实);实体不一定得是现实生活中的一个具体事物,也可以是事物的一个属性值

    ,此时关系就是该属性。

    我们用三元组来存储知识图谱,这时还需要考虑一个问题,那就是实体识别(Entity Recognition)与实体消歧(Entity

    Disambiguation)。例如,实体“苹果”有可能是指水果苹果,也可能是指iphone。这时,我们对知识图谱需要做一些处理,修改一下搜索策略。

    在建立知识图谱过程中,若发现歧义,则再增添对应上级节点,在筛选“苹果”一词时使用上级节点来消歧。这里再次强调知识图谱仅是基础设施

    。后面会通过几个例子说明知识图谱的应用价值;再介绍知识推理(Knowledge Reasoning)技术,即怎样通过与用户互动教会智能系统完善知识图谱。

    4. 知识图谱的应用

    传统搜索引擎只是简单地根据用户输入的关键词去筛选目标网页,然后给出一堆网页链接。知识图谱的应用,除了给出相应的网页链接外,还会尝试

    提供一些更加智能化的答案。例如,用户在必应搜索输入“taj mahal”将得到如下结果:

    这里提供泰姬陵的近义词、旅游信息、地理位置、古代世界七大奇迹等,从而更好地发掘用户意图,

    而不像传统搜索引擎那样死板,需要用户自己一条一条去筛选信息, 这样知识图谱技术就具有很大的商业价值了。

    又例如,我直接在百度搜索输入“乒乓球”, 得到以下结果(其实我只是想搜索一下“张继科”,但是一时间忘了他的名字):

    同时,知识图谱的应用能够使得搜索引擎获得一定的推理能力

    。举一个例子,在百度搜索输入“梁启超的儿子的妻子”,传统搜索引擎只是简单地匹配网页,很难真正地理解用户意图,更别说回答这个问题了。然而知识图谱却可以令问题变得简单起来,我们先从知识库中获取梁启超的儿子是梁思成,然后再获取梁思成的妻子是林微因。

    这样就能增强搜索引擎与用户间的互动,逐步变成一个智能问答系统。

    5. 知识推理技术

    这里再次强调知识图谱仅是基础设施

    ,因为它真的很简单,也没有什么高大上的技术,我们仅仅只是想将知识用这样一个形式存起来,以便由简单的知识学习出更高深的知识。举一个例子,知识图谱中仅存有如下信息:

    那么智能问答系统是无法回答类如“康熙与乾隆之间是什么关系?”知识推理类的问题的,这时可以用过简单地加入人工规则:“父亲+父亲→祖父”来更新知识图谱,或者直接从用户互动中学习规则,当然用户互动时就需要上

    统计知识了,不能说有网友回答“国籍相同关系”那么所有的祖父与孙子都是“国籍相同关系”。

    接下来我们来看一个更复杂的例子,在百度搜索引擎中输入“孕妇可以吃荔枝吗?”得到如下结果:

    这时智能问答系统可以返回“59%的网友认为能吃,28%的网友认为不能吃,13%的网友认为不能吃”。若用户继续问“不能吃的理由是什么?”,那就返回“不能吃”的网友回答。下面通过这个例子来思考

    统计机器学习技术在知识推理中的应用。

    我们分析一下,这些“网友回答”有些来自“宝宝树”,有些来自“有问必答网”,有些来自“育儿网”,我们可以利用爬虫去爬这些网站的问题及其回答,然后对问题做聚类

    ,先构建如下知识图谱:

    具体问题与回答之间的逻辑关系边一开始留空,我们再对语义边上分类技术,把空余的边填补完整,当然也可能误分类

    ,例如百度例子中的第一个回答,“慎吃”被归为“能吃”。最后再对这些边做统计,就可以回答类似问题,利用语料库做知识推理,学习知识库里没有的知识,完善知识图谱。

    展开全文
  • 构建了原发性肝癌的知识图谱 在此基础上,实现了流水 线式的问答系统:先识别问题中的实体,再结合TFIDF和词向量生成句子向量,匹配最相似的问题模板,根据模板 的语义及问题中的实体,到知识图谱中检索答案 实验表明,该...
  • 基于neo4j的简易医疗问答知识图谱,数据从ask120中爬取得到
  • 运行完成后,打开浏览器,就可以看到数据集 然后运行问答系统 运行效果 该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4...
  • 系列文章: 基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱 基于京东家电商品知识图谱的自动问答系统(二) -- IDEA搭建开发环境 基于京东家电商品知识图谱的自动问答系统(三) -- Java实现...
  • 平时除了看论文还是看论文,感觉有点无聊,于是嘛就想着搞点东西来玩玩,然后就搞了一个非常简单的基于知识图谱的电影问答系统系统是用python实现的,大概只花了1天吧,代码也仅有300多行,可以说是很容易上手了。...
  • 1 厨房领域的问答系统 智能厨房主要分为4个部分 菜谱.通过问答系统,你可以知道哪一道菜,比如说红烧肉怎么做等等 音乐. 比如,说“我想听一个轻松的音乐” 视频.比如,说我想看《人民的名义》第九集 厨电的...
  • 医疗知识图谱问答系统探究(一)

    万次阅读 多人点赞 2019-03-15 21:26:39
    这是阿拉灯神丁Vicky的...果然,功夫不负有心人,找到了中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。 项目地址:https://github.com/liuhuanyong/...
  • --|-create_graph.py 创建知识图谱,图数据库的建立 --> <!--|-query_graph.py 知识图谱的查询 --> <!--|-ltp.py 分词、词性标注、命名实体识别 --> <!--|- get_*.py
  • 注:KBQA即是我们通常所说的基于知识图谱问答系统。这里简单构建的EasyKBQA,数据来源于网络,源码地址看下面补充说明。   流程原理: 该问答系统可以解析输入的自然语言问句,主要运用REFO库的"对象正则...
  • 一种改进的基于序列到序列框架的知识图谱问答方法,刘彦志,程祥,知识图谱问答系统能根据图谱中的结构化知识回答自然语言问题。在知识图谱问答系统中,将自然语言问句映射为结构化查询语句是关键
  • 构建一个简单的基于 知识图谱 的对话系统。 核心目标是从全局对项目的运行过程进行介绍和讲解;能够跑通整个项目。 运行环境 python3.0及以上 neo4j 3.5.0及以上 jdk 1.8.0 构建知识图谱 运行以下命令: python...
  • 项目介绍 [项目地址(https://github.com/Tianweidadada/MedicalKGQA) 整理了很久,一定要给个star呀 博主目前南京大学在读研究生,有问题欢迎咨询(bravezhangw@163.com)
  • 对于整个系统,不管具体细节是怎么实现的,是逻辑一定要理清楚,于是这一节主要介绍各个模块的逻辑,为什么要这么做。 首先我简单的画了一个示意图(这叫啥图我也还给软件工程老师了,肯定不规范,帮老师画了一...
  • 行业分类-物理装置-基于知识图谱的急诊问答系统构建方法.zip
  • 构建图谱所需的数据从OpenKg中文开放知识图谱获取 图谱中涉及到的知识有医生,救护人员以及他们的信息,履历,事迹。虽然样本量不大,但是也能学习很多的相关知识。 新冠开放知识图谱.英雄 . JSON文件中存储了所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,369
精华内容 2,147
关键字:

知识图谱问答系统构建