<a href="https://github.com/zjunlp/deepke"> <img src="https://github.com/zjunlp/DeepKE/raw/2.2.7/pics/logo.png" width="400"/></a>
<a href="http://deepke.zjukg.cn">
<img alt="Documentation" src="https://img.shields.io/badge/demo-website-blue">
</a>
<a href="https://pypi.org/project/deepke/#files">
<img alt="PyPI" src="https://img.shields.io/pypi/v/deepke">
</a>
<a href="https://github.com/zjunlp/DeepKE/blob/master/LICENSE">
<img alt="GitHub" src="https://img.shields.io/github/license/zjunlp/deepke">
</a>
<a href="http://zjunlp.github.io/DeepKE">
<img alt="Documentation" src="https://img.shields.io/badge/doc-website-red">
</a>
<a href="https://colab.research.google.com/drive/1vS8YJhJltzw3hpJczPt24O0Azcs3ZpRi?usp=sharing">
<img alt="Open In Colab" src="https://colab.research.google.com/assets/colab-badge.svg">
</a>
<b> <a href="https://github.com/zjunlp/DeepKE/blob/main/README_CNSCHEMA.md">English</a> | 简体中文 </b>
DeepKE 是一个开源的知识图谱抽取与构建工具,支持低资源、长篇章、多模态的知识抽取工具,可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。此版本DeepKE-cnSchema为开箱即用版本,用户下载模型即可实现支持cnSchema的实体和关系知识抽取。
| 章节 | 描述 |
|---|---|
| 简介 | 介绍DeepKE基本原理和支持的数据类型 |
| 人工数据标注 | 介绍如何人工标注数据 |
| 自动数据标注 | 介绍如何基于DeepKE自动标注数据 |
| FAQ | 常见问题答疑 |
| 引用 | 本目录的技术报告 |
DeepKE 是一个开源的知识图谱抽取与构建工具,支持低资源、长篇章、多模态的知识抽取工具,可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了详尽的文档,Google Colab教程,在线演示和幻灯片。
众所周知,数据对模型训练非常重要。为方便用户使用本工具,DeepKE提供了详细的实体识别、关系抽取数据标注说明,以方便用户通过人工或自动方式得到训练数据,标注好的数据可以直接供DeepKE进行模型训练。

doccano是一个开源的人工数据标注工具。它为文本分类、序列标记和序列到序列提供标注功能。因此您可以为情感分析、命名实体识别、文本摘要等任务创建标记数据。只需创建一个项目并上传数据并开始标记,您可以在数小时内构建可供DeepKE训练的数据集。下面会介绍使用doccano为实体识别和关系抽取标注数据。
doccano的安装与配置可参考 Github(doccano)
安装并启动server后,在浏览器中访问http://0.0.0.0:8000,并点击登陆。

创建项目。点击左上角的创建,跳转至以下界面。


