实验内容:应用CRF++工具,进行中文分词任务
工具:CRF++ -0.58
环境:Ubuntu18.04 LTS
实验时间:2019.10.28
注:本文只涉及Linux下的安装/使用说明,Windows下的安装/使用说明请看下列博文:
[1] CRF++使用教程
[2] CRF++使用简介(windows下非接口)
[3] Windows下CRF++ 分词实践及Python分词效果评测
[4] CRF++ for NER
一、概念入门:对中文分词任务、常用分词技术、CRF、CRF++等概念的学习。
二、CRF++文档简要阅读:对CRF++的官方文档(含下载链接)的学习。
中文分词任务:中文分词,是指将一句文本切分成一个一个单独的语法词技术,也即将连续的字序列重新组合成词序列的过程。中文分词技术在自然语言理解、搜索、语音等方面都有很广泛的应用。
常用的分词技术:
1、基于词典分词算法:字符串匹配(例如最长字符串匹配)
2、基于统计机器学习算法:隐马尔科夫模型(hidden markov model, HMM)、条件随机场(conditional random field, CRF)
扩展阅读:有哪些比较好的中文分词方案?——知乎
CRF:conditional random field,条件随机场
扩展阅读:如何用简单易懂的例子解释条件随机场(CRF)模型?——知乎
相关书籍:《统计学习方法》by李航 第11章 条件随机场
CRF++ 使用:CRF++官方文档的翻译——华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。
AI算法工程师手册——华校专开源笔记
CRF++是条件随机字段(CRF)的一种简单,可自定义的开源实现,用于对顺序数据进行分段/标记。
CRF++专为通用目的而设计,将应用于各种NLP任务,例如命名实体识别(Named Entity Recognition),信息提取(Information Extraction)和文本分块(Text Chunking)。
Source (Linux下的源代码):CRF++ -0.58.tar.gz
Binary package for MS-Windows (Windows下的二进制包):CRF++
注:Ubuntu 18.04 操作系统默认预装gcc 7.3版本,在终端下输入命令:
gcc --version
,可以查看自己的gcc版本。
gcc是(GNU Compiler Collection)的缩写,意思是GNU编译器套件,是一个可以编译C、C++等多种编程语言的编译器。
官方文档中给的命令如下,进入解压后的CRF++ -0.58文件夹内打开终端,逐行运行即可:
$ ./configure
$ make
$ su # 此条命令用于获取root权限,需要输入密码
# make install # 此条命令不是注释,获取root权限后,符号$会变成#
执行以上命令的具体过程:
下载到本地的CRF++工具包名称为CRF++-0.58.tar.gz
打开终端,切换到CRF++工具包所在的文件夹下(或者直接在文件夹的空白处右键点击打开终端),运行命令tar
解压该文件:
tar -xvzf CRF++-0.58.tar.gz
命令
tar
部分参数含义:(可以在终端下运行命令tar --help
查看)
-x:extract files from an archive(封存)
-v:verbosely(详细地) list files processed
-z:filter the archive throuh gzip
-f:use archive file or device AHIVE
(命令tar
运行时的输出内容,即解压出来的各个文件名称,下图未截全)
在终端下运行cd命令进入解压后的文件、并运行ls命令查看该文件里的内容:
cd CRF++-0.58
能够看到目录下有一个名字叫做configure的文件,长这样:
如果在终端下运行命令file configure
,或者在文件夹里右键点击configure文件-选择Properties,就可以看到configure文件是一个shell script(shell 脚本),如下图所示:
注:关于shell入门
shell:
1、shell是【用户】与【操作系统内核】之间的接口,它接收用户的命令,然后调用相关程序。shell分为图形界面和命令行界面,通常shell单指命令行界面的shell。
2、shell同时又是一门编程语言,不编译,一边执行一边翻译,属于解释语言或脚本语言(script)。脚本语言还有Python、JS、PHP等。
命令行shell举例:
bash(Unix/linux 系统)、
cmd.exe(Windows NT 系统)、
Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)
使用命令./configure
运行该shell脚本,这就是官方文档中shell代码的第一行命令:
(下图为运行时的前半部分输出内容,前面都是checking for…)
在一大堆的checking for…后,命令行中输出了以下内容:
1、configure
脚本创建了config.status
脚本
2、config.status
文件根据相应的配置文件.in
创建文件:
Makefile.in
创建Makefile
(重要)Makefile.msvc.in
创建Makefile.msvc
swig/version.h.in
创建swig/version.h
config.h.in
创建config.h
3、最后,config.status
文件执行了depfiles
和libtool
的命令
(其中libtool在下面还有见到)
INI文件:INI是英文“初始化”(initialization)的缩写。INI文件为配置文件,被用来对操作系统或特定程序初始化或进行参数设置。
运行过shell脚本后使用命令ls
查看文件内容,发现多了几个文件,也就是刚刚运行configure
脚本时创建的:
运行命令make
,也就是官方文档中的代码第二行:
命令make:扫描文件夹内的 Makefile 文件,根据Makefile文件中的内容,对目标进行编译(compile)、链接(link)等等操作。
扩展阅读:例解 Linux 下 Make 命令
可以看到下图中:
第一行为make all-am
,证明make
找到了Makefile
文件,自动从all-
处开始执行;
第二行为Entering directory,也就是进入当前文件夹;
接下来,用shell程序运行libtool
这个shell脚本,通过--mode=complie
这个参数执行着complie命令(将.cpp
编译成.o
)
下图依旧是执行libtool
脚本,只不过参数--mode
变成了link
(将.o
链接成可执行文件)
最后一行是Leaving directory,离开当前文件夹
运行了命令make
后,再使用命令ls
查看文件夹内容,会发现新生成了好多文件:
1、源文件crf_learn.cpp
和crf_test.cpp
通过编译生成了目标文件crf_learn.o
和crf_test.o
,目标文件通过链接生成了可执行文件crf_learn
和crf_test
,最终的这两个可执行文件将在之后用到
(注:这两个可执行文件目前存放在隐藏文件夹./.libs
里,等待着下一条命令将其安装到电脑中,在本文件夹内生成了同名脚本文件crf_learn
和crf_test
)
2、encoder.cpp
生成了encoder.o
和encoder.lo
(以下用.o
和.lo
代替)
3、feature_index.cpp
生成了.o
和.lo
4、feature_cache.cpp
生成了.o
和.lo
5、feature.cpp
生成了.o
和.lo
6、lbfgs.cpp
生成了.o
和.lo
7、libcrfpp.cpp
生成.o
和.lo
和.la
8、node.cpp
生成了.o
和.lo
9、param.cpp
生成了.o
和.lo
10、path.cpp
生成了.o
和.lo
11、tagger.cpp
生成了.o
和.lo
cpp文件转换为可执行文件的过程:
GNU Libtool功能:让用户只需要执行源码包的configure脚本,剩下的事情(源码包编译组装成共享库)都交给libtool来完成
.lo文件: 使用libtool编译出的目标文件,用于决定哪些目标文件可能被组装成共享库
.la文件: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息
扩展阅读:GNU libtool使用简介
运行完了命令make后,还剩两行命令:
$ su
# make install # 此条命令不是注释,获取root权限后,符号$会变成#
其中命令su
是用来获取root权限的,运行该命令后会提示输入密码(Password):
(可以看到下图中,@
号的前面从用户名变成了root,光标的前面从$
变成了#
)
linux运行命令su后提示authentication failure怎么办?
然后运行最后一条命令make install
:
输出信息中:
第一行仍旧是Entering directory;
第二行为Linux命令test
,试探我的电脑里是否有路径/usr/local/lib
,如果没有这个路径就用命令mkdir
建立这个路径;
接下来是执行libtool
脚本,这次--mode
参数变成了install
(此处用到了上一步生成的libcrfpp.la
文件)
第一条横线下的提示信息告诉我们,Libraries已经被下载到路径/usr/local/lib
里;
还告诉我们,如果要链接到给定目录LIBDIR
中已安装的库,则必须使用libtool
,并指定库的完整路径名
第二条横线下又是一个命令test
和install
,把./.libs
中的可执行文件crf_learn
和crf_test
安装到默认路径usr/local/bin
中
最后一个命令test
和install
,把crfpp.h
安装到默认路径usr/local/include
中
最后一行,Leaving directory
路径下的可执行文件:
总结:
回头看看官方文档给的这四条命令:
$ ./configure
$ make
$ su # 此条命令用于获取root权限,需要输入密码
# make install # 此条命令不是注释,获取root权限后,符号$会变成#
其实就是这样的流程:
先运行configure
脚本文件(检查我的电脑各种配置,并根据Makefile.in
文件生成Makefile
文件)
再用命令make
执行Makefile
中的内容(编译链接任务)
再用命令make install
执行Makefile
中的内容(安装任务)
事实上:这是一个常见的GNU程序的安装流程
程序开发人员只需要写一些简单的含有预定义宏的文件,就可以由【工具1:autoconf
】生成configure
脚本文件,并由【工具2:automake
】生成Makefile.in
文件
于是用户就可以使用./configure
+make
+make install
这三条命令把程序安装到Linux系统中
扩展阅读:
Linux 命令详解(三)./configure、make、make install 命令
Configure文件学习
automake、autoconf 使用详解
浅谈 Shell 脚本配置文件格式