知识图谱融合

将知识图谱进行总结:
概念图谱、实体概念混合图谱、素材文档图谱+工作文档图谱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
构造		|概念<-混合	|混合<-素材+工作文档
--------------------------------------------------------
节点 |人工补全(略) |自动去重(2)
|冲突检测 |自动合并(2)
| |冲突检测
| |自动挂接(2)
--------------------------------------------------------
条目 |生成编辑 |自动合并(2)
| |编辑合并
--------------------------------------------------------
概念(概念图谱) |归纳聚类(1) |X
--------------------------------------------------------
领域(混合图谱) |X |领域相似性检测
--------------------------------------------------------
子图(混合图谱) |X |子图分类(1)

冲突检测:
获取知识图谱的领域树;获取知识图谱中的当前实体;获得当前实体在领域树中所属的第一领域及第二领域;分别确定第一领域及第二领域在领域树中的位置;根据第一领域及第二领域在领域树中的位置,确定当前实体的第一领域及第二领域的关系;确定第一领域及第二领域在领域树中不存在公共子领域,或者,确定第一领域及第二领域在领域树中存在公共父领域且公共父领域为通用领域,将第一领域及第二领域确定为可疑冲突领域对;根据可疑冲突领域对,获得知识图谱的冲突领域对。该方法可以得到知识图谱中存在的冲突领域对,覆盖率很高。

冲突检测和冲突消解:
将节点之间的冲突分为:
术语冲突:实体冲突
谓词冲突:表达相同知识采用不同形式的谓词
语义冲突:多个知识在逻辑上产生的不一致

提出了
逻辑树融合法:术语冲突
频率融合法:术语冲突、谓词冲突
句法融合法:术语冲突、谓词冲突和语义冲突

参考:
知识图谱实体领域冲突检测方法,装置及相关设备??
申请(专利权)人:腾讯科技(深圳)有限公司

1.分类/聚类问题:

子图分类:
介绍:
找到同构子图
算法:GNN/GCN
简介:
训练一个GCN网络,将多个KG的实体和关系都映射到同一个空间,相同实体对和关系对有相同的向量表示,然后根据空间中向量的相似性来寻找对齐的实体。

参考:
基于图神经网络的知识图谱研究进展
融合多个知识图谱形成一个更完整的知识图谱。由于图神经网络具有识别同构子图的能力,而可对齐的实体对周围通常有相似的邻居,即具有一定的同构特征,因此目前有许多研究者尝试将图神经网络用于实体对齐。
Multi-Channel Graph Neural Network for Entity Alignment
https://arxiv.org/pdf/1908.09898v1.pdf
该方法的缺点:
1.结构异质性:不同KG会有不同的结构,从而根本就无法对齐。
2.有限的种子对

概念归纳聚类:
介绍:
谱聚类,图中不同点进行聚类,将图进行分割。
算法:RatioCut/Ncut切图+k-means聚类
简介:
选一个cut(a1,a2,..,an).然后k-means.

参考:
https://www.cnblogs.com/pinard/p/6221564.html

自动去重/合并:
比较实体的语义和结构特征,找同义词
算法:
对非结构化数据做语义分析,找到同义词对
1) 选取一些特定分词结果做同义词挖掘。如果需要考虑语料中可能出现的新词或者不同语言表述,则需要配合Pattern挖掘、NER或名词短语抽取等方式获取候选词。
2) 准备好已有的同义词表作为种子数据
3) 获取所有种子词和候选词的特征,通常该任务的特征会从两个角度考虑,分别是local context和global context,通俗的讲就是局部特征和全局特征,前者着重于词本身,常见字级别特征、词级别特征等;后者则是考虑目标词在数据集中的分布特征或者词所在句子、段落的语义特征

参考:
https://blog.csdn.net/jxsdq/article/details/106002991
https://zhuanlan.zhihu.com/p/105203565

Schedule

ing:
1.bert

frame:

neural network
convolution neural network

rnn
lstm
transformers
bert
gpt-2

lecture:

Deep learning for human language processing

AdaBoost模型

概述

