Skip to content
h4x3rotab edited this page Sep 23, 2014 · 1 revision

FNLP入门教程

(by h4x3rotab

目录

2 使用命令行调用FNLP

本章节介绍如何使用命令行调用FNLP,完成多种中文自然语言处理任务。

通过命令行调用FNLP是一种较为轻量级的方法。FNLP的Java程序包中包含了许多可供直接使用的命令行工具,通过命令行工具,不必编写任何代码就可以使用FNLP完成常见的语言处理任务,包括中文分词、词性标注、实体名识别、句法分析、训练语言模型等。

通过命令行的调用通常可以用于测试,轻量级的集成(如进行少批量的文本处理),训练语言模型等。然而这种方式也有其缺点:每一次运行都需要重新载入一遍语言模型。载入模型文件消耗的时间与资源都较大,因此性能难以得到保证。当对性能要求较高时,还应调用FNLP库。

2.1 命令行调用方式

  • 准备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命令的虚拟机参数较长。可以考虑通过脚本简化调用命令的长度,不过限于篇幅,本章节中对此不再展开。

2.2 中文分词

类名称:org.fnlp.nlp.cn.tag.CWSTagger

参数格式:

  1. 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
    
  2. -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 "世界你好。"
    

2.3 词性标注

类名称:org.fnlp.nlp.cn.tag.POSTagger

参数格式:

  1. 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
    
  2. 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 "世界你好。"
    

2.4 实体名识别

类名称:org.fnlp.nlp.cn.tag.NERTagger

参数格式:

  1. 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
    
  2. 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),发明家、企业家、美国苹果公司联合创办人、前行政总裁。"
    

2.5 句法分析

【句法分析器还没有对应的命令行工具可用,我会添加一个cli工具,然后pull到主分支去】

2.6 训练器

【训练器虽然是可用的,但是似乎没有公开FNLPCurpos训练数据,数据的格式也没有现成文档。格式可以通过源码推断,因此我打算在后续部分增加数据集格式的说明】

2.6.1 中文分词器训练

类名称: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

2.6.2 词性标注器训练

类名称: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

2.6.3 句法分析器训练

类名称: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