查看原文
其他

实体抽取:使用CRF++(1)

走向未来 走向未来 2023-08-08

本系列文章为珠峰书《知识图谱:认知智能理论与实战》配套的材料


在《知识图谱:认知智能理论与实战》一书中,对实体的定义为:


实体(Entity)是指一种独立的、拥有清晰特征的、能够区别于其他事物的事物。在信息抽取、自然语言处理和知识图谱等领域,用来描述这些事物的信息即实体。实体可以是抽象的或者具体的。

                                          ——王文广 《知识图谱:认知智能理论与实战》 P81


这是对1996年MUC-6会议对命名实体的扩展。MUC组委会在当时提出的“命名实体”任务要求从文本中识别出所有的人物名称(人名)、组织机构名称(机构名)和地理位置名称(地名),以及时间、货币和百分数的表述。如果仅仅识别人名、地名、机构名等实体的话,常见的分词库(如 jieba、HanLP、LAC 等)都支持的,可以直接使用这些库来识别,效果通常还不错。


而如果要在产业应用中进行实体抽取,仅仅能够处理这几个命名实体则远远不够。比如书名的识别、建筑物名称的识别、汽车品牌的识别、汽车零部件的识别等等。


在实践中,实体不一定是对物理事物的表述,也可以是对虚拟事物的表述。比如“经济指标”类型的实体“CPI”、人物或者组织机构发表的“观点”类型的实体、某个领域权威人物发表的“言论”类型的实体,在制造业质量和可靠性工程中的“失效事件”类型的实体,以及在各类机械与电子电器设备制造领域中的“性能”类型的实体等。

                                        ——王文广 《知识图谱:认知智能理论与实战》 P81


实体抽取就是从一段文本中抽取出符合要求的实体,常见的实体抽取方法非常多,在《知识图谱:认知智能理论与实战》的第三章介绍了主流的几种实体抽取方法。本文介绍了该书3.4.7节《用 CRF++进行实体抽取》的实例。关于 CRF 的原理,参考《知识图谱:认知智能理论与实战》一书 3.4.5节(P102~106)。


CRF++是CRF 的一种最知名且最经典的实现,通过开放源代码发布的,其官网为【https://taku910.github.io/crfpp/】。Linux(如 Ubuntu、CentOS等)、Unix、Mac(Macbook 等)可下载源码CRF++-0.58.tar.gz并编译使用,源码地址为【https://drive.google.com/file/d/0B4y35FiV1wh7QVR6VXJ5dWExSTQ/view?usp=sharing&resourcekey=0-349QIpjajRnmQl3K8JNCeA https://github.com/wgwang/kg-book/raw/main/codes/3.4/CRF%2B%2B-0.58.tar.gz 】。对于 Windows,可下载安装文件CRF++-0.58.zip,其地址为【https://drive.google.com/file/d/0B4y35FiV1wh7d0dGRU5uRjB4dGM/view?usp=sharing&resourcekey=0-_kwhKjfonyclAqy9KJ9YOw https://github.com/wgwang/kg-book/raw/main/codes/3.4/CRF%2B%2B-0.58.zip 】。在本书配套的 github仓库【https://github.com/wgwang/kg-book 】 上提供了副本,也可从中下载【https://github.com/wgwang/kg-book/tree/main/codes/3.4 】。有些操作系统带有预编译好的程序,也可以直接使用,具体安装方法可从参考相应的操作系统。下面以Linux 为例。


解压 CRF++源码并进行编译


从源码编译 CRF++非常简单,运行如下命令即可(参考《知识图谱:认知智能理论与实战》清单3-4,P108):

./configure --prefix=/your/install/pathmakemake install

有时不方便安装(比如无 root 权限等),那么可以选择编译静态的CRF++程序,参考《知识图谱:认知智能理论与实战》清单3-5,P108。静态编译后,在当前目录找到两个编译好的文件crf_learn 和 crf_test,并复制到指定的目录即可。

./configure LDFLAGS="-static"make


使用 BIO 标记方法准备训练语料


CRF++所使用的训练语料格式说明如下(《知识图谱:认知智能理论与实战》清单3-6, P108):

多列多行的文本列的个数固定,除空行外,所有行的列数保持一样,在实体抽取任务中保持两列即可列之间用空白符(空格或Tab)分隔每行一个带标记的词元,第一列为词元本身,第二列及其往后为词元标记可以用空白行表示句子或段落的分隔


进行实体抽取的常用标记方法参考《知识图谱:认知智能理论与实战》第3.4.6节《标记方法》(P106~107),本例子使用 BIO 的标记方法,其语料格式如下所示(《知识图谱:认知智能理论与实战》清单3-7, P108~109):