资料来源:
https://blog.paperspace.com/adaboost-optimizer/#:~:text=AdaBoost%20is%20an%20ensemble%20learning,turn%20them%20into%20strong%20ones.

Ensemble Learning:
集成学习(或者是组合学习),将多个基础的算法相结合,构造成一个优化的预测模型。

为什么需要集成学习:
1.减少变量
2.减少偏置
3.提高预测性能

集成学习被分为了两个类型:

  1. 顺序学习,通过依次生成不同的模型,之前模型的错误被后来的模型学习,利用模型之间的依赖性,使得错误标记有更大的权重。

例如:AdaBoost

2.并行学习,并行产生基本的模型,这通过平均错误来利用了模型的独立性。

例如:Random Forest 随机森林

集成方法中的Boosting
例如人类从错误中学习,并且尝试将来不再犯同样的错误,Boost算法尝试从多个弱分类器的错误中建立一个更强的学习预测模型。
你一开始从训练数据中建立一个模型,
然后你从上一个模型中建立第二个模型通过尝试从减少上一个模型的误差。
模型被顺序增加,每一个都修改它的前面一个模型,知道训练数据被完美的预测或者增加了最大数量的模型。

Boosting基本上是试图减少模型无法识别数据中的相关趋势的时候所引起的偏差。这是通过评估预测数据和实际数据的差值所实现的。

Boost算法的类别:
1.AdaBoost(Adaptive Boosting)
2.Gradient Tree Boosting
3.XGBoost

我们主要注意AdaBoost中的细节,这个是Boost算法中最流行的算法。

单个分类器也许无法正确预测每个对象的类别,但是当我们将多个弱分类器组合到一起,每个分类器从其他分类器中分类错误的对象中进行学习,我们可以构建一个强模型,弱分类器可以是任何基本分类器,从决策树到Logistic回归等。

那么什么是弱分类器?
弱分类器的性能优于随机猜测,但是在指定对象的类中表现不佳,例如,较弱的分类器可以预测40岁以上的每个人都无法参加马拉松比赛,但是低于40岁的人可以参加马拉松比赛,也许就会有60%以上的准确度,但是仍然会有许多数据点误分。

AdaBoost不仅仅可以作为模型本身使用,还可以应用在任何分类器之上,从其缺点中学习并且提出更加准确的模型。因此可以称为最佳现成分类器。

那么开始了解AdaBoost是如何和决策树桩一起使用,决策树桩就像随机森林中的数目,但不是完全生长的,它有一个节点和两个叶子,AdaBoost使用了这样的树桩森林,而不是树。

单靠树桩并不是做出决定的好方法。一棵成熟的树结合了所有变量的决策以预测目标值。另一方面,树桩只能使用一个变量来做出决定。让我们通过查看几个变量来确定一个人是否“健康”(身体健康),来逐步了解AdaBoost算法的幕后知识。

例子:
STEP1:
一个弱分类,基于加权的样本,样本的权重表示正确分类的重要性,对于第一个弱分类,我们给所有样本同样的权重。

STEP2:
我们为每一个变量创造一个决策树桩,并查看每一个树桩分类的结果,例如,我们检查了年龄、吃垃圾食物和锻炼。我们将看每个树桩将多少样本正确分类。

STEP3:
我们将更多的权重分配给分类错误的样本,以便在下一个决策树桩中对样本进行正确的分类,权重还会根据每个分类器的准确性分配给每个分类器,高精度的分类器就有更好的权重。

STEP4:
第二步重复进行,直到所有数据点都正确分类。

下面是数学方面的表示:
首先是数据集:

其中:
n:数字的维度,或者说是数据集的特征数

x:数据点的集合

y:目标变量为-1和1,当为二分类问题的时候

那么,每个样本的权重,如何计算?

一开始的时候,每个样本的权重都相同,为1/N
其中:N为数据点的总数

这使得加权的样本和为1

之后,计算分类器的影响力,通过下面的公式:

Total Error就是错误分类的数目,那么关系如下图所示:

记住,当分类器表现好的时候,影响力大,当0.5的时候为0,当非常不好的时候,为负数。

之后,样本的权重呢?

