知识图谱已经在人工智能的各个领域发挥越来越重要的作用,例如视觉问答、对话系统、推荐系统等。知识图谱构建是应用这些知识图谱的基础,而面对生活和企业中数据的爆发式增长,自动化知识图谱构建显得越来越重要。从非结构化文本中自动抽取三元组知识并构建知识图谱需要用到的核心技术就是命名实体识别和关系抽取,现在已经有了很多相关的具体算法和模型,对于这些大家可以看顶会论文和技术分享,我们主要来介绍几个专门面向中文的命名实体识别和关系抽取的工具。
1. 中文分词
中文自然语言处理与其它语言比如英语的最大不同之处在于英文中每个词直接由空格分隔开,但是中文是以字来分隔的,对于机器来说并不知道一句话中哪些字组成一个词。因此,在实现很多中文的自然语言处理功能时,需要先进行分词处理,将一句话中的中文词语分隔开。首先,我们来介绍一种最流行的中文分词工具jieba。
jieba的官方github地址:https://github.com/fxsjy/
ieba在官方对jieba(标星24.5k+)的介绍中,我们看到是这样说的:
“结巴”中文分词:做最好的 Python 中文分词组件
不是人自吹,jieba确实是目前最好的中文分词工具,我们来看看这个小东西都有什么特点。
- 支持全自动安装:
easy_install jieba 或者 pip install jieba / pip3 install jieba
2. 对于同一个句子,支持四种分词模式:
- 精确模式:试图将句子最精确地切开,适合文本分析。
- 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但不能解决歧义。
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny:
pip install paddlepaddle-tiny==1.6.1
3. 支持繁体分词
4. 支持自定义词典
5. 算法上,采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合。对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。具体的jieba和用法可以参考官方github文档。
2. 命名实体识别
目前较为成熟的中文命名实体识别(NER)工具包括LTP,PyHanlp,Lac等。
2.1 语言技术平台(LTP)
语言技术平台(LTP) 是哈工大社会计算与信息检索研究中心 11 年的持续研发和推广,LTP 已经成为国内外最具影响力的中文处理基础平台,曾获 CoNLL 2009七国语言句法语义分析评测 总成绩第一名,中文信息学会钱伟长一等奖等重要成绩和荣誉。LTP提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、高效、精准的自然语言处理技术。目前,LTP 已经被 500 多家国内外研究机构和企业使用,多家大企业和科研机构付费使用。
LTP官方地址:http://ltp.ai/
要想用LTP实现中文命名实体识别非常简单,首选,只需要一行指令便可自动安装部署LTP:
pip install ltp
接着,需要加载模型:
from ltp import LTltp = LTP() # 默认加载 Small 模型
这时,就可以愉快的使用命名实体识别了:
from ltp import LTP
ltp = LTP()
seg, hidden = ltp.seg(["杨超越在1998年7月31日出生于江苏省盐城市大丰区。"])
ner = ltp.ner(hidden)tag, start, end = ner[0][0]print(tag,":", "".join(seg[0][start:end + 1]))]
利用LTP官方提供的在线演示系统:http://ltp.ai/demo.html
可以通过可视化直接看到对“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”这句话的命名实体识别的效果:
从上面的结果可以看到,LTP可以识别出“杨超越”为人名,“江苏省”为地名,但是无法识别出例如“1998年”这种时间类型的实体,同时对于“盐城市”和“大丰区”这类地名也无法识别。
2.2 Pyhanlp
HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,未来将实现知识图谱、问答系统、自动摘要、文本语义相似度、指代消解、三元组抽取、实体链接等功能。
Pyhanlp的github项目官方地址:
https://github.com/hankcs/pyhanlp
这里我们介绍的Pyhanlp是HanLP1.x的Python接口,支持自动下载与升级HanLP1.x,兼容py2、py3。安装Pyhanlp的步骤比LTP稍微复杂一步,首先需要安装JDK,官方下载地址为:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
需要注意的是,这里需要保证JDK的位数、操作系统位数和Python位数一致。然后设置JAVA_HOME环境变量,接着,就可以根据如下指令安装Pyhanlp了:
conda-forge jpype1==0.7.0 # (可选)conda安装jpype1更方便pip install pyhanlp
然后,就可以使用Pyhanlp来进行命名实体识别了,仍然需要通过类似于LTP的流程,先加载模型,再执行命名实体识别:
import pyhanlp
text = '杨超越在1998年7月31日出生于江苏省盐城市大丰区。'
NLPTokenizer = pyhanlp.JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
NER = NLPTokenizer.segment(text)
print(NER)
为了和LTP的命名实体识别的效果进行对比,使用Pyhanlp官方提供的在线演示系统:http://hanlp.hankcs.com/
并针对同样的一个实例“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”,用Pyhanlp对这句话的命名实体识别的效果为:
2.3 BosonNLP
BosonNLP实体识别引擎基于自主研发的结构化信息抽取算法,F1分数达到81%,相比于StanfordNER高出7个百分点。通过对行业语料的进一步学习,可以达到更高的准确率。
BosonNLP项目官方地址:http://static.bosonnlp.com/
BosonNLP 是一个更加商业化的中文语义分析API,其中,对于命名实体识别任务,可以识别时间、地点、人名、组织名、公司名、产品名、职位这几类实体。
安装这个工具非常简便:
pip install bosonnlp
接着,就可以调用这个API进行命名实体识别的任务了:
from bosonnlp import BosonNLP
import os
nlp = BosonNLP(os.environ['BOSON_API_TOKEN'])
nlp.ner('杨超越在1998年7月31日出生于江苏省盐城市大丰区。', sensitivity=2)
同样,为了和前两个工具LTP和Pyhanlp进行对比,针对同样的一个实例“杨超越在1998年7月31日出生于江苏省盐城市大丰区。”,使用BosonNLP官方提供的在线演示系统:http://static.bosonnlp.com/demo#overview-ner
用BosonNLP对这句话的命名实体识别的效果为:
可以看到,用BosonNLP这个工具,能够同时识别出这句话中的人名,时间和地名,相比前两个系统具有最好的命名实体识别的效果。
当然,除了前面介绍的这个三个命名实体识别的工具,还有很多开源的工具可以使用,包括:
- 百度的Lac:https://github.com/baidu/lac
- 复旦大学的fnlp:https://github.com/FudanNLP/fnlp
- 斯坦福的StanfordCoreNLP:https://stanfordnlp.github.io/CoreNLP/
3. 关系抽取
目前,专门面向中文的关系抽取工具并不多,泽宇搜集到的中文关系抽取工具有DeepKE,Jiagu和DeepDive。
3.1 DeepKE
DeepKE是浙江大学知识引擎实验室开发的中文关系抽取开源工具,项目官方地址是:
https://github.com/zjunlp/deepke
安装DeepKE,首先需要安装一些配置环境所需的依赖包:
- python >= 3.6
- torch >= 1.2
- hydra-core >= 0.11
- tensorboard >= 2.0
- matplotlib >= 3.1
- transformers >= 2.0
- jieba >= 0.39
相比于前面介绍的命名实体识别工具,DeepKE的封装性相对没有那么强,目前只能通过源码安装方式:
git clone https://github.com/zjunlp/deepke.gitcd deepke
再采用 pip install -r requirements.txt 安装上述的相关依赖包。
然后,对于我们自己的关系抽取任务,使用DeepKE提供的模型对我们的数据集进行训练,所有的训练数据需要存储在 data/origin 文件夹中。接着,就可以训练关系抽取的模型了,DeepKE提供了7种不同的关系抽取模型,包括:
- 基于 CNN 的关系抽取模型
- 基于 BiLSTM 的关系抽取模型
- 基于 PCNN 的远程监督关系抽取模型
- 基于 Capsule 的关系抽取模型
- 基于 Transformer 的关系抽取模型
- 基于 GCN 的关系抽取模型
- 基于 BERT 语言预训练模型的关系抽取模型
可以看到,DeepKE提供的所有模型都是基于深度学习的关系抽取模型,其中包括最新的基于Transformer、GCN和BERT的模型,具体的每种模型的使用可以参考官方提供的文档:
https://github.com/zjunlp/deepke/wiki
3.2 Jiagu
Jiagu使用大规模语料训练而成。将提供中文分词、词性标注、命名实体识别、情感分析、知识图谱关系抽取、关键词抽取、文本摘要、新词发现、情感分析、文本聚类等常用自然语言处理功能。
Jiagu是思知机器人公司开发的一个针对中文关系抽取的开源工具,Jiagu的项目官方地址是:
https://github.com/ownthink/Jiagu
安装Jiagu就非常方便,可以直接自动安装:
pip install -U jiagu
但是,Jiagu的关系抽取目前仅用于测试的功能,只能使用百科的描述进行测试。使用方法为:
import jiagu
text = '姚明1980年9月12日出生于上海市徐汇区,祖籍江苏省苏州市吴江区震泽镇,前中国职业篮球运动员,司职中锋,现任中职联公司董事长兼总经理。'
knowledge = jiagu.knowledge(text)
print(knowledge)
3.3 DeepDive
deepdive是由斯坦福大学InfoLab实验室开发的一个开源知识抽取系统。它通过弱监督学习,从非结构化的文本中抽取结构化的关系数据 。
斯坦福开源的DeepDive原本只能支持英文的关系抽取,国内最大的知识图谱开放平台OPENKG修改了DeepDive中自然语言处理的model包,使它支持中文,并提供中文使用手册,后续将持续更新一些针对中文的优化。
支持中文的DeepDive项目的官方地址为:
http://www.openkg.cn/dataset/cn-deepdive
希望这几个非常实用的面向中文的命名实体识别和关系抽取工具能够帮助大家实现非结构化知识抽取,快速自动构建知识图谱,并赋能各种融入知识的人工智能项目中。
往期精选:
速览EMNLP 2020上录取的知识图谱相关论文
介绍一些知识图谱的实际应用类项目
已嵌入微信公众号内的小图聊天机器人介绍和使用说明
知识图谱最新权威综述论文解读:知识表示学习部分
手把手教你搭建一个中式菜谱知识图谱可视化系统
如果对文章感兴趣欢迎关注知乎专栏“人工智能遇上知识图谱“,也欢迎关注同名微信公众号“人工智能遇上知识图谱”,让我们一起学习并交流讨论人工智能与知识图谱技术。