基于图的文档级关系抽取

1.概述

文档级关系抽取中的实体对通常贯穿于文档的多个句子中,和句子级的关系抽取相比需要更多的信息。

文档级关系抽取任务描述:
输入:实体1、实体2和文档
输出:两个实体之间的关系

为此,需要设计新的模型来获取更多的信息。为此,有了下面的方法。
(1) GCNN (Inter-sentence Relation Extraction with Document-level Graph Convolutional Neural Network)
(2) EoG (Connecting the Dots: Document-level Neural Relation Extraction with Edge-oriented Graphs)
(3) GAIN (Double Graph Based Reasoning for Document-level Relation Extraction)(Graph Aggregation-and-Inference Network)

2.模型

2.1 GCNN

使用了GCNN网络,和普通的GCN类似,但是结构有所不同。

2.1.1 结构

节点: 文档中的word包含
(1) word的词向量
(2) word与目标实体的相对位置
![GCNN_example.png]

连线:关系
(1) Syntactic dependency edge:句法依赖
(2) Coreference edge:指代
(3) Adjacent sentence edge:相邻的上下句
(4) Adjacent word edge:相邻的上下word
(5) self node edge:自身

2.1.2 算法

对每一种关系图进行GCN的运算,然后将不同类型的关系图进行加权相加之后得到最后的结果。

最后使用了两个不同的全连接层,分别对应前一个和后一个实体。

![GCNN.png]

2.2 EoG

使用了边的图,而不是基于节点。与之前的模型不同。这个模型有如下的特点。
(1) 包含实体的mentions对实体之间的关系很重要
(2) 实体对中实体的关系可以通过节点间的路径来表示,而不是基于节点

2.2.1 结构

节点:
(1)Mention node
与实体相关的mention的word embedding的平均
(2)Entity node
该实体的所有mention node的平均
(3)Sentence node
句子中的word embedding平均

连线: M,E,S:Mention,Entity,Sentence
(1)MM 同一个Sentence中的两个mention
(2)ME
(3)MS
(4)ES
(5)SS

![EoG.png]

2.2.2 算法

进行EoG算法,然后得到实体到实体的边的表示:
(1) 两个实体节点,选择其中的一个节点作为中间节点,然后,该路径的两条边通过神经网络,然后得到了这条路径的表示。
(2) 如果在实体之间已经存在了路径的表示,那么,将所有的路径与通过路径的两条边进行混合
(3) 将上面的步骤进行多次,就得到了混合后的实体到实体的边表示

最后,通过它进行分类。

2.3 GAIN

GAIN图聚合推理网络继承了EoG模型,三个问题:
(1) 同一个关系的主和宾可能位于不同的句子里面,无法通过一个句子来得到关系
(2) 同一个实体可能出现在不同的句子里面就,所以需要句子间的信息来表示实体
(3) 有的关系需要逻辑推理
得到了新的GAIN模型

这个模型包含两个图结构:
(1) hMG (heterogeneous mention-level graph)异构mention级别图
针对文档中不同mentions之间的互相关系

node:mention node 和 document node
(1) mention node 表示每一个mention
(2) document node 虚拟节点,对document信息,中继节点,有利于交互
edge:intra-entity edge,inter-entity edge,document edge
(1) intra-entity edge 同一个entity的mention
(2) inter-entity edge 一个句子内的不同entity的mention
(3) document edge 所有mention和document node连接
然后使用GCN得到mention的文档级表示,将每个节点的所有层的表示都concat,作为节点的最终表示

(2) EG (entity-level graph)实体级别图
用所有的mention的表示平均作为entity的表示
根据路径推理机制来推理实体对之间的关系,能够允许模型实现多跳关系推理
将相同entity的hMG中mention融合

模型分为4个部分:
(1) encoding module:
输入 word embedding,entity type,coreference type
通过encoding得到这一层的输出。
(2) mention-level graph aggregation module

(3) entity-level graph inference module
(4) classification module

Ubuntu之文件编码类型

0 概述

在Ubuntu系统中,常常会发现中文的文档出现乱码的问题,这是由于文件编码问题所导致的。为此,本篇文档是关于文档的编码类型而编写。