总结:
AdaBoost的好坏:
优点:
比SVM简单好用,不需要调整参数
AdaBoost不会倾向于过拟合
提高了弱分类器的准确性,使其更加灵活

缺点:
需要有高质量的数据,对噪声敏感

RNN神经网络


RNN背后的想法是利用顺序信息。在传统的神经网络中,我们假设所有输入(和输出)彼此独立。但是对于许多任务来说,这是一个非常糟糕的主意。如果要预测句子中的下一个单词,则最好知道哪个单词在它之前。RNN之所以称为递归, 是因为它们对序列的每个元素执行相同的任务,其输出取决于先前的计算。思考RNN的另一种方法是,它们具有“内存”,可以捕获有关到目前为止已计算出的内容的信息。从理论上讲,RNN可以任意长的顺序使用信息,但实际上,它们仅限于回顾一些步骤(稍后再介绍)。

通过展开,我们仅表示我们为整个序列写出了网络。例如,如果我们关心的序列是5个单词的句子,则该网络将展开为5层神经网络,每个单词一层。控制RNN中发生的计算的公式如下:

是时间步的输入。例如, 可以是与句子的第二个单词相对应的“一字通”向量。
是时间步的隐藏状态。这是网络的“内存”。根据先前的隐藏状态和当前步骤的输入来计算。该函数通常是诸如tanh或ReLU之类的非线性函数。 计算第一个隐藏状态所需的,通常初始化为全零。

下面的内容是如何实现RNN网络:
https://blog.csdn.net/rtygbwwwerr/article/details/51012699
http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/
语言模型:
某一句话s是由n个词语(w)组成的集合,那么这句话生成的概率为:
P(s) = P(w_1,w_2,…,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)…P(w_n|w_1,…,w_n-1)

公式中,需要n个联合条件分布率,通常我们做一些假设,每一个词语都依赖它的前一个词语,那么就可以化简为:
P(s) = P(w_1)P(w_2|w_1)P(w_3|w_2)…P(w_n|w_n-1)
当依赖两个单词的时候同样类似。

上面就被称为2-Gram和3-Gram,关联的词语越多,模型就越精确,训练成本也很大。

这里使用RNN训练一个2-Gram模型。也就是通过RNN来估计每对单词的条件概率P(w_i|w_j)

训练样本数为Ns,目标词典的word数量为Nw,每个单词使用one-hot表示。
输入/出层节点数为 Ni=No=Nw
隐藏层节点数为Nh(通常为Ni的十分之一)
隐藏层的激活函数为tanh,
输出层激活函数为softmax
隐藏层存在一个递归边,每个时刻的输出乘以权值矩阵W后,将作为下一个时刻输入的一部分。

权值矩阵:
U :Input Layer -> Hidden Layer NhNi
V :Hidden(t) Layer -> Output Layer No
Nh
W :Hidden(t-1) Layer-> Hidden(t) Layer Nh*Nh
f_h:隐藏层激活函数
f_o:输出层激活函数

s_k(t):t时刻第k个隐藏层节点的输出值
o_k(t):t时刻第k个输出层节点的输出值

y_k:第k个输出层就诶点的目标输出值

程序的组成:

1.标记文本:
我们有原始的文本,但是,我们希望在词语的基础上进行预测,这就表示,我们需要在句子中对文本进行标识,我们可以通过空格将每个评论分割开,但是这样就无法正确处理符号,
句子‘He left!’应该是三个词语令牌:’He’,’left’,’!’我们将会使用NLTK中的word_tokenize和sent_tokenize方法,这将会替我们完成最复杂的工作。

2.删除低频词语
文本中的大多数词语仅仅出现1到2次,将低频的词语删除是一个好方法。
大量的词汇表将会使得训练的速度降低。而且,由于我们没有很多低频词语的上下文实例,因此我们也无法学习如何正确使用低频词语。为了能够理解如何使用一个单词,你需要在不同的上下文中看到它。

代码中,我们将最常用的词汇表限制为vocabulary_size,默认为8000,但是可以随意修改。我们将不包含在词汇表中的词语用UNKNOWN_TOKEN来代替。

