Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
KnowledgeGraph-IE_EE
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
20210828028
KnowledgeGraph-IE_EE
Commits
9d302ad8
Commit
9d302ad8
authored
Mar 09, 2022
by
20210828028
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DuEE report
parent
ee0a5a49
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
245 additions
and
0 deletions
+245
-0
DuEE_report.md
+245
-0
No files found.
DuEE_report.md
0 → 100644
View file @
9d302ad8
# 项目介绍
篇章级事件抽取是在DuEE-Fin数据集上进行的事件抽取,事件抽取的Pipeline模型可以分为两部分:触发词抽取模型和论元抽取模型。在本项目中,触发词抽取模型和论元抽取模型都是基于Ernie的序列标注模型,并采用BIO标注方式。篇章级事件抽取还包括枚举分类任务,对于枚举分类任务,这里采用基于Ernie的文本分类模型进行分类。篇章级事件抽取与句子级事件抽取相比,模型和数据处理基本相同,不同之处在于篇章级事件抽取多一个枚举分类任务,所以下文以篇章级事件抽取为例对项目进行介绍。
## 数据集
篇章级事件抽取: DuEE-Fin
句子级事件抽取:DuEE 1.0
# 数据处理
下载数据集,解压存放于data/DuEE-Fin目录下,将原始数据预处理成序列标注格式数据。 处理之后的数据同样放在data/DuEE-Fin下, 触发词识别数据文件存放在data/DuEE-Fin/role下, 论元角色识别数据文件存放在data/DuEE-Fin/trigger下。 枚举分类数据存放在data/DuEE-Fin/enum下。
## schema 预处理
将文件
`duee_event_schema.json`
放到
`./con f/DuEE-fin`
文件夹下,改名为
`event_shceme.json`
。
`event_shceme.json`
内容摘要如下:
```
text
{"role_list": [{"role": "质押方"}, {"role": "披露时间"}, {"role": "质权方"}, {"role": "质押物"}, {"role": "质押股票/股份数量"}, {"role": "事件时间"}, {"role": "质押物所属公司"}, {"role": "质押物占总股比"}, {"role": "质押物占持股比"}], "event_type": "解除质押", "id": "66fd6541f6e81ecbc9df69ac377d8d8f"}
{"role_list": [{"role": "回购方"}, {"role": "披露时间"}, {"role": "回购股份数量"}, {"role": "每股交易价格"}, {"role": "占公司总股本比例"}, {"role": "交易金额"}, {"role": "回购完成时间"}], "event_type": "股份回购", "id": "ce7923d3e82610c3f1692f98193426d6"}
{"role_list": [{"role": "股票简称"}, {"role": "披露时间"}, {"role": "交易股票/股份数量"}, {"role": "每股交易价格"}, {"role": "交易金额"}, {"role": "交易完成时间"}, {"role": "减持方"}, {"role": "减持部分占所持比例"}, {"role": "减持部分占总股本比例"}], "event_type": "股东减持", "id": "42774ed6cc845ce2bbcbce242deb8994"}
{"role_list": [{"role": "公司名称"}, {"role": "披露时间"}, {"role": "财报周期"}, {"role": "净亏损"}, {"role": "亏损变化"}], "event_type": "亏损", "id": "83c21d96a46a78c2e3620fd75668675d"}
```
### trigger tags预处理
-
处理过程
将文件当中的event_type进行统计,
对每个event_type生成B-event_type和I-event_type类别,再加上一个O类别,分别进行编码。
处理之后生成
`./con f/DuEE-fin/trigger_tag.dict`
文件。
文件摘要如下:
```
txt
0 B-解除质押
1 I-解除质押
2 B-股份回购
3 I-股份回购
4 B-股东减持
5 I-股东减持
6 B-亏损
7 I-亏损
8 B-中标
9 I-中标
10 B-高管变动
11 I-高管变动
12 B-企业破产
13 I-企业破产
14 B-股东增持
15 I-股东增持
16 B-被约谈
17 I-被约谈
18 B-企业收购
19 I-企业收购
20 B-公司上市
21 I-公司上市
22 B-企业融资
23 I-企业融资
24 B-质押
25 I-质押
26 O
```
### role tags预处理
-
处理过程
将文件当中的role进行统计,
对每个role生成B-role和I-role类别,再加上一个O类别,分别进行编码。
处理之后生成
`./con f/DuEE-fin/role_tag.dict`
文件。
文件摘要如下:
```
txt
0 B-质押方
1 I-质押方
2 B-披露时间
3 I-披露时间
4 B-质权方
5 I-质权方
6 B-质押物
7 I-质押物
8 B-质押股票/股份数量
9 I-质押股票/股份数量
10 B-事件时间
11 I-事件时间
12 B-质押物所属公司
13 I-质押物所属公司
14 B-质押物占总股比
15 I-质押物占总股比
16 B-质押物占持股比
17 I-质押物占持股比
18 B-回购方
19 I-回购方
20 B-回购股份数量
21 I-回购股份数量
22 B-每股交易价格
23 I-每股交易价格
24 B-占公司总股本比例
25 I-占公司总股本比例
26 B-交易金额
27 I-交易金额
28 B-回购完成时间
```
### enum tags预处理
统计
`enum_items`
类别,并分别进行编码。处理之后生成
`./con f/DuEE-fin/enum_tag.dict`
文件。
文件摘要如下:
```
txt
0 筹备上市
1 暂停上市
2 正式上市
3 终止上市
```
### 预处理之后的数据文件夹结构

