-
Notifications
You must be signed in to change notification settings - Fork 724
CommandLine
FNLP入门教程
(by h4x3rotab)
本章节介绍如何使用命令行调用FNLP,完成多种中文自然语言处理任务。
通过命令行调用FNLP是一种较为轻量级的方法。FNLP的Java程序包中包含了许多可供直接使用的命令行工具,通过命令行工具,不必编写任何代码就可以使用FNLP完成常见的语言处理任务,包括中文分词、词性标注、实体名识别、句法分析、训练语言模型等。
通过命令行的调用通常可以用于测试,轻量级的集成(如进行少批量的文本处理),训练语言模型等。然而这种方式也有其缺点:每一次运行都需要重新载入一遍语言模型。载入模型文件消耗的时间与资源都较大,因此性能难以得到保证。当对性能要求较高时,还应调用FNLP库。
-
准备JRE
首先需要确保正确安装了JRE(需版本1.6以上,JDK中已包含了JRE)。可以通过如下命令确定JRE已经正确安装并配置:
java -version
已经安装了JRE缺提示无法找到
java
命令,则说明没有正确设置PATH
环境变量。请自行参考互联网上的资料进行配置。 -
准备FNLP程序包
其次,需要准备编译好的FNLP程序包。FNLP的编译过程可以参考本教程“快速入门”章节。编译后在源码目录中可以得到多个Jar程序包,接下来需要使用的命令行工具就包含在这些程序包之中。确保源码目录下包含如下文件:
./fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar ./fnlp-app/target/fnlp-app-2.0-SNAPSHOT.jar ./fnlp-demo/target/fnlp-demo-2.0-SNAPSHOT.jar ./fnlp-train/target/fnlp-train-2.0-SNAPSHOT.jar
-
准备第三方工具包
FNLP依赖了Trove与Commons-cli两个第三方工具包,需要在调用时指定其路径。确保已经准备好了如下工具包:
建议在FNLP的源码目录中创建“libs”文件夹,并把二者的Jar程序包复制进文件夹之中,以便后续使用(如同“快速入门”章节一样)。
-
调用方式
完成一切准备后就可以开始调用FNLP的命令行工具了。进入命令行,定位到FNLP源码目录,然后执行
java
命令,格式如下:java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" <类名称> [参数表]
其中第一个参数“-Xmx1024m”表示设置最大内存占用为1024MB,当出现内存不足异常时,可以尝试增加最大内存量。
第二个参数“-classpath ...”表示加载程序包文件。在此参数中需要指定FNLP程序包,以及Trove、Commons-cli两个工具包的路径,路径之间使用西文冒号分隔。
第三个参数为类名称,此处需要填写完整的类名称。类名称之后则跟随具体的参数,通常命令行工具都可以通过“-h”参数来显示帮助说明。
例如,为了调用中文分词器
org.fnlp.nlp.cn.tag.CWSTagger
,显示分词器的命令行参数说明,可以执行命令:java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.CWSTagger -h
可以得到如下结果:
usage: SEG: java edu.fudan.nlp.tag.CWSTagger -f model_file input_file output_file; java edu.fudan.nlp.tag.CWSTagger -s model_file string_to_segement -f segment file. Default string mode. -h Print help for this application -s segment string
值得注意的是,截止目前版本(FNLP 2.0),虽然FNLP的包名前缀已经由
edu.fudan
迁移至了org.fnlp
,但命令行工具的帮助说明中仍有部分包名保留着旧的edu.fudan
前缀。这将在后续版本中逐一改进。使用命令行时,调用
java
命令的虚拟机参数较长。可以考虑通过脚本简化调用命令的长度,不过限于篇幅,本章节中对此不再展开。
类名称:org.fnlp.nlp.cn.tag.CWSTagger
参数格式:
-
org.fnlp.nlp.cn.tag.CWSTagger -f <分词模型文件> <输入文件> <输出文件>
载入分词模型文件,对输入的中文语料文件进行分词,并通过文件输出分词结果。FNLP包含已训练好的分词模型文件,位于源码目录下的“models/seg.m”。
以下命令可以对“input.txt”进行分词,并输出到“output.txt”中:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.CWSTagger -f models/seg.m input.txt output.txt
-
-s <分词模型文件> <输入字符串>
载入分词模型文件,对输入字符进行分词,并在控制台中输出分词结果。分词模型文件与用法1中相同。
以下命令实现分词功能:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.CWSTagger -s models/seg.m "世界你好。"
类名称:org.fnlp.nlp.cn.tag.POSTagger
参数格式:
-
org.fnlp.nlp.cn.tag.POSTagger -f <分词模型文件> <词性标注模型文件> <输入文件> <输出文件>
载入分词模型与词性标注模型文件,并对输入语料进行分词、词性标注,把结果输出至文件之中。两个模型文件分别位于FNLP源码目录中的“models/seg.m”与“models/pos.m”。
以下命令对“input.txt”进行分词与词性标注,并把结果保存至“output.txt”:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.POSTagger -f models/seg.m models/pos.m input.txt output.txt
-
org.fnlp.nlp.cn.tag.POSTagger -s <分词模型文件> <词性标注模型文件> <输入字符串>
与用法1类似,但在参数中指定输入字符串,并在控制台中输出标注结果。分词模型文件与词性标注模型文件与用法1中相同。
以下命令实现词性标注功能:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.POSTagger -s models/seg.m models/pos.m "世界你好。"
类名称:org.fnlp.nlp.cn.tag.NERTagger
参数格式:
-
org.fnlp.nlp.cn.tag.NERTagger -f <分词模型文件> <词性标注模型文件> <输入文件> <输出文件>
载入分词模型与词性标注模型文件,识别输入语料中的实体名,并保存至输出文件之中。两个模型文件分别位于FNLP源码目录中的“models/seg.m”与“models/pos.m”。
以下命令对“input.txt”进行处理,识别出实体名,并保存至“output.txt”:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.NERTagger -f models/seg.m models/pos.m input.txt output.txt
-
org.fnlp.nlp.cn.tag.NERTagger -s <分词模型文件> <词性标注模型文件> <输入字符串>
与用法1类似,但在参数中指定输入字符串,并在控制台中输出识别到的实体结果。分词模型文件与词性标注模型文件与用法1中相同。
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.cn.tag.NERTagger -s models/seg.m models/pos.m "史蒂夫·乔布斯(1955-2011),发明家、企业家、美国苹果公司联合创办人、前行政总裁。"
【句法分析器还没有对应的命令行工具可用,我会添加一个cli工具,然后pull到主分支去】
【训练器虽然是可用的,但是似乎没有公开FNLPCurpos训练数据,数据的格式也没有现成文档。格式可以通过源码推断,因此我打算在后续部分增加数据集格式的说明】
类名称:org.fnlp.train.tag.CWSTrain
参数说明:
org.fnlp.train.tag.CWSTrain [可选参数] <特征模板文件> <训练集文件> <模型文件>
使用已标注的训练集对分词器进行训练。训练器会利用模板从训练集中抽取特征,用于训练一个中文分词器。模板与训练集文件必须遵循相应格式。最后,把训练得到的分词器模型保存至“模型文件”。
关于“标注序列”格式与“特征抽取模板”的格式,请参见教程第4章节。
可选参数:
-
-iter <迭代次数>
:设置训练器迭代次数,范围为正整数,默认值为50; -
-c <步长阈值>
:设置线性Viterbi算法训练时的步长阈值,范围为正实数,默认值为0.8。
以下命令将使用模板文件“seg.template”与数据集“train.seg”训练中文分词器,并把得到的模型保存至“seg.gz”中:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.train.tag.CWSTrain seg.template train.seg seg.gz
类名称:org.fnlp.train.tag.POSTrain
参数说明:
org.fnlp.train.tag.POSTrain [可选参数] <特征模板文件> <训练集文件> <模型文件>
使用已标注的训练集对词性标注器进行训练。训练器会利用模板从训练集中抽取特征,用于训练一个词性标注器。模板与训练集文件必须遵循相应格式。最后,把训练得到的分词器模型保存至“模型文件”。
关于“标注序列”格式与“特征抽取模板”的格式,请参见教程第4章节。
可选参数:
-
-iter <迭代次数>
:设置训练器迭代次数,范围为正整数,默认值为50; -
-c <步长阈值>
:设置线性Viterbi算法训练时的步长阈值,范围为正实数,默认值为0.8。
以下命令将使用模板文件“pos.template”与数据集“train.pos”训练中文分词器,并把得到的模型保存至“pos.gz”中:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.train.tag.POSTrain pos.template train.pos pos.gz
类名称:org.fnlp.nlp.parser.dep.train.JointParserTrainer
参数说明:
org.fnlp.nlp.parser.dep.train.JointParserTrainer [可选参数] <训练集目录> <模型文件>
【JointParserTrainer被误写作Parer,我会在下一个pull request中修正】
使用FNLPCorpus数据集训练句法分析器。训练器将查找“训练集目录”中的所有文件,读取并以此训练一个句法分析器。文件必须遵循FNLPCorpus格式。最后,把训练得到的语言模型保存至“模型文件”。
关于FNLPCorpus格式,请参见教程第4章节。
可选参数:
-
-iter <迭代次数>
:设置训练器迭代次数,范围为正整数,默认值为50; -
-c <步长阈值>
:设置线性分类器PA算法训练时的步长阈值,范围为正实数,默认值为1.0。
以下命令将使用“curpos”目录下的数据集训练句法分析器,并把得到的模型保存至“dep.gz”文件中:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar:libs/trove4j-3.0.3.jar:libs/commons-cli-1.2.jar" org.fnlp.nlp.parser.dep.train.JointParserTrainer curpos dep.gz
作为新手补充几个容易出问题的点; 1、在原GitHub里最新版的模型文件的网盘地址被举报了无法获取,所以只能退一步下载2.1版本的模型文件和2.1版本的源码(测试之后可以使用,如果版本和模型不匹配会出问题)。 2、在装完maven之后开始编译FNLP文件,我安装的时候会下载非常多的组件,不挂梯子会一直失败,所以建议稳定网络稳定梯子安装。(安装的时候会花挺久的,而且cmd有概率会卡死,重新开始编译就行) 3、执行maven命令copy jar包到lib目录下会有问题,推荐手动复制或下载。 4、导入的时候需要导入的fnlp-core-2.0-SNAPSHOT.jar在fnlp-core文件夹下fnlp-core/target/fnlp-core-2.0-SNAPSHOT.jar(很容易被忽略) 5、helloword指导中 1 import org.fnlp.nlp.cn.CNFactory;
2 CNFactory factory = CNFactory.getInstance("models"); 第二行的初始化格式工厂需要在你项目建立好的类中,放在全局外面会报错。 导入包的时候有时候会出现格式错误,此时手打一遍可能会解决问题。