我们将会把UNKNOWN——TOKEN作为我们词汇的一部分,当我们生成新的文本的时候,我们可以再次替换UNKNOWN——TOKEN,例如通过在词汇表中抽取一个随机采样的单词,或者我们可以通过生成句子,直到得到一个不包含未知标记的句子。

3.添加开始和结束标记:
我们同样希望学习哪些词语在开头或者结尾,为此,我们准备了SENTENCE——START和SENTENCE-END令牌,考虑到第一个token是SENTENCE-START,那么什么词语跟在后面呢,也就是句子的第一个单词。

4.建立训练数据矩阵
CNN的输入是向量,我们需要建立一个单词到序列的映射,index_to_word和word_to_index

idea

0.概述

学习过程中的小想法:

1.内容

adaboost: 样本权重通过聚合程度过滤之后再修改权重,避免误差

BERT+判断模型 NER ELECTRA

字图片+上下文 分析NER

BERT中究竟学了什么内容

spo 平台实现

NER博客流程

知识图谱

损失迭代,多任务

增加池化层,深度学习,度深学习

Enhanced Language Representation with information entities ERNIE 在pre train中增加其他信息

概率图

将一句话变为2维,然后使用卷积和U-Net之类的。

知识图谱推理

综述参考:
文献[27]对知识抽取的研究进展进行了综述,
文献[28-31]分别对知识图谱构建、实体对齐、知识表示学习以及知识融合进行了综述,
文献[32]对知识抽取、知识表示、知识融合和知识推理这4个方面的研究进展进行了总结和展望.
面向知识图谱的知识推理研究进展

面向知识图谱的知识推理旨在根据已有的知识推理出新的知识或识别错误的知识

它包括两方面的内容:
知识图谱补全(knowledge graph completion,knowledge base completion)[1316]
包括:
连接预测 (link prediction)[19-21]
实体预测(entity prediction)[22-24]
关系预测(relation prediction)[22-25]
属性预测(attribute prediction)[26]等

知识图谱去噪 (knowledge graph refinement,knowledge graph cleaning)[17,18].

据推理类型划分,将面向知识图谱的知识推理分为单步推理和多步推理,
根据方法的不同,每类又包括基于规则的推理、基于分布式表示的推理、基于神经网络的推理以及混合推理.

目前的知识图谱有
KnowItAll[5]
YAGO[6-8]
DBpedia[9]
Freebase[10]、
NELL[11]
Probase[12]等.

人工智能下一个十年

知识图谱+认知推理+逻辑表达 -> 认知图谱(Cognitive Graph)

深度学习算法经过的阶段:
1.向前网络:深度学习算法
2.自学习、自编码代表的学习时代
3.自循环神经网络,概率图模型
4.增强学习

路线:
1.脑科学
2.数据与知识

方向:
1.推理
2.可解释能力

paper: Das, R. , Neelakantan, A. , Belanger, D. , & Mccallum, A. . (2016). Chains of reasoning over entities, relations, and text using recurrent neural networks

pro : https://rajarshd.github.io/ChainsofReasoning/

OWL等规则及Jena工具

源码:https://github.com/debuluoyi

基于基本的Path-RNN的架构进行改进。
基本Path-RNN:
输入:两个实体之间的路径,
输出:推理出的二者之间的新关系。
将关系之间的连接用RNN表示来进行推理。路径的表示是在处理完路径中所有的关系之后由RNN的最后的隐状态给出的。

改进有:
1.之前要为每一个需要预测的relation-type单独训练模型。而优化后只训练一个RNN来预测所有的relation type,共享了RNN参数精度也显著提高了。共享了relation type的表示以及RNN的composition matrices,这样同样的训练数据变量就大大减少了。训练模型的损失函数用的是negative log-likelihood
2.本文使用了neural attention机制对多条路径进行推理。之前的工作只推理了relation,没有推理组成路径上节点的entities,本文对关系类型,实体和实体类型进行了联合学习和推理。
3.分别用Top-kaverage和LogSumExp等多纬度为每一条路径的相似度评分加上权重,这样就考虑了每一条路径包含的信息,而不仅仅是评分最高的那条。