## 数据预处理
###数据预览
```
text
原标题:万讯自控(7.490,-0.10,-1.32%):傅宇晨解除部分股份质押、累计质押比例为39.55%,,,,来源:每日经济新闻,每经ai快讯,万讯自控(sz,300112,收盘价:7.49元)6月3日下午发布公告称,公司接到股东傅宇晨的通知,获悉傅宇晨将其部分股份办理了质押业务。,截至本公告日,傅宇晨共持有公司股份5790.38万股,占公司总股本的20.25%;累计质押股份2290万股,占傅宇晨持有公司股份总数的39.55%,占公司总股本的8.01%。 OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOB-质押I-质押OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
```
### 自定义数据集
对
`paddle.io.Dataset`
进行继承,实现一个
`DuEventExtraction`
类
1.
属性
使用
`'\002'`
对文本和label进行分割,分割之后的结果保存在类的
`word_ids`
和
`label_ids`
属性当中,
`word_ids`
的每一个元素都是一个样本的文本分割之后的list,
`label_ids`
的每一个元素都是一个样本的BIO label分割之后的list。同时导入schema预处理之后生成的
`*.dict `
文件作为Dataset的
`label_vocab`
属性。
2.
__len
\_\_
和__getitem
\_\_
方法的实现:
__len
\_\_
方法返回数据量,__getitem
\_\_
方法根据索引返回单个样本的word_ids和label_ids。
### 数据集预处理
-
对于文本
```
python
from
paddlenlp.transformers
import
ErnieTokenizer
tokenizer
=
ErnieTokenizer
.
from_pretrained
(
"ernie-1.0"
)
encoded_text
=
tokenizer
(
text
=
"请输入测试样例"
,
return_length
=
True
,
return_position_ids
=
True
)
```
tokenizer的输出包含以下几个部分:
```
txt
• input_ids: 表示输入文本的token ID。
• token_type_ids: 表示对应的token属于输入的第一个句子还是第二个句子。(Transformer类预训练模型支持单句以及句对输入。)
• seq_len: 表示输入句子的token个数。
• input_mask:表示对应的token是否一个padding token。由于一个batch中的输入句子长度不同,所以需要将不同长度的句子padding到统一固定长度。1表示真实输入,0表示对应token为padding token。
• position_ids: 表示对应token在整个输入序列中的位置。
```
保留input_ids, token_type_ids, seq_len这三个部分,并进行Pad处理,将不同样本的input_ids, token_type_ids, seq_len处理成相同长度。这里可以使用paddle的collate写法。
```
python
batchify_fn
=
lambda
samples
,
fn
=
Tuple
(
Pad
(
axis
=
0
,
pad_val
=
tokenizer
.
vocab
[
tokenizer
.
pad_token
],
dtype
=
'int32'
),
# input ids
Pad
(
axis
=
0
,
pad_val
=
tokenizer
.
vocab
[
tokenizer
.
pad_token
],
dtype
=
'int32'
),
# token type ids
Stack
(
dtype
=
'int64'
),
# sequence lens
Pad
(
axis
=
0
,
pad_val
=
ignore_label
,
dtype
=
'int64'
)
# labels
):
fn
(
list
(
map
(
trans_func
,
samples
)))
```
最终模型的输入为input_ids, token_type_ids这两个部分。
```
python
from
paddlenlp.transformers
import
ErnieForTokenClassification
model
=
ErnieForTokenClassification
.
from_pretrained
(
"ernie-1.0"
,
num_classes
=
len
(
label_map
))
model
=
paddle
.
DataParallel
(
model
)
logits
=
model
(
input_ids
,
token_type_ids
)
.
reshape
(
[
-
1
,
train_ds
.
label_num
])
```
-
对于labels
使用
`DuEventExtraction`
类的
`label_vocab`
将label编码为id
# 模型
## 触发词识别模型
触发词抽取模型是整体模型的一部分,该部分主要是给定事件类型,识别句子中出现的事件触发词对应的位置以及对应的事件类别
###模型
该模型是基于ERNIE开发序列标注模型,模型原理图如下:

上述样例中通过模型识别出:
```
txt
1)触发词"收购",并分配标签"B-企业收购"、“I-企业收购”、“I-企业收购”;
```
###损失函数
使用交叉熵
`paddle.nn.loss.CrossEntropyLoss`
作为损失函数
###优化器
使用
`paddle.optimizer.AdamW`
作为优化器
## 论元识别模型
### 模型
论元识别模型训练与触发词模型训练相同,
该部分主要是识别出事件中的论元以及对应论元角色,模型原理图如下:

上述样例中通过模型识别出:
```
txt
1)论元"新东方",并分配标签"B-收购方"、“I-收购方”、“I-收购方”;
2)论元"东方优播", 并分配标签"B-被收购方"、“I-被收购方”、“I-被收购方”、“I-被收购方”。
```
最终识别出文本中包含的论元角色和论元对是
<
收购方,新东方
>
、
<
被收购方,东方优播
>
###损失函数
与触发词识别模型相同,使用交叉熵
`paddle.nn.loss.CrossEntropyLoss`
作为损失函数
###优化器
与触发词识别模型相同,使用
`paddle.optimizer.AdamW`
作为优化器
## 枚举分类
### 模型
基于ERNIE序列分类模型
`paddlenlp.transformers.ErnieForSequenceClassification`
来进行枚举分类。枚举角色类型为环节。模型原理图如下:

给定文本,对文本进行分类,得到不同类别上的概率 筹备上市(0.8)、暂停上市(0.02)、正式上市(0.15)、终止上市(0.03)
###损失函数
与触发词识别模型相同,使用交叉熵
`paddle.nn.loss.CrossEntropyLoss`
作为损失函数
###优化器
与触发词识别模型相同,使用
`paddle.optimizer.AdamW`
作为优化器
# 效果

# 优化相关思考
1.
换其他模型
2.
GRU-CRF
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment