Deep Learning based
Knowledge Extraction Toolkit

一个支持低资源、长篇章、多模态的开源知识抽取工具

简介

为促进中文领域的知识图谱构建和方便用户使用,DeepKE提供了预训练好的支持cnSchema的特别版DeepKE-cnSchema,支持开箱即用的中文实体抽取和关系抽取等任务,可抽取50种关系类型和28种实体类型,其中实体类型包含了通用的人物、地点、城市、机构等类型,关系类型包括了常见的祖籍、出生地、国籍、朝代等类型。

实体识别

DeepKE(NER),  Roberta-wwm-ext,  Chinese

Google下载

百度网盘下载(密码u022)

关系抽取

DeepKE(RE),  Roberta-wwm-ext,  Chinese

Google下载

百度网盘下载(密码29oe)

中文模型下载

对于实体识别和关系抽取任务分别提供了基于RoBERTa-wwm-ext, ChineseBERT-wwm, Chinese的预训练训模型,方便用户开箱即用。

模型使用说明

实体识别模型中,以Pytorch版DeepKE(NER), RoBERTa-wwm-ext, Chinese为例,下载后对zip文件进行解压可得到左图文件结构。


PyTorch版本则包含pytorch_model.bin, config.json, vocab.txt文件。


关系抽取模型中,以Pytorch版DeepKE(RE), RoBERTa-wwm-ext, Chinese为例,下载后为.pth文件,是可直接使用的模型。

实体识别


模型

P

R

F1

DeepKE(NER), RoBERTa-wwm-ext, Chinese

  0.80  

 0.86 

 0.83 

DeepKE(NER), BERT-wwm, Chinese

0.78

0.86

0.82

关系抽取


模型

P

R

F1

DeepKE  (RE), RoBERTa-wwm-ext, Chinese

  0.88  

  0.86  

  0.87  

DeepKE  (RE), BERT-wwm, Chinese

0.87

0.86

0.86

中文基线效果

DeepKE基于chinese-roberta-wwm-extchinese-bert-wwm进行微调得到DeepKE-cnSchema(NER)DeepKE-cnSchema(RE)模型。模型所使用的超参数均为预定义的参数,在测试数据集上效果如左图所示。

支持Schema类型

DeepKE(cnSchema) 特别版为支持中文领域知识图谱构建推出的开箱即用知识抽取模型。cnSchema是面向中文信息处理,利用先进的知识图谱、自然语言处理和机器学习技术,融合结构化与文本数据,支持快速领域知识建模,支持跨数据源、跨领域、跨语言的开放数据自动化处理,为智能机器人、语义搜索、智能计算等新兴应用市场提供schema层面的支持与服务。

目前,DeepKE(cnSchema) 支持的Schema类型如下所示

实体Schema
  序号     实体类型     序号     实体类型     序号     实体类型     序号     实体类型  
1 cns:人物 2 cns:影视作品 3 cns:目 4 cns:生物
5 cns:Number 6 cns:Date 7 cns:国家 8 cns:网站
9 cns:网络小说 10 cns:图书作品 11 cns:歌曲 12 cns:地点
13 cns:气候 14 cns:行政区 15 cns:Text 16 cns:历史人物
17 cns:学校 18 cns:企业 19 cns:出版社 20 cns:书籍
21 cns:音乐专辑 22 cns:城市 23 cns:经典 24 cns:电视综艺
25 cns:机构 26 cns:作品 27 cns:语言 28 cns:学科专业
关系Schema
  序号     头实体类型     尾实体类型     关系     序号     头实体类型     尾实体类型     关系     序号     头实体类型     尾实体类型     关系  
1 cns:地点 cns:人物 cns:祖籍 2 cns:人物 cns:人物 cns:父亲 3 cns:地点 cns:企业 cns:总部地点
4 cns:地点 cns:人物 cns:出生地 5 cns:目 cns:生物 cns:目 6 cns:Number cns:行政区 cns:面积
7 cns:Text cns:机构 cns:简称 8 cns:Date cns:影视作品 cns:上映时间 9 cns:人物 cns:人物 cns:妻子
10 cns:音乐专辑 cns:歌曲 cns:所属专辑 11 cns:Number cns:企业 cns:注册资本 12 cns:城市 cns:国家 cns:首都
13 cns:人物 cns:影视作品 cns:导演 14 cns:Text cns:历史人物 cns:字 15 cns:Number cns:人物 cns:身高
16 cns:企业 cns:影视作品 cns:出品公司 17 cns:Number cns:学科专业 cns:修业年限 18 cns:Date cns:人物 cns:出生日期
19 cns:人物 cns:影视作品 cns:制片人 20 cns:人物 cns:人物 cns:母亲 21 cns:人物 cns:影视作品 cns:编辑
22 cns:国家 cns:人物 cns:国籍 23 cns:人物 cns:影视作品 cns:编剧 24 cns:网站 cns:网站小说 cns:连载网络
25 cns:人物 cns:人物 cns:丈夫 26 cns:Text cns:历史人物 cns:朝代 27 cns:Text· cns:人物 cns:民族
28 cns:Text cns:历史人物 cns:朝代 29 cns:出版社 cns:书籍 cns:出版社 30 cns:人物 cns:电视综艺 cns:主持人
31 cns:Text cns:学科专业 cns:专业代码 32 cns:人物 cns:歌曲 cns:歌手 33 cns:人物 cns:歌曲 cns:作曲
34 cns:人物 cns:网络小说 cns:主角 35 cns:人物 cns:企业 cns:董事长 36 cns:Date cns:机构 cns:成立时间
37 cns:学校 cns:人物 cns:毕业院校 38 cns:Number cns:机构 cns:占地面积 39 cns:语言 cns:国家 cns:官方语言
40 cns:Text cns:行政区 cns:邮政编码 41 cns:Number cns:行政区 cns:人口数量 42 cns:Date cns:企业 cns:成立日期
43 cns:人物 cns:图书作品 cns:作者 44 cns:Date cns:企业 cns:成立日期 45 cns:人物 cns:歌曲 cns:作曲
46 cns:气候 cns:气候 cns:行政区 47 cns:人物 cns:电视综艺 cns:嘉宾 48 cns:人物 cns:影视作品 cns:主演
49 cns:作品 cns:影视作品 cns:改编自 50 cns:人物 cns:企业 cns:创始人

模型快速使用

实体识别(NER)


用户可以直接下载模型进行使用,具体流程如下:

1. 将下载文件夹命名为checkpoints

2. 修改源码中的get_labels函数,返回的标签改为所给type.txt中所用到的标签


  def get_labels(self):
      return ['O', 'B-YAS', 'I-YAS', 'B-TOJ', 'I-TOJ', 'B-NGS', 'I-NGS',
              'B-QCV', 'I-QCV', 'B-OKB', 'I-OKB', 'B-BQF', 'I-BQF', 'B-CAR',
              'I-CAR', 'B-ZFM', 'I-ZFM', 'B-EMT', 'I-EMT', 'B-UER', 'I-UER',
              'B-QEE', 'I-QEE', 'B-UFT', 'I-UFT', 'B-GJS', 'I-GJS', 'B-SVA',
              'I-SVA', 'B-ANO', 'I-ANO', 'B-KEJ', 'I-KEJ', 'B-ZDI', 'I-ZDI',
              'B-CAT', 'I-CAT', 'B-GCK', 'I-GCK', 'B-FQK', 'I-FQK', 'B-BAK',
              'I-BAK', 'B-RET', 'I-RET', 'B-QZP', 'I-QZP', 'B-QAQ', 'I-QAQ',
              'B-ZRE', 'I-ZRE', 'B-TDZ', 'I-TDZ', 'B-CVC', 'I-CVC', 'B-PMN',
              'I-PMN', '[CLS]', '[SEP]']
							

3. 修改predict.yaml中的参数text为需要预测的文本

4. 进行预测,需要预测的文本及实体对通过终端输入给程序


  python predict.py
							

使用训练好的模型,只需输入句子“《星空黑夜传奇》是连载于起点中文网的网络小说,作者是啤酒的罪孽”,运行 ``python predict.py``后可得到结果,结果显示“星空黑夜传奇”实体类型为“网络小说”,“起点中文网”实体类型为为“网站”,“啤酒的罪孽”实体类型为“人物。

修改predict.yaml中的参数text为需要预测的文本


  text=“《星空黑夜传奇》是连载于起点中文网的网络小说,作者是啤酒的罪孽”
							

最终输出结果


  NER句子:
  《星空黑夜传奇》是连载于起点中文网的网络小说,作者是啤酒的罪孽
  NER结果:
  [('星','B-UER'),('空','I-UER'),('黑','I-UER'),('夜','I-UER'),('传','I-UER'),
   ('奇','I-UER'),('起','B-ZFM'),('点','I-ZFM'),('中','I-ZFM'),('文','I-ZFM')
   ('网','I-ZFM'),('啤','B-YAS'),('酒','I-YAS'),('的','I-YAS'),('罪','I-YAS'),
   ('孽','I-YAS')]
							

关系抽取(RE)


用户可以直接下载模型进行使用,具体流程如下:

1. 修改predict.yaml中的参数fp为下载文件的路径,embedding.yamlnum_relations为51 (关系个数)

2. 进行预测,需要预测的文本及实体对通过终端输入给程序


  python predict.py
							

使用训练好的模型,运行 ``python predict.py``后,输入句子“歌曲《人生长路》出自刘德华国语专辑《男人的爱》,由李泉作词作曲,2001年出行发版”,给定实体对为“男人的爱”和“人生长路”,即可抽取出关系“所属专辑”。