解决方法和公式:
首先进行下列的定义:
(e_s,e_t):一对实体
S:实体之间的路径集合
Pi = {e_s,r_1,e_1,r_2,…,r_k,e_t}:(e_s,e_t)之间的一条路径,
其中,路径的长度是路径上的关系的数目
len(Pi) = k

y_rt 表示节点r_t的向量表式,维度为d
RNN模型将所有的关系放到Pi序列中使用了一个RNN网络。中间层表示是h_t。

其中W_hh(hh)和W_ih(dh)分别是RNN网络的参数,其中上标r表示的是询问的关系。Path-RNN对于每一个关系都有不同的参数(y_rt,W_hh,W_ih)。
上面的f是sigmoid函数,路径的向量表式Pi(y_pi)是最后的隐藏层h_k.

y_pi和y_r的相似度可以计算为:

对于一个实体对的N条通路,Path-RNN通过下列的公式计算了两个实体之间的关系:

Python之正则表达式详解

0.概述

资料来源:
https://docs.python.org/zh-cn/3/library/re.html

模式和被搜索的字符串可以是Unicode字符串(str)或者8位字节串(bytes).但是两者不能够混用,

提供正则表达式操作。

其中有常用的几种方法:
不进行转义处理: r”\n” 表示 \和n两个字符的字符串,而”\n”表示换行符。

有一些字符是特殊的元字符(matacharacters),并且不匹配自己。相反,它们表示匹配一些不同的东西,或者通过重复它们或者改变它们的含义来影响正则的其他部分。

1.元字符的完整列表:

1
. ^ $ * + ? {  } [  ] \ | (  )

1.1 匹配字符

[ ]:用来指定字符类,希望匹配的一组字符。
例如:
[abc] 将匹配任何字符 a、 b 或 c ;这与 [a-c] 相同,它使用一个范围来表示同一组字符。 如果你只想匹配小写字母,你的正则是 [a-z] 。

字符类中的元字符不生效。
例如:
[akm$] 将匹配 ‘a’ , ‘k’ 、 ‘m’ 或 ‘$’ 中的任意字符; ‘$’ 通常是一个元字符,但在一个字符类中它被剥夺了特殊性。

你可以通过以下方式匹配 complementing 设置的字符类中未列出的字符。这通过包含一个 ‘^’ 作为该类的第一个字符来表示。 例如,[^5] 将匹配除 ‘5’ 之外的任何字符。 如果插入符出现在字符类的其他位置,则它没有特殊含义。 例如:[5^] 将匹配 ‘5’ 或 ‘^’。