12 B-DATE月 I-DATE17 I-DATE日 I-DATE, O嫦 B-PER娥 I-PER五 O号 O返 O回 O器 O在 O内 B-LOC蒙 I-LOC古 I-LOC四 B-LOC子 I-LOC王 I-LOC旗 I-LOC安 O全 O着 O陆 O。 O


本例子使用 MSRA 发布的公开命名实体识别的语料,可以从【https://github.com/wgwang/kg-book/tree/main/datasets/NER-MSRA】下载处理好的数据集,包括训练语料train.txt和测试语料test.txt。语料的说明见该目录下的 readme。


配置 CRF++特征模板


在训练语料准备好后,模型训练就“万事俱备,只欠东风”——“特征工程”了。在传统机器学习中,特征工程是指选择合适特征来训练模型,是决定模型效果好坏的最关键的一环。在前文介绍最大熵模型和条件随机场模型的原理解析时提到,特征函数就是依靠特征工程完成的。在CRF++中,特征函数以特征模板的形式体现。因此,使用CRF++进行实体抽取的最核心的工作是构造合适的特征模板。在实践中,往往要根据数据的情况,设计多个特征模板,并根据所训练模型的效果选择其中表现最好的一个。

                                       ——王文广 《知识图谱:认知智能理论与实战》 P109


CRF++特征模板的详细解析请查阅书籍《知识图谱:认知智能理论与实战》 P109~111。在本例中使用了如下的特征模板文件(《知识图谱:认知智能理论与实战》一书清单3-9,P110)。模板文件可以从【https://github.com/wgwang/kg-book/raw/main/codes/3.4/tpl】下载。

# UnigramU01:%x[-2,0]U02:%x[-1,0]U03:%x[0,0]U04:%x[1,0]U05:%x[2,0]U06:%x[-2,0]/%x[-1,0]/%x[0,0]U07:%x[-1,0]/%x[0,0]/%x[1,0]U08:%x[0,0]/%x[1,0]/%x[2,0]U09:%x[-1,0]/%x[0,0]U10:%x[0,0]/%x[1,0]

# BigramB


训练一个实体抽取模型


下述命令用于训练一个实体抽取模型。其中:

lcrf_learn是CRF++用来训练模型的程序,如果在当前用户的路径中的话,则不需要“./”;

l参数tpl是特征模板文件,可以将前述文件复制到空的文本文件中,或者从【】下载;

ltrain.txt是训练语料,可以从【https://github.com/wgwang/kg-book/raw/main/datasets/NER-MSRA/train.txt】下载并保存为文件名“train.txt”;,

lmodel-crf是crf_learn输出的训练好的模型文件的文件名,可以自行取名。



.

/crf_learn -a CRF -p 32 ./tpl ./train.txt model-crf# 或crf_learn -a CRF -p 32 ./tpl ./train.txt model-crf


训练过程中,crf_learn会输出一些信息,比如:


iter=363 terr=0.00020 serr=0.00502 act=25411498 obj=18979.07784 diff=0.00008iter=364 terr=0.00020 serr=0.00499 act=25411498 obj=18978.06300 diff=0.00005iter=365 terr=0.00020 serr=0.00490 act=25411498 obj=18976.57020 diff=0.00008


其中,iter表示迭代次数,terr表示标签级错误比例(错误的标签/所有的标签),serr表示句子级别的错误比例(错误的句子数量/全部句子数量,句子在训练语料中用空白行隔开),其他参数可参考CRF++的文档。训练完成后,会生成模型文件model-crf。crf_test使用该模型来进行实体抽取。


使用训练好的模型来抽取实体


上述训练模型的过程完成后,即可使用 crf_test 来预测。预测时仅有一列,每行一个字符。比如(可以从【https://github.com/wgwang/kg-book/raw/main/codes/3.4/predict.txt】下载):

广


将上述内容保存为“predict.txt”,使用下述命令:

crf_test -m model-crf predict.txt


即可得到预测的结果:


《 O知 O识 O图 O谱 O:O认 O知 O智 O能 O理 O论 O与 O实 O战 O》 O一 O书 O作 O者 O为 O王 B-PER文 I-PER广 I-PER, O由 O电 B-ORG子 I-ORG工 I-ORG业 I-ORG出 I-ORG版 I-ORG社 I-ORG出 O版 O


从结果中可以看出,模型正确地识别出了“王文广”为“PER(人物)” 类型的实体,识别出了“电子工业出版社”为“ORG(机构)”类型的实体。


参考材料


l王文广. 知识图谱:认知智能理论与实战[M]. 北京:电子工业出版社, 2022: P108

lCRF++官方文档:https://taku910.github.io/crfpp/#usage

l本文代码及数据可从https://github.com/wgwang/kg-book上获取



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存