自然语言处理系列四十》条件随机场CRF》CRF开源工具实战

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书 《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】

文章目录

自然语言处理系列四十

条件随机场(CRF)开源工具实战

目前条件随机场最流行的开源工具是CRF++。CRF++工具包最早是针对序列数据分析提出的,是一个可用于分词/连续数据标注的简单、可定制并且开源的条件随机场(CRFs)工具。CRF++是为了通用目的设计定制 ,能被用于自然语言信息处理 (NLP)的各个方面 ,诸如命名实体识别、信息提取和语块分析。下面介绍下其安装和使用。

  1. CRF++的安装
    CRF++工具包的下载地址:http://code.google.com/p/crfpp/downloads/list(谷歌的下载地址需要翻墙),工具包包括Linux环境下的源代码和Windows下的可执行程序,用C++编写。
    Linux下的安装:
    编译器要求:C++编译器(gcc 3.0或更高)
    下载解压后进入到第一层目录下方使用如下命令。
    命令:
    % ./configure
    % make
    % su
    #make install
    注:只有拥有root帐号的用户才能成功安装。(su 命令就是切换到root权限下):
  2. CRF++的使用
    1)CRF++语料格式
    训练和测试文件必须包含多个tokens,每个token包含多个列。token的定义可根据具体的任务,如词、词性等。每个token必须写在一行,且各列之间用空格或制表格间隔。一个token的序列可构成一个sentence,sentence之间用一个空行间隔。
    最后一列是CRF用于训练的正确的标注形式。
    例如:
    He PRP B-NP
    reckons VBZ B-VP
    the DT B-NP
    current JJ I-NP
    account NN I-NP
    deficit NN I-NP
    will MD B-VP
    narrow VB I-VP
    to TO B-PP
    only RB B-NP
    I-NP
    1.8 CD I-NP
    billion CD I-NP
    in IN B-PP
    September NNP B-NP
    He PRP B-NP
    reckons VBZ B-VP
    ...
    上面的例子每个token包含3列,分别为词本身、词性和Chunk标记。
    注意:如果每一个token的列数不一致,系统将不能正确运行。
    2)CRF++特征模板
    使用该CRF++工具的用户必须自己确定特征模板。模板文件中的每一行代表一个template。每一个template中,专门的宏%x[row,col]用于确定输入数据中的一个token。row用于确定与当前的token的相对行数。col用于确定绝对列数。
    如已知下面的输入数据:
    Input: Data
    He PRP B-NP
    reckons VBZ B-VP
    the DT B-NP << 当前的token
    current JJ I-NP
    account NN I-NP
    特征模板形式为:
    templateexpanded feature
    %x[0,0]the
    %x[0,1]
    %x[-1,0]rokens
    %x[-2,1]PRP
    %x[0,0]/%x[0,1]the/DT
    ABC%x[0,1]123ABCthe123
    模板类型
    有两种模板类型,它们可由template的第一个字符确定。
    (1)Unigram template
    第一种是Unigram template:第一个字符是U
    这是用于描述unigram feature的模板。当你给出一个模板"U01:%x[0,1]",CRF会自动的生成一个特征函数集合(func1 ... funcN),如:
    func1 = if (output = B-NP and feature="U01:DT") return 1 else return
    0
    func2 = if (output = I-NP and feature="U01:DT") return 1 else return
    0
    func3 = if (output = O and feature="U01:DT") return 1
    else return 0
    ...
    funcXX = if (output = B-NP and feature="U01:NN") return 1
    else return 0
    funcXY = if (output = O and feature="U01:NN") return 1
    else return 0
    ...
    一个模型生成的特征函数的个数总数为L*N,其中L是输出的类别数,N是根据给定的template扩展出的unique string的数目。
    (2) Bigram template
    第二种类型Bigram template:第一个字符是B
    这个模板用于描述bigram features。使用这个模板,系统将自动产生当前输出token与前一个输出token(bigram)的组合。产生的可区分的特征的总数是LLN,其中L是输出类别数,N是这个模板产生的unique features数。当类别数很大的时候,这种类型会产生许多可区分的特征,这将会导致训练和测试的效率都很低下。
    使用标识符区分相对位置
    如果用户需要区分token的相对位置时,可以使用标识符。
    比如在下面的例子中,宏"%x[-2,1]"和"%x[1,1]"都代表"DT",但是它们又是不同的"DT"。
    The DT B-NP
    pen NN I-NP
    is VB B-VP << CURRENT TOKEN
    a DT B-NP
    为了区分它们,可以在模型中加入一个唯一的标识符(U01: 或 U02:),即:
    U01:%x[-2,1]
    U02:%x[1,1]
    在这样的条件下,两种模型将被认为是不同的,因为他们将被扩展为"U01:DT"和"U02:DT"。只要你喜欢,你可以使用任何标识符,但是使用数字序号区分更很有用,因为它们只需简单的与特征数相对应。
    (3)模板例子
    Unigram
    U00:%x[-2,0]
    U01:%x[-1,0]
    U02:%x[0,0]
    U03:%x[1,0]
    U04:%x[2,0]
    U05:%x[-1,0]/%x[0,0]
    U06:%x[0,0]/%x[1,0]
    U10:%x[-2,1]
    U11:%x[-1,1]
    U12:%x[0,1]q
    U13:%x[1,1]
    U14:%x[2,1]
    U15:%x[-2,1]/%x[-1,1]
    U16:%x[-1,1]/%x[0,1]
    U17:%x[0,1]/%x[1,1]
    U18:%x[1,1]/%x[2,1]
    U20:%x[-2,1]/%x[-1,1]/%x[0,1]
    U21:%x[-1,1]/%x[0,1]/%x[1,1]
    U22:%x[0,1]/%x[1,1]/%x[2,1]
    Bigram
    B
    3)CRF++包介绍
    CRF++解压后的包有以下文件夹和文件:
    doc文件夹:官方主页的内容
    example文件夹:有四个数据包,每个数据包有四个文件:
    训练数据(test.data)、测试数据(train.data)、模板文件(template)、执行脚本文件exec.sh
    example文件夹:有四个任务的训练数据、测试数据和模板文件。
    sdk文件夹:CRF++的头文件和静态链接库。
    crf_learn.exe:CRF++的训练程序
    crf_test.exe:CRF++的预测程序
    libcrfpp.dll:训练程序和预测程序需要使用的静态链接库。
    实际上,需要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,这三个文件。
    4)CRF++命令介绍
    (1) CRF++命令
    1.将crf_learn.exe;crf_test.exe;libcrfpp.dll三个文件复制到到,含有exec.sh;template;test.data;train.data的文件夹(chunking)里。
    2.cmd cd进入该文件夹
    crf_learn template train.data model 训练数据
    crf_test -m model test.data >output.txt 测试数据
    3.perl conlleval.pl < output.txt 评估效果(此处会报错误)需要下载perl(需要复制conlleval.pl文件到文件夹里)
    或者使用评估程序crf_evalutuion.exe文件,同样把crf_evalutuion.exe文件复制到文件夹里
    使用命令:
    输入"crf_evalution"按回车,然后输入参数,参数有两个:
    第一个是需要评估文件的路径+文件名(如果在同一目录下只需输入文件名,如:output.txt或者c:\desktop\output.txt),
    第二个参数为评估文件行数,对于给定测试语料(test.file.txt)来说输入小于等于 49994 就ok
    4.会产生一个新的文件:model
    这个训练过程的时间、迭代次数等信息就会输出到控制台上,如果想要保存这些信息,我们可以将这些标准输出 流到文件,命令格式为:
    crf_learn template_file train_file model_file >> train_info_file
    eg:crf_learn template train.data model >> model_out.txt
    (2)CRF++操作举例
    CRF++操作截图如图10.4所示。

