0%

【知识图谱】(一)从概念开始

知识图谱描述

知识图谱是一种新型的数据库,是一种基于图的数据结构。每个结点表示现实世界中存在的“实体”,每条边为实体与实体之间的“关系”。以下为知识图谱的几点作用: - 从“关系”分析问题 - 把不同种类的信息连接在一起 - 一个关系网络

学习知识图谱首先得掌握以下几种技能: 1. 基础知识:自然语言处理、图数据库操作知识、基本编程能力:Python、SQL; 2. 领域知识:知识图谱构建方法、知识图谱推理方法; 3. 行业知识

知识图谱的构建步骤

  1. 数据收集(持续收集与更新)(关键词抽取命名体识别关系抽取事件抽取
    1. 原始数据,通常可能是一篇文章
      1. 爬虫技术
        1. 垂直爬虫
        2. 搜索引擎相关的爬虫
    2. 语料数据,通常词库,词典,同义词
    3. 开源的第三方知识图谱,例如搜狗人物关系图
    4. 开源的训练好的词向量(word2vec)模型,tfidf
  2. 图谱设计
    1. 实体定义(本体) 实体:实体类型
      1. 属性 例如,手(长度,面积),类别:身体器官
    2. 属性定义
    3. 关系定义
      1. 关系也需要定义类别
      2. 需要评估关系可以覆盖的数据量,一般服从28 原则,20%的关系,覆盖80%数据
  3. 知识清洗
    1. 实体消歧
    2. 实体统一
  4. 知识融合(实体链接)
    1. 实体与关系的融合
    2. 实体扩充(融合外部知识图谱或者数据)(知识合并
  5. 知识存储-图数据库

知识图谱的架构与设计

知识源数据的获取

略。可以使用爬虫等技术,或者直接网上搜现成的数据。

信息抽取

包括关键词抽取、命名体识别、关系抽取,事件抽取等技术。

关键词抽取

分词

分类算法中的流程: 分词-->(自然语言处理,与,知识,图谱,知识图谱)-->去停词-->(自然语言处理,知识,图谱,知识图谱)-->建立索引-->(1,2,3,432,66)-->one hot-->word2vec-->

语料库

jieba 分词同时基于一些语料库和手写的规则(如隐马尔科夫模型)。 如果想要加入自己的语料库可以使用下面的代码,语料库的格式可在 github jieba 上找到。

1
2
3
jieba.load_userdict('/home/python/dictionary.txt')
seg_list = jieba.cut(text, cut_all=True)
print(' '.join(seg_list))

  1. 词库
    • 医药知识图谱
      • 语料库(网上有现成的,不用自己爬,如:医药行业专业词典)
        • 医院的名称
        • 疾病的名称

文本特征提取

文本数据的表示模型: - 布尔模型(boolean model) - 向量空间模型(vector space model) - 概率模型(probabilistic model) - 图空间模型(graph space model)等

以下为几种主要的模型,它们的目标都是:建立文档的向量(矩阵)模型。加粗代表是现在常用的模型 1. TF-IDF 2. LDA 3. LSA/LSI 4. Word2Vec 5. one-hot 6. BERT 7. ...

TF-IDF

TF:词频 IDF:逆文档频率。 权重 = TF * IDF TF-IDF 可能会漏掉一些词。比如一篇文章只出现一次“周杰伦”,但是它已经表示了这篇文章的主旨。可是 TF-IDF 无法为该词分配较高的权重。 另外 jieba 中其实可以直接使用 TF-IDF。导入jieba.analyse即可使用。(TF-IDF 其实就是提取句子的标签)

1
2
import jieba.analyse as ja
ja.extract_tags(sentence, topK=3,withWeight=False, allowPOS=())

word2vec

TF-IDF 只考虑单个文字,忽略了句子中的上下文信息。而word2vec 考虑了上下文,输入值为某个单词的前几个单词、后几个单词和其本身。 word2vec 现成的工具包有:1)gensim;2)tensorflow;3)keras。 另外 QA 系统等应用可能不适合使用 word2vec 训练出来的单词。因为它训练出来的词向量没有捕获到太多的上下文信息。众所众知,QA 系统和对话系统等应用需要经常使用到很多上下文信息。

命名体识别——NER

所谓的命名体(named entity)就是人名、机构名、地名以及其他所有以名称为标识的实体。更广泛的实体还包括数字、日期、货币、地址等等。 难点:1)同义词、歧义词等;2)未登录词判定。 一般流程:1)基于规则的方法;2)基于模型的方法,常见的序列标注模型包括 HMM(Hidden Markov Model)、CRF(Conditional random field)、RNN。不过虽然基于模型的方法技术比较新颖,但是由于太过复杂以及太难解释,所以公司还是用基于规则的方法比较多。

序列标注

  • 基于HMM
  • 基于CRF

    上课的时候没听明白。

  • 基于RNN 要做命名体识别,首先要做序列标注的任务。目前有以下几种公认的标注体系: 标注体系

关系抽取(特征工程)

  1. 文本特征提取,采用 tf-idf
  2. 关键字抽取,比如转让,收购,整合等等
  3. 句法特征提取,主要是与核心词之间的关系,包括企业实体本身和前后词与核心词之间的关系,距离等。即抽取(实体,关系,实体)三要素特征
    • 依存句法分析
      • 依存树,demo
      • CCG
    • 分类器
  4. 如果使用 NN 训练,可以拼接三要素和 tf-idf 特征

事件抽取

略,培训中未提到,估计跟关系抽取差不多。

知识融合

实体链接

实体统一/实体对齐

