diff --git a/README.md b/README.md index 77760f6..4b657b5 100644 --- a/README.md +++ b/README.md @@ -4,46 +4,62 @@ DeepKE 是基于 Pytorch 的深度学习中文关系抽取处理套件。 ## 环境依赖: -- python >= 3.6 -- torch >= 1.0 -- jieba >= 0.38 -- matplotlib >= 3.0 -- pytorch_transformers >= 1.2 -- scikit_learn >= 0.20 +> python >= 3.6 +- torch >= 1.2 +- hydra-core >= 0.11 +- tensorboard >= 2.0 +- matplotlib >= 3.1 +- transformers >= 2.0 +- jieba >= 0.39 +- pyhanlp >= 0.1.57 ## 主要目录 ``` -├── bert_pretrained # 使用 bert 时存放的预训练模型参数 -│ ├── vocab.txt # BERT 模型词表 -│ ├── config.json # BERT 模型结构的配置文件 -│ ├── pytorch_model.bin # 预训练模型参数 -├── checkpoints # 保存训练后的模型参数 -├── data # 数据目录 -│ ├── origin # 训练使用的原始数据集 -│ │ ├── train.csv # 训练数据集 -│ │ ├── test.csv # 测试数据集 -│ │ ├── relation.txt # 关系种类 -├── deepke -│ ├── model # 模型目录 -│ │ ├── BasicModule.py # 模型基本配置 -│ │ ├── Embedding.py # Embeddding 模块 -│ │ ├── CNN.py # CNN & PCNN 模型 -│ │ ├── RNN.py # BiLSTM 模型 -│ │ ├── GCN.py # GCN 模型 -│ │ ├── Transformer.py # Transformer 模型 -│ │ ├── Capsule.py # Capsule 模型 -│ │ ├── LM.py # 语言预训练 模型 -│ ├── config.py # 配置文件 -│ ├── vocab.py # 词汇表构建函数 -│ ├── preprocess.py # 训练前预处理数据 -│ ├── dataset.py # 训练时批处理输入数据 -│ ├── trainer.py # 训练迭代函数 -│ ├── utils.py # 工具函数 -├── main.py # 主入口文件 -├── README.md # read me 文件 +├── conf # 配置文件夹 +│ ├── config.yaml # 配置文件主入口 +│ ├── preprocess.yaml # 数据预处理配置 +│ ├── train.yaml # 训练过程参数配置 +│ ├── hydra # log 日志输出目录配置 +│ ├── embedding.yaml # embeding 层配置 +│ ├── model # 模型配置文件夹 +│ │ ├── cnn.yaml # cnn 模型参数配置 +│ │ ├── rnn.yaml # rnn 模型参数配置 +│ │ ├── capsule.yaml # capsule 模型参数配置 +│ │ ├── transformer.yaml # transformer 模型参数配置 +│ │ ├── gcn.yaml # gcn 模型参数配置 +│ │ ├── lm.yaml # lm 模型参数配置 +├── pretrained # 使用如 bert 等语言预训练模型时存放的参数 +│ ├── vocab.txt # BERT 模型词表 +│ ├── config.json # BERT 模型结构的配置文件 +│ ├── pytorch_model.bin # 预训练模型参数 +├── data # 数据目录 +│ ├── origin # 训练使用的原始数据集 +│ │ ├── train.csv # 训练数据集 +│ │ ├── valid.csv # 验证数据集 +│ │ ├── test.csv # 测试数据集 +│ │ ├── relation.csv # 关系种类 +│ ├── out # 预处理数据后的存放目录 +├── module # 可复用模块 +│ ├── CNN.py # cnn for nlp +│ ├── CNN.py # cnn for nlp +├── models # 模型目录 +│ ├── BasicModule.py # 模型基本配置 +│ ├── PCNN.py # PCNN / CNN 模型 +│ ├── PCNN.py # PCNN / CNN 模型 +├── test # pytest 测试目录 +├── utils # 常用工具函数目录 +├── metrics.py # 评测指标文件 +├── serializer.py # 预处理数据过程序列化字符串文件 +├── preprocess.py # 训练前预处理数据文件 +├── vocab.py # token 词表构建函数文件 +├── dataset.py # 训练过程中批处理数据文件 +├── trainer.py # 训练验证迭代函数文件 +├── main.py # 主入口文件(训练) +├── predict.py # 测试入口文件(测试) +├── README.md # read me 文件 ``` ## 快速开始 @@ -51,42 +67,65 @@ DeepKE 是基于 Pytorch 的深度学习中文关系抽取处理套件。 数据为 csv 文件,样式范例为: -sentence|relation|head|head_type|head_offset|tail|tail_type|tail_offset -:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---: -谢万松,字树人,湖北省武汉市人,武汉钢铁集团公司联合焦化公司退体职工,生于1940年|出生地|谢万松|人物|0|湖北省武汉市|地点|8 -《娘家的故事第二部》是张玲执导,林在培、何赛飞等主演的电视剧|导演|娘家的故事第二部|影视作品|1|张玲|人物|11 -九玄珠是在纵横中文网连载的一部小说,作者是龙马|连载网站|九玄珠|网络小说|0|纵横中文网|网站|5 -个人简介梁信强,男,2010年广州亚运会中国澳门代表团成员|国籍|梁信强|人物|4|中国|国家|20 +sentence|relation|head|head_offset|tail|tail_offset +:---:|:---:|:---:|:---:|:---:|:---: +《岳父也是爹》是王军执导的电视剧,由马恩然、范明主演。|导演|岳父也是爹|1|王军|8 +《九玄珠》是在纵横中文网连载的一部小说,作者是龙马。|连载网站|九玄珠|1|纵横中文网|7 +提起杭州的美景,西湖总是第一个映入脑海的词语。|所在城市|西湖|8|杭州|2 - 安装依赖: `pip install -r requirements.txt` -- 存放数据:在 `data/origin` 文件夹下存放训练数据。训练文件主要有三个文件。 +- 存放数据:在 `data/origin` 文件夹下存放训练数据。训练文件主要有三个文件。更多数据建议使用百度数据库中[Knowledge Extraction](http://ai.baidu.com/broad/download)。 - `train.csv`:存放训练数据集 - `valid.csv`:存放验证数据集 - - `relation.txt`:存放关系种类 + - `test.csv`:存放测试数据集 + + - `relation.csv`:存放关系种类 - 开始训练:python main.py -- 每次训练的结果会保存在 `checkpoints` 文件夹下,格式为:`{model_name}_{epoch}_{time}.pth`。 +- 每次训练的结果会保存在 `checkpoints` 文件夹下,格式为:`{model_name}_{epoch}.pth`。 ## 具体介绍 见 [wiki](https://github.com/zjunlp/deepke/wiki) -## 备注 +## 备注(常见问题) -使用语言预训练模型时,要提前下载好预训练好的参数,放到 `pretrained` 文件夹内。 +1. 中文英文在数据预处理上有很多不同之处,`serializer.py` 用来专门序列化句子为 tokens。中文分词使用的是 jieba 分词。 -另外数据量较小时,直接使用如12层的bert,效果并不理想,反而层数调低些收敛更快效果更好。如调整到3、6层数,具体看训练的数据量大小。 + - 英文序列化要求:大小写、特殊标点字符处理、特殊英文字符是否分词、是否做 word-piece 处理等。 + + - 中文序列化要求:是否分词、遇到英文字母是否大小写处理、是否将英文单词拆分按照单独字母处理等。 + +1. PCNN 预处理时,需要按照 head tail 的位置,将句子分为三段,做 piece wise max pooling。如果句子本身无法分为三段,就无法用统一的预处理方式处理句子。 + + - 比如句子为:`杭州西湖`,不管怎么分隔都不能分隔为三段。 + + - 原文分隔三段的方式为:[...head, ..., tail....],当然也可以分隔为:[..., head...tail, ....],或者 [...head, ..., tail....] 等。具体效果没多少区别。 + +1. PCNN 为什么不比 CNN 好,甚至更差?? + + - 这个确实如此!本人在跑百度的数据集,也发现 PCNN 效果并没有想象中的比 CNN 有提升,甚至大多时候都不如 CNN 那种直接 max pooling的结果。百度的 [ARNOR](https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/Research/ACL2019-ARNOR) 结果也是 PCNN 并不一定比 CNN 好。 + +1. 使用语言预训练模型时,在线安装下载模型比较慢,更建议提前下载好,存放到 `pretrained` 文件夹内。具体存放文件要求见文件夹内的 `readme.md`。 + +1. 数据量较小时,直接使用如12层的 BERT,效果并不理想。此时可采取一些处理方式改善效果: + + - 数据量较小时层数调低些,如设置为2、3层。 + + - 按照 BERT 训练方式,对新任务语料按照语言模型方式预训练。 + +1. 目前在单句上使用 GCN 时,需要先做句法分析,构建出词语之间的邻接矩阵(句法树相邻的边值设为1,不相邻为0)。目前使用的是 `pyhanlp` 工具构建语法树。这个工具需要按照 java 包,具体使用见 [pyhanlp]https://github.com/hankcs/pyhanlp) 的介绍。 ## 后续工作 -- [ ] 重构代码,将模型可复用部分单独提取出来 +- [x] 重构代码,将模型可复用部分单独提取出来 - [ ] 添加经典实体关系联合抽取模型 - [ ] 添加 web 页面,以供预测输入句子信息可视化 diff --git a/conf/model/lm.yaml b/conf/model/lm.yaml index acaedfb..bc823dc 100644 --- a/conf/model/lm.yaml +++ b/conf/model/lm.yaml @@ -2,7 +2,7 @@ model_name: lm # lm_name = 'bert-base-chinese' # download usage # cache file usage -#lm_file: 'bert_pretrained' +#lm_file: 'pretrained' # 当使用预训练语言模型时,该预训练的模型存放位置 lm_file: '/Users/leo/transformers/bert-base-chinese' diff --git a/bert_pretrained/readme.md b/pretrained/readme.md similarity index 100% rename from bert_pretrained/readme.md rename to pretrained/readme.md diff --git a/requirements.txt b/requirements.txt index 1ae0f13..64dcdf7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -torch>=1.0 -tensorboard>=2.0 -matplotlib>=3.1.0 -transformers>=2.0 +torch>=1.2 hydra-core>=0.11 +tensorboard>=2.0 +matplotlib>=3.1 +transformers>=2.0 jieba>=0.39 -pyhanlp \ No newline at end of file +pyhanlp>=0.1.57 \ No newline at end of file