图10.4 CRF++操作截图(图片来源于CSDN)

(3)CRF++命令参数

训练命令可选参数:

训练:.../crf_learn --[可选参数] template train.data model

可选参数

-f, --freq=INT 使用属性的出现次数不少于INT(默认为1)

-m, --maxiter=INT 设置INT为LBFGS的最大跌代次数 (默认10k)

-c, --cost=FLOAT 设置FLOAT为代价参数,过大会过度拟合 (默认1.0)

-e, --eta=FLOAT 设置终止标准FLOAT(默认0.0001)

-C, --convert 将文本模式转为二进制模式

-t, --textmodel 为调试建立文本模型文件

-a,--algorithm=(CRF|MIRA) 选择训练算法, 默认为CRF-L2

-p, --thread=INT 线程数(默认1),利用多个CPU减少训练时间

-H, --shrinking-size=INT 设置INT为最适宜的跌代变量次数 (默认20)

-v, --version 显示版本号并退出

-h, --help 显示帮助并退出

输出结果如图10.5所示。

图10.5 CRF++训练(图片来源于CSDN)

iter: 跌代次数

terr: tag错误率

serr: sentence错误率

obj: 当前对象值,该值收敛于一个固定的值则停止跌代

diff: 于上次对象值的相对差异

测试命令可选参数:

测试:.../crf_test -[可选参数] -m model test.data

-v选项:设置verbose level(默认0)。增加层次,可从CRF++获得额外的信息。

层次1:可以对每个tag使用边缘概率,对总输出使用条件概率。

.../crf_test -v1 -m model test.data| head

0.478113

层次2:也可以对所有的其他候选求边缘概率。

例:.../crf_test -v2 -m model test.data

0.478113

-n选项:使用这个选项将获得N-best结果,它根据CRF计算出的条件概率排序得到。选择了N-best结果,CRF++会自动添加一行,形为"# N prob"。N从0开始累加至N,prob表示output的条件概率, 依次降低。

如果CRF++不能找到足够的N条路径是,它将放弃列举N-best结果。

新词发现与短语提取

新词发现是一个非常重要的NLP课题。在处理文本对象时,非常关键的问题在于"切词"这个环节,几乎所有的后续结果都依赖第一步的切词。因此切词的准确性在很大程度上影响着后续的处理,切词结果的不同,也就影响了特征的提取,跟数据挖掘一样,特征提取的好坏特别重要,不论用什么算法,特征好数据好结果才会好。

短语提取是指从文章中提取典型的、有代表性的短语,期望能够表达文章的关键内容。关键短语抽取对于文章理解、搜索、分类、聚类都很重要。而高质量的关键短语抽取算法,还能有效助力构建知识图谱。

下一篇文章对新词发现和短语提取的算法原理进行介绍,并用开源工具代码演示其功能。敬请关注!

总结

此文章有对应的配套新书教材和视频:

【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】

新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。

全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。

本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。

【配套视频】
自然语言处理NLP原理与实战 视频教程【陈敬雷】

视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!

上一篇:自然语言处理系列三十九》条件随机场CRF算法原理
下一篇:自然语言处理系列四十一》新词发现与短语提取》新词发现算法原理

相关推荐
喵~来学编程啦3 分钟前
【论文精读】LPT: Long-tailed prompt tuning for image classification
人工智能·深度学习·机器学习·计算机视觉·论文笔记
深圳市青牛科技实业有限公司17 分钟前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
狂奔solar31 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
Tassel_YUE32 分钟前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
水豚AI课代表37 分钟前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
几两春秋梦_38 分钟前
符号回归概念
人工智能·数据挖掘·回归
聪明的墨菲特i39 分钟前
Python爬虫学习
爬虫·python·学习
Dontla1 小时前
ChatGPT键盘快捷键(按ctrl + /呼出)
ai
用户691581141652 小时前
Ascend Extension for PyTorch的源码解析
人工智能
Chef_Chen2 小时前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习