注:另一种说法是实体统一和实体对齐并不是同一件事。此处姑且当它们是同一件事。 对同一实体具有多个名称的情况进行实体统一,将多个名称统一替换成一个命名实体。比如,“河北银行股份有限公司”和“河北银行”可以统一成“河北银行”。 大致来说这个应用是使用规则来做实体统一。目前(2019 年 7 月)来说,基于规则的做法大概能解决 70% 左右的问题。还可以使用余弦相似度,分类等算法进行融合使用。 - 分离出地名,比如河北,北京 - 去除后缀,比如有限公司,集团 - 提取经营范围,比如医疗,化学 - 剩余部分为中间字段 - 最后选择以上四个部分的某些部分进行拼接,成为一个唯一的命名实体,如果有中间字段,则仅使用中间字段即可,并对某些特殊的经营范围做补充,比如银行;否则,优先使用地名加经营范围,其次是地名加后缀。

更新命名体:在做完实体统一之后,将原数据中的实体进行替换即可

实体消歧

与实体统一不同。实体统一是将两个不一样名称的实体统一起来,而实体消歧是将同一个名称的实体在不同语境下区分开来,比如:苹果在不同的语境下分别有水果和手机的意思。 中文的不怎么好做,主要运用规则。

知识合并

阿里巴巴实体合并框架

知识加工

知识存储与检索

知识应用

汉语处理的难点

汉语处理的难点
汉语处理的难点

NLP 工具包

略。详见此博客

项目实战

以上为知识图谱的大致概述,以下以几个例子大致地将构建步骤串联起来。首先给出知识图谱的总结思维导图,可以按照图中的内容自行对应查找知识点。思维导图的阅读顺序是从上至下从右至左知识图谱总结

医疗命名体识别

项目地址,使用了基于字向量的四层双向 LSTMCRF 模型的网络。 本项目大致使用了信息抽取->命名体识别的技术。项目中有一个名为 data_origin 的文件夹,其结构为:

1
2
3
4
5
6
7
8
data_origin
├─一般项目
│ ├─一般项目-1.txt
│ ├─一般项目-1.txtoriginal.txt
│ └─。。。
├─出院情况
├─病史特点
└─诊疗经过
一般项目-1.txt 文件包含了由人工标注过的数据,一般项目-1.txtoriginal.txt 包含了原始数据,即未经过任何处理的数据。类似以下的格式。第 2 列和第 3 列代表该命名体在原始数据中的开始和结束的索引。 原始数据

人工标注后的数据
人工标注后的数据

以上的数据为项目的原数据(那个由人工标注过的数据也算原数据),我们需要使用一套标注体系(本项目使用 BIO 体系)来将原数据处理一下,以下是处理结果。 使用 BIO 标注后的数据

你可能会疑惑 DISEASE-* 之类的东西是什么意思,以及它是怎么出来的。其实十分简单,如下所示,都是预先定义好的。以 B 结尾,代表一个命名体的开始,以 I 结尾,代表一个命名体的结束。而产生数据的过程也只是写死的一套逻辑,使用 if else 进行判断罢了。 标签字典

训练之前的准备工作

  1. 定义标签
  2. 人工将数据一条一条地标注命名体、起始位置以及标签
  3. 选择一套标注体系
  4. 每一份原数据使用标注体系处理后,存入一份文件

训练

代码中以 ['。','?','!','!','?'] 符号作为一份病历的结束。然后将训练数据重新拆分成多分训练样本。我倒是认为在原数据处理完毕合并时,就做一些处理不行吗?如果以那些符号作为判断条件,可能有些不太准。 1. 加载字向量; 2. 以 ['。','?','!','!','?'] 符号作为一份病历的结束,重新切分数据为多份训练样本; 3. 每一个字都有一个标注,比如训练样本:[感, 染, 风, 寒]和标注:[CHECK-B, CHECK-I, DISEASE-B, DISEASE-I]--转换为-->[32, 8454, 676, 934]和[7, 8, 10, 9]; 4. 程序定义有 150 个时间步,第一层 BiLSTM 为 128 维,第二层的 BiLSTM 为 64 维,各层之间的 Dropout 取 0.5; 5. 将训练样本输入 RNN,RNN 的输出输入 CRF,CRF 输出一个 11 维的向量,即每一个字都会输出一个 11 维的向量。所以可以看做是一个 11 元分类模型,即判断一个字属于哪一类的标注,也就是序列标注的含义——为字标注属性; 6. 训练结束,就完成了一个序列标注模型。

总结

此项目实现了命名体识别的功能,使用了 LSTM 以及 CRF 的技术,原数据采用了人工标注的处理方式,原数据转为训练样本采用了规则模版的方式。总的来说,没有太大难度。对于此项目,我们需要理解 LSTM 和 CRF 的算法,整个过程的难点就在人工标注上,费时费力。

中文人物关系知识图谱

项目地址。此项目代码结构有点复杂,涉及了很多爬虫,我对爬虫不是很了解。

总结

此项目实现了关系抽取的功能,具体使用了什么技术未知

判断两个企业实体是否存在投资关系

项目地址

总结

此项目实现了关系抽取实体统一的功能,基本上使用了人工模版去判断两个企业是否统一。是否存在投资关系也是用规则判断的。

金融问答项目

此项目(实验21-1-FinancialKGQA)实现了一个简单的金融问答项目,前提项目为实验19-neo4j构建简单的金融知识图谱,旨在使用爬虫技术构建一个金融知识图谱。数据和代码已经由 2019.6.27 普开知识图谱培训机构提供。

总结

从下图可以看出,只是简单的关键词匹配。然后通过 neo4j 的 CQL 语句进行查询。 金融问答示例代码

企业经营退出风险预测

项目地址,还没研究过。同一个项目,另一个人的项目地址