1 操作

1
file -i filename

CRF详解

CRF详解由下面的部分组成
1.公式
1.1 log线性模型
1.2 MEMMs
1.3 CRFs
2.代码

1.公式

这里主要是关于模型的原理

1.1 log线性模型

1.2 MEMMs

1.3 CRFs

2.代码

Python中tornado使用说明

tornado是一个网络具有异步功能的网络库。样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")

if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()

运行上面的程序之后,然后打开浏览器输入:

1
localhost:8888

URL相关

1
protocol :// hostname[:port] / path / [;parameters] [?query] # fragment

protocol 协议
hostname 主机名
port 端口号
path 路径
parameters 参数
query 查询
fragment 信息片段

1
2
self.get_argument("text")
localhost:12308/spo_extract?text=你好

Get和post

都是向服务器提交数据,而且从服务器获取数据

1.区别:
get通过地址栏传输
post通过报文传输

2.传送长度:
get的参数有长度限制,受限于url长度
post没有限制

3.TCP数据包
GET产生一个
POST产生2个
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

FAQ

端口冲突(Address already in use)解决方法

  1. 我们在后端开发的过程中往往会在没有正常关闭某个正在执行的脚本或者程序而是直接关闭了Terminal(终端)或是通过其他方式的异常关闭导致了之前的端口实际上仍未被释放,这时候倘若我门想要再使用这个端口,就会抛出 “error:[Errno 98] Address already in use” 这样的异常。

  2. 这时候我们只需要找到正在利用这个端口的进程,并得到这个进程的PID,杀死这个PID对应的这个进程,就能够有效释放被占用的端口,后续再使用的时候就不会再抛出端口已经被占用的异常信息。

  3. 找到被占用的指定端口号所对应的进程信息并呈现,xxx处填写对应要查找的端口号:
    sudo lsof -i:xxx

4.关闭这个进程,xxx为PID:
sudo kill -9 xxx

transformers使用教程

参考资料:
huggingface transformers git
https://github.com/huggingface/transformers

示例:

1
2
3
4
5
6
>>> from transformers import pipeline

# Allocate a pipeline for sentiment-analysis
>>> classifier = pipeline('sentiment-analysis')
>>> classifier('We are very happy to include pipeline into the transformers repository.')
[{'label': 'POSITIVE', 'score': 0.9978193640708923}]
1
2
3
4
5
6
7
8
9
>>> from transformers import pipeline

# Allocate a pipeline for question-answering
>>> question_answerer = pipeline('question-answering')
>>> question_answerer({
... 'question': 'What is the name of the repository ?',
... 'context': 'Pipeline have been included in the huggingface/transformers repository'
... })
{'score': 0.5135612454720828, 'start': 35, 'end': 59, 'answer': 'huggingface/transformers'}

To download and use any of the pretrained models on your given task, you just need to use those three lines of codes (PyTorch version):

1
2
3
4
5
6
7
>>> from transformers import AutoTokenizer, AutoModel

>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> model = AutoModel.from_pretrained("bert-base-uncased")

>>> inputs = tokenizer("Hello world!", return_tensors="pt")
>>> outputs = model(**inputs)

or for TensorFlow:

1
2
3
4
5
6
7
>>> from transformers import AutoTokenizer, TFAutoModel

>>> tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
>>> model = TFAutoModel.from_pretrained("bert-base-uncased")

>>> inputs = tokenizer("Hello world!", return_tensors="tf")
>>> outputs = model(**inputs)

GRU说明

参考:
https://zhuanlan.zhihu.com/p/32481747

GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。

GRU和LSTM在很多情况下实际表现上相差无几,那么为什么我们要使用新人GRU(2014年提出)而不是相对经受了更多考验的LSTM(1997提出)呢。

相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。

配置文件参考说明

在很多情况下,我们需要将一些参数保存在程序的外面,也就是作为配置文件进行保存,或者,提前写好配置文件,从中读取必须的参数,方便实现。

但是有很多的可以作为配置文件:
YAML
JSON
好像没有注释
ini
XML