doccano支持多种格式的文本,它们的区别如下:Textfile:上传的文件为txt格式,打标时一整个txt文件显示为一页内容;Textline:上传的文件为txt格式,打标时txt文件的一行文字显示为一页内容;JSONL:JSON Lines的简写,每行是一个有效的JSON值;CoNLL: CoNLL格式的文件,每行均带有一系列制表符分隔的单词;
添加任务标签
Span与Relation两种标签类型,此处采用Span类型,Span指原文本中的目标信息片段,即实体识别中某个类型的实体。PER、LOC、ORG等。PER标签设置为快捷键p),并定义标签颜色。
任务标注
Annotate按钮开始标注。Span类型标签。
操作、导出数据集导出已标注的数据。标注数据保存在同一个文本文件中,每条样例占一行且存储为jsonl格式,其包含以下字段
id: 样本在数据集中的唯一标识ID。text: 原始文本数据。entities: 数据中包含的Span标签,每个Span标签包含四个字段:id: Span在数据集中的唯一标识ID。start_offset: Span的起始位置。end_offset: Span结束位置的下一个位置。label: Span的类型。导出数据示例
{
"id":8,
"text":"曾经去过深圳、珠海的俭汤青年农民回乡后意味深长地说,从南往北走,越走越保守。",
"entities":[
{
"id":9,
"label":"LOC",
"start_offset":4,
"end_offset":6
},
{
"id":10,
"label":"LOC",
"start_offset":7,
"end_offset":9
},
{
"id":11,
"label":"PER",
"start_offset":12,
"end_offset":16
}
],
"relations":[
]
}
DeepKE中实体识别任务输入数据格式为txt文件,每行包括单词、分隔符、标签(可参考CoNLL数据格式)。将导出后的数据预处理成DeepKE可输入的格式即可进行训练,具体流程请进入详细的README中。
{文本}*{头实体}*{尾实体}*{头实体类型}*{尾实体类型},其中头和尾实体类型可为空。添加任务标签
Span与Relation两种标签类型,此处采用Relation类型,Relation指原文本中Span之间的关系,即关系抽取中两个实体间的关系。毕业、因果等。毕业标签设置为快捷键b),并定义标签颜色。
任务标注
Annotate按钮开始标注。PER和LOC两种Span类型标签,之后标注实体间的关系标签毕业。Relation标签由Subject对应实体指向Object对应实体。
操作、导出数据集导出已标注的数据。标注数据保存在同一个文本文件中,每条样例占一行且存储为jsonl格式,其包含以下字段
id: 样本在数据集中的唯一标识ID。text: 原始文本数据。entities: 数据中包含的Span标签,每个Span标签包含四个字段:id: Span在数据集中的唯一标识ID。start_offset: Span的起始位置。end_offset: Span结束位置的下一个位置。label: Span的类型。relations: 数据中包含的Relation标签,每个Relation标签包含四个字段:id: (Span1, Relation, Span2)三元组在数据集中的唯一标识ID,不同样本中的相同三元组对应同一个ID。from_id: Span1对应的标识ID。to_id: Span2对应的标识ID。type: Relation类型。导出数据示例
{
"id":12,
"text":"张廷智, 毕业于大连军医学院,从事中医治疗中晚期肿瘤临床工作30余年*张延智*大连军医学院*人物*学校",
"entities":[
{
"id":18,
"label":"PER",
"start_offset":0,
"end_offset":3
},
{
"id":19,
"label":"ORG",
"start_offset":8,
"end_offset":14
}
],
"relations":[
{
"id":1,
"from_id":18,
"to_id":19,
"type":"毕业"
}
]
}
为了用户更好的使用DeepKE完成实体识别任务,我们提供一个简单易用的基于词典匹配的实体识别自动标注工具。
预提供了两个实体词典(中英文各一个),使用实体词典+jieba词性标注对样本进行自动标注。
中文示例词典中, 我们采用(人民日报)数据集. 它是NER相关的数据集,包含人员 (PER)、位置 (LOC) 和组织 (ORG) 相关的命名实体识别。
英文示例词典中,我们采用Conll数据集。它包含人员 (PER)、位置 (LOC) 和其他 (MISC) 相关的命名实体识别。你可通过如下命令获得Conll数据集
shell
wget 120.27.214.45/Data/ner/few_shot/data.tar.gz
若需要构建领域自建词典,请参照预提供词典格式(csv)
| 实体 | 词性 |
|---|---|
| 杭州 | LOC |
| ... | ... |
输入的词典格式为csv(包含两列,分别是实体以及对应的标签)。
待自动打标的数据(txt格式按行分隔,如下图所示)应放在source_data路径下,脚本会遍历此文件夹下的所有txt格式的文件,逐行进行自动打标。具体示例如下:
example_train_cn.txt, example_dev_cn.txt, example_test_cn.txt,分别对应训练集、验证集和测试集。我们自动将源文件数据划分为三份,比例为0.8:0.1:0.1。输出文件的格式如下:
运行环境:
- jieba = 0.42.1
language: 可选cn(中文)或en(英文)source_dir: 语料库路径(遍历此文件夹下的所有txt格式的文件,逐行进行自动打标,默认为source_data)dict_dir: 实体词典路径(默认为vocab_dict.csv)test_rate, dev_rate, test_rate: 训练集、验证集、测试集占比(请确保总和为1,默认0.8:0.1:0.1)python prepare_weaksupervised_data.py --language cn --dict_dir vocab_dict_cn.csv
python prepare_weaksupervised_data.py --language en --dict_dir vocab_dict_en.csv
为了用户更好的使用DeepKE完成关系抽取任务,我们提供一个简单易用的基于远程监督的关系标注工具。
用户提供的源文件需要为.json形式,并且每条数据只包含一个实体对,分别为头实体和尾实体。数据中必须至少包含以下四个字段:sentence(句子), head(头实体), tail(尾实体), head_offset(头实体在句子中的偏移位置), tail_offset(尾实体在句子中的偏移位置)。具体的json字典形式如下:
[
{
"sentence": "如何演好自己的角色,请读《演员自我修养》《喜剧之王》周星驰崛起于穷困潦倒之中的独门秘笈",
"head": "周星驰",
"tail": "喜剧之王",
"head_offset": "26",
"tail_offset": "21",
//...
},
//...
]
源文件中的实体对将会与三元组文件中的三元组进行字符串全匹配。如果匹配成功实体对将会被标记为三元组的关系标签,如果没有匹配项则被标记为None。
我们分解提供了一个英文和一个中文三元组文件。英文三元组来自NYT数据集,包含如下关系类型:
"/business/company/place_founded",
"/people/person/place_lived",
"/location/country/administrative_divisions",
"/business/company/major_shareholders",
"/sports/sports_team_location/teams",
"/people/person/religion",
"/people/person/place_of_birth",
"/people/person/nationality",
"/location/country/capital",
"/business/company/advisors",
"/people/deceased_person/place_of_death",
"/business/company/founders",
"/location/location/contains",
"/people/person/ethnicity",
"/business/company_shareholder/major_shareholder_of",
"/people/ethnicity/geographic_distribution",
"/people/person/profession",
"/business/person/company",
"/people/person/children",
"/location/administrative_division/country",
"/people/ethnicity/people",
"/sports/sports_team/location",
"/location/neighborhood/neighborhood_of",
"/business/company/industry"
中文三元组来自GitHub链接,包含如下关系类型:
{"object_type": "地点", "predicate": "祖籍", "subject_type": "人物"}
{"object_type": "人物", "predicate": "父亲", "subject_type": "人物"}
{"object_type": "地点", "predicate": "总部地点", "subject_type": "企业"}
{"object_type": "地点", "predicate": "出生地", "subject_type": "人物"}
{"object_type": "目", "predicate": "目", "subject_type": "生物"}
{"object_type": "Number", "predicate": "面积", "subject_type": "行政区"}
{"object_type": "Text", "predicate": "简称", "subject_type": "机构"}
{"object_type": "Date", "predicate": "上映时间", "subject_type": "影视作品"}
{"object_type": "人物", "predicate": "妻子", "subject_type": "人物"}
{"object_type": "音乐专辑", "predicate": "所属专辑", "subject_type": "歌曲"}
{"object_type": "Number", "predicate": "注册资本", "subject_type": "企业"}
{"object_type": "城市", "predicate": "首都", "subject_type": "国家"}
{"object_type": "人物", "predicate": "导演", "subject_type": "影视作品"}
{"object_type": "Text", "predicate": "字", "subject_type": "历史人物"}
{"object_type": "Number", "predicate": "身高", "subject_type": "人物"}
{"object_type": "企业", "predicate": "出品公司", "subject_type": "影视作品"}
{"object_type": "Number", "predicate": "修业年限", "subject_type": "学科专业"}
{"object_type": "Date", "predicate": "出生日期", "subject_type": "人物"}
{"object_type": "人物", "predicate": "制片人", "subject_type": "影视作品"}
{"object_type": "人物", "predicate": "母亲", "subject_type": "人物"}
{"object_type": "人物", "predicate": "编剧", "subject_type": "影视作品"}
{"object_type": "国家", "predicate": "国籍", "subject_type": "人物"}
{"object_type": "Number", "predicate": "海拔", "subject_type": "地点"}
{"object_type": "网站", "predicate": "连载网站", "subject_type": "网络小说"}
{"object_type": "人物", "predicate": "丈夫", "subject_type": "人物"}
{"object_type": "Text", "predicate": "朝代", "subject_type": "历史人物"}
{"object_type": "Text", "predicate": "民族", "subject_type": "人物"}
{"object_type": "Text", "predicate": "号", "subject_type": "历史人物"}
{"object_type": "出版社", "predicate": "出版社", "subject_type": "书籍"}
{"object_type": "人物", "predicate": "主持人", "subject_type": "电视综艺"}
{"object_type": "Text", "predicate": "专业代码", "subject_type": "学科专业"}
{"object_type": "人物", "predicate": "歌手", "subject_type": "歌曲"}
{"object_type": "人物", "predicate": "作词", "subject_type": "歌曲"}
{"object_type": "人物", "predicate": "主角", "subject_type": "网络小说"}
{"object_type": "人物", "predicate": "董事长", "subject_type": "企业"}
{"object_type": "Date", "predicate": "成立日期", "subject_type": "机构"}
{"object_type": "学校", "predicate": "毕业院校", "subject_type": "人物"}
{"object_type": "Number", "predicate": "占地面积", "subject_type": "机构"}
{"object_type": "语言", "predicate": "官方语言", "subject_type": "国家"}
{"object_type": "Text", "predicate": "邮政编码", "subject_type": "行政区"}
{"object_type": "Number", "predicate": "人口数量", "subject_type": "行政区"}
{"object_type": "城市", "predicate": "所在城市", "subject_type": "景点"}
{"object_type": "人物", "predicate": "作者", "subject_type": "图书作品"}
{"object_type": "Date", "predicate": "成立日期", "subject_type": "企业"}
{"object_type": "人物", "predicate": "作曲", "subject_type": "歌曲"}
{"object_type": "气候", "predicate": "气候", "subject_type": "行政区"}
{"object_type": "人物", "predicate": "嘉宾", "subject_type": "电视综艺"}
{"object_type": "人物", "predicate": "主演", "subject_type": "影视作品"}
{"object_type": "作品", "predicate": "改编自", "subject_type": "影视作品"}
{"object_type": "人物", "predicate": "创始人", "subject_type": "企业"}
用户可以自定义三元组文件,但是需要设定文件形式为.csv并具有如下格式:
| 头实体 | 尾实体 | 关系 |
|---|---|---|
| 周星驰 | 喜剧之王 |
$ claude mcp add DeepKE \
-- python -m otcore.mcp_server <graph>