也许最重要的元字符是反斜杠,\。 与 Python 字符串文字一样,反斜杠后面可以跟各种字符,以指示各种特殊序列。它也用于转义所有元字符,因此您仍然可以在模式中匹配它们;例如,如果你需要匹配 [ 或 \,你可以在它们前面加一个反斜杠来移除它们的特殊含义:[ 或 \。

一些以 ‘' 开头的特殊序列表示通常有用的预定义字符集,例如数字集、字母集或任何非空格的集合。

\d
\D
\s
\S
\w
\W
.(点) 在默认模式,匹配除了换行的任意字符。如果指定了标签 DOTALL ,它将匹配包括换行符的任意字符。

^
(插入符号) 匹配字符串的开头,

1.2 重复

重复中我们要了解的第一个元字符是 *。 * 与字面字符 ‘*’ 不匹配;相反,它指定前一个字符可以匹配零次或多次,而不是恰好一次。

例如,ca*t 将匹配 ‘ct’ (0个 ‘a’ 字符),’cat’ (1个 ‘a’ ), ‘caaat’ (3个 ‘a’ 字符),等等。

另一个重复的元字符是 +,它匹配一次或多次。 要特别注意 * 和 + 之间的区别;* 匹配 零次 或更多次,因此重复的任何东西都可能根本不存在,而 + 至少需要 一次。

例如,ca+t 将匹配 ‘cat’ (1 个 ‘a’),’caaat’ (3 个 ‘a’),但不会匹配 ‘ct’。

重复限定字符,问号字符 ? 匹配一次或零次;你可以把它想象成是可选的。

例如,home-?brew 匹配 ‘homebrew’ 或 ‘home-brew’。

最复杂的重复限定符是 {m,n},其中 m 和 n 是十进制整数。 这个限定符意味着必须至少重复 m 次,最多重复 n 次。

例如,a/{1,3}b 将匹配 ‘a/b’ ,’a//b’ 和 ‘a///b’ 。 它不匹配没有斜线的 ‘ab’,或者有四个的 ‘a////b’。

你可以省略 m 或 n; 在这种情况下,将假定缺失值的合理值。 省略 m 被解释为 0 下限,而省略 n 则为无穷大的上限。

还原论者的读者可能会注意到其他三个限定符都可以用这种表示法表达。 {0,} 与 * 相同, {1,} 相当于 + , {0,1} 和 ? 相同。 最好使用 * , + 或 ? ,只要因为它们更短更容易阅读。

2.使用正则表达式

方法 / 属性

目的

match():确定正则是否从字符串的开头匹配。

1
2
3
4
group():返回正则匹配的字符串
start():返回匹配的开始位置
end():返回匹配的结束位置
span():返回包含匹配 (start, end) 位置的元组

search():扫描字符串,查找此正则匹配的任何位置。

findall():找到正则匹配的所有子字符串,并将它们作为列表返回。

finditer():找到正则匹配的所有子字符串,并将它们返回为一个 iterator。

BeautifulSoup4笔记

0.概述

参考文档:
https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。

1
2
3
4
5
pip install beautifulsoup4
//安装

from bs4 import BeautifulSoup
//加载模块

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag,NavigableString,BeautifulSoup,Comment.

其中的正则表达式re模块需要参考下面的文档:
https://docs.python.org/zh-cn/3/howto/regex.html#regex-howto

Pre-train模型

0.概述

资料来源:李宏毅教授教程Deep Learning of Human Language Process

1.Pre-Train Model

为什么需要Pre-Train Model

Pre-Train Model的具体流程如下图所示。

由许多层组成,有如下的几种架构方法:
1.LSTM
2.Self-attention layers
流行的model
3.Tree-based model
在公式表示中有很好的表现

Pre-Train发展:
ELMO
Predict Next Token(Bidirectional):

BERT(类似与CBOW)
Masking Input:

补充:

bert看所有的sequence,而CBOW有固定的窗口

Mask Input:
首先,Original BERT Input
probability
pro [MASK] ##lity

然后,Whole Word Masking(WWM)
probability
[MASK]

最后,Phrase-level和Entity-level(Enhanced Representation through Knowledge Integration,ERNIE)

小的BERT模型有:
ALBERT 每一层的参数都相同,小一些,但是效果没怎么变

Network Compression https://youtu.be/dPp8rCAnU_A
其中:
Network Pruning
Knowledge Distillation
Parameter Quantization
Architecture Design

BERT模型压缩:
http://mitchgordon.me/machine/learning/2019/11/18/all-the-ways-to-compress-BERT.html
all the ways to compress BERT

减少self-attention的运算量(n^2,其中n为sequence的长度):
Reformer
Longformer

有了Pre-Train Model之后,如何Fine-Tune?如图所示。

2.优化

2.1 Adaptor

当我们进行Fine-Tune任务的时候,通常是如下图所示。

增加adaptor模块

将效果进行对比

3.GPT-3

参考论文:language model are few-shot learners
其中,few-shot是什么意思呢?

首先,GPT-3的few-shot和其他模型的few-shot不同,如上图所示。
在其他模型中,few-shot learning是指用少量的训练资料去Fine Tune它。
在GPT-3中没有Fine Tune的内容,直接将问题的简介、样例(有的没有)和问题作为模型的输入,然后输出问题的答案。

如下图所示:

这种学习被称为In-context learning,图中有三种类型。

精度随着变量变化的趋势。

精度随着样本的变化趋势

在数学计算上的精度:

4.GPT和BERT对比

首先,BERT是使用了MASK Input模型来获取上下文的资料,而GPT是根据前面的token来进行预训练。

所以GPT在autoregressive生成句子中有劣势,但是,在non-regressive中可能会有好的效果。