predict.py中的_get_predict_instance函数改成如下范例,即可修改文本进行预测


  def _get_predict_instance(cfg):
      flag = input('是否使用范例[y/n],退出请输入: exit .... ')
      flag = flag.strip().lower()
      if flag == 'y' or flag == 'yes':
          sentence = '歌曲《人生长路》出自刘德华国语专辑《男人的爱》,由李泉作词作曲
                      2001年出行发版'
          head = '男人的爱'
          tail = '人生长路'
          head_type = ''
          tail_type = ''
      elif flag == 'n' or flag == 'no':
          sentence = input('请输入句子:')
          head = input('请输入句中需要预测关系的头实体:')
          head_type = input('请输入头实体类型(可以为空,按enter跳过):')
          tail = input('请输入句中需要预测关系的尾实体:')
          tail_type = input('请输入尾实体类型(可以为空,按enter跳过):')
      elif flag == 'exit':
          sys.exit(0)
      else:
          print('please input yes or no, or exit!')
          _get_predict_instance()
							
      instance = dict()
      instance['sentence'] = sentence.strip()
      instance['head'] = head.strip()
      instance['tail'] = tail.strip()
      if head_type.strip() == '' or tail_type.strip() == '':
          cfg.replace_entity_with_type = False
          instance['head_type'] = 'None'
          instance['tail_type'] = 'None'
      else:
          instance['head_type'] = head_type.strip()
          instance['tail_type'] = tail_type.strip()
							
      return instance
							

最终输出结果


  “男人的爱”和“人生长路”在句中关系为“所属专辑”,置信度为0.99
							

联合三元组抽取


用户可以先将上述模型下载至本地,然后使用example/triple中的代码进行三元组抽取。 如果单句中存在超过两个以上的实体数,可能在一些实体对中会存在预测不准确的问题,那是因为这些实体对并没有被加入训练集中进行训练,所以需要进一步判断,具体使用步骤如下:

1. 将conf文件夹中的predict.yaml中的text修改为预测文本,nerfp修改为NER模型文件夹地址,refp为RE模型地址

2. 进行预测


  python predict.py
							

期间将输出各个中间步骤结果,以输入文本此外网易云平台还上架了一系列歌曲,其中包括田馥甄的《小幸运》等为例

2.1 输出经过NER模型后得到结果


  [('田', 'B-YAS'), ('馥', 'I-YAS'), ('甄', 'I-YAS'), ('小', 'B-QEE'), ('幸', 'I-QEE'), ('运', 'I-QEE')]
							

2.2 输出进行处理后结果


  {'田馥甄': '人物', '小幸运': '歌曲'}
							

2.3 输出经过RE模型后得到结果


  "田馥甄" 和 "小幸运" 在句中关系为:"歌手",置信度为0.92。
							

2.4 输出jsonld格式化后结果


  {
    "@context": {
      "歌手": "https://baike.baidu.com/item/%E6%AD%8C%E6%89%8B/16693#viewPageContent"
    },
    "@id": "田馥甄",
    "歌手": {
      "@id": "小幸运"
    }
  }
							

自定义模型 (高级用户)

支持模型在自定义数据集上进行训练

实体识别(NER)


如果需要使用其他数据进行训练,步骤如下:

1. 下载自定义的数据集,将其放入命名为data的文件夹中

2. 将conf文件夹下train.yaml中的bert_model修改为指定模型,用户可以通过修改yaml文件选择不同的模型进行训练

3. 进行训练


  python run.py
				

关系抽取(RE)


如果需要使用其他模型进行训练,步骤如下:

1. 下载自定义的数据集,将其重命名为data

2. 将conf文件夹下train.yaml中的model_name改为lmlm.yaml中的lm_file修改为指定预训练模型,embedding.yamlnum_relations为关系的个数如51,用户可以通过修改yaml文件选择不同的模型进行训练

3. 进行训练


  python run.py
				

FAQ

Q:这个模型怎么用?


A:开箱即用,下载好模型按照使用说明就能够抽取预定义cnSchema包含的知识。

如果想抽取cnSchema之外的知识,可以使用高级版本自定义数据进行训练哦

Q:请问有其他cnSchema抽取模型提供吗?


A:很遗憾,我们暂时只能支持部分cnSchema的知识抽取,未来会发布更多的知识抽取模型。

Q:自己数据输入进去编码报错!


A:可能中文输入数据包含了不可见的特殊字符,这些字符无法被某些编码因而报错,您可以通过编辑器或其他工具预处理中文数据解决这一问题。

引用

如果本项目中的资源或技术对你的研究工作有所帮助,欢迎在论文中引用下述论文。


  @article{zhang2022deepke,
    title={DeepKE: A Deep Learning Based Knowledge Extraction Toolkit for Knowledge Base Population},
    author={Zhang, Ningyu and Xu, Xin and Tao, Liankuan and Yu, Haiyang and Ye, Hongbin and Xie, Xin and Chen, Xiang and Li, Zhoubo and Li, Lei and Liang, Xiaozhuan and others},
    journal={arXiv preprint arXiv:2201.03335},
    year={2022}
  }
								

免责声明

该项目中的内容仅供技术研究参考,不作为任何结论性依据。使用者可以在许可证范围内任意使用该模型,但我们不对因使用该项目内容造成的直接或间接损失负责。

问题反馈

如有问题,请在GitHub Issue中提交。