-
Notifications
You must be signed in to change notification settings - Fork 725
Home
FNLP入门教程 (by h4x3rotab)
目录
FNLP是一个致力于中文自然语言处理的开源项目,提供了进行自然语言处理的工具,包括分词、词性标注、句法分析、文本相似度计算等等,以及进行处理所需的数据集。从功能的角度而言,FNLP与著名的Python自然语言处理工具包NLTK较为类似,但后者对中文处理的能力较差。
FNLP采用Java编写,使得它可以轻松运行在各种不同的平台之上,不仅可以通过命令行调用,同时也可以十分便捷的集成到各种Java项目之中。
FNLP是一个开源项目,其代码托管在Github.com之上。有多种方法从FNLP的Github页面下载最新源码。
- 直接下载ZIP包
进入Github中的FNLP项目首页,在页面右侧点击“Download ZIP”按钮,即可从Github下载到FNLP的最新源码包。得到的ZIP包解压缩后即可使用。用这种方法得到的是一份纯净的FNLP源码。
- 直接利用Git下载
对于习惯使用源码管理工具Git的用户,可以直接使用Git下载最新源码,命令如下:
git clone https://github.com/xpqiu/fnlp.git
采用这种方法得到的是一份包含Git仓库的源码,除了纯净的源码外,还可以利用Git的版本控制功能查阅每个文件的任何一个历史版本。Git是一个支持多人协作的源码版本管理系统,详情参见Wikipedia页面,或Git官方网站。
- 下载模型文件
请Release页面下载相应的模型文件。将模型文件放在models目录。
* seg.m 分词模型
* pos.m 词性标注模型
* dep.m 依存句法分析模型
下载后得到文件结构应与FNLP Github页面中呈现的一致,确认无误后即可开始编译运行。
FNLP的编译并不复杂,但需要确保系统中已经安装好了编译所必备的工具。
- 安装与配置JDK
在编译前,确保已经正确安装并配置了JDK(版本需Java 1.6或以上)。配置后,PATH
环境变量中应包含JDK目录,确保可以在命令行中运行java
与javac
工具。
java -version
javac -version
- 安装与配置Maven
Maven是一款先进的Java项目管理工具,用于项目的管理与编译,FNLP也采用Maven构建。完成了Maven的安装与配置后,确保可以在命令行中查看Maven版本号: mvn -version
- 编译FNLP
在命令行中进入FNLP的源码目录(即“README.md”所在的目录),执行如下命令进行编译: mvn install -Dmaven.test.skip=true
此时Maven会显示编译结果,如果见到类似如下的语句,说明编译成功。
[INFO] Reactor Summary:
[INFO]
[INFO] fnlp-all ........................................... SUCCESS [ 0.225 s]
[INFO] fnlp-core .......................................... SUCCESS [ 1.417 s]
[INFO] fnlp-dev ........................................... SUCCESS [ 0.182 s]
[INFO] fnlp-train ......................................... SUCCESS [ 0.193 s]
[INFO] fnlp-app ........................................... SUCCESS [ 0.246 s]
[INFO] fnlp-demo .......................................... SUCCESS [ 0.153 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
通过这种方法,会编译四个Jar包:fnlp-core
、fnlp-dev
、fnlp-train
、fnlp-app
、fnlp-demo
。它们分别位于源码目录中,各自对应目录中的"target"目录之中,例如fnlp-core
的软件包位于:
fnlp-core/target/fnlp-core-2.0.0-SNAPSHOT.jar
如果遇到错误“软件包 org.junit 不存在”,则可修改源码目录下的“pom.xml”文件。找到包含“junit”的依赖设置:
junit
junit
4.11
test
删除其中的scope
元素所在行。完成编辑保存后,再次执行编译命令,即可顺利编译。
FNLP提供了命令行下的调用方法,这也是测试是否正确编译最简单的手段。下面简单地列举FNLP支持的部分功能与使用方式。然而在执行前,还需要下载两个Java工具包。
下载后的工具包可以存放于任何位置,在后续命令中指定其位置即可。假设命令行当前位于源码目录,且Trove与Commons-cli的Jar包位于“libs”目录下,则可以通过下列命令调用FNLP。
【目录结构截图】
-
中文分词
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0.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 "自然语言是人类交流和思维的主要工具,是人类智慧的结晶。"
执行结果如下:
自然 语言 是 人类 交流 和 思维 的 主要 工具 , 是 人类 智慧 的 结晶 。
【图:命令行运行截图】
参数“-Xmx1024m”设置Java虚拟机的可用内存为1024M。FNLP载入语言模型所需内存较大,因此可以利用此参数修改可用内存量。
参数“-classpath ...”载入Jar文件。因此在引号内依次写下fnlp-core、trove、commons-cli的Jar包路径,使用英文冒号分隔文件名。
参数“org.fnlp.nlp.cn.tag.CWSTagger”指定了本次调用的类名,表示调用中文分词器CWSTagger。而后续的参数是根据所调用的类确定的,例如,CWSTagger需要通过“-s”参数指定语言模型文件“models/seg.m”。
-
中文词性标注
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0.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 "周杰伦出生于台湾,生日为79年1月18日,他曾经的绯闻女友是蔡依林。"
执行结果如下: 周杰伦/人名 出生/动词 于/介词 台湾/地名 ,/标点 生日/名词 为/介词 79年/时间短语 1月/时间短语 18日/时间短语 ,/标点 他/人称代词 曾经/副词 的/结构助词 绯闻/名词 女友/名词 是/动词 蔡依林/人名 。/标点
-
实体名识别
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0.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 "詹姆斯·默多克和丽贝卡·布鲁克斯 鲁珀特·默多克旗下的美国小报《纽约邮报》的职员被公司律师告知,保存任何也许与电话窃听及贿赂有关的文件。"
执行结果如下: {詹姆斯·默多克=人名, 鲁珀特·默多克旗=人名, 丽贝卡·布鲁克斯=人名, 纽约=地名, 美国=地名}
使用命令行的方式,不必编写Java代码即可体验到FNLP的强大功能,是进行功能测试与开发轻量级应用的绝佳方法。除了以上三种功能,FNLP还提供了更多的命令行接口,将在第3章节详细介绍。同时,下一个版本的FNLP也会开放更多的命令行接口供用户使用。
虽然FNLP提供了方便的命令行接口,当希望在Java项目中使用FNLP强大的语言处理能力,最佳方式仍然是以库的形式调用FNLP。在这一部分讲介绍如何在两种常见的IDE中引用FNLP,并简单的介绍库的使用方法。
Eclipse是老牌的Java IDE,在项目中引用FNLP非常简单(以JUNO 4.2版本为例)。
- 添加库引用
在IDE左侧的Package Explorer
中选择项目名称,右击,在菜单中选择Build Path
,Add External Archives...
,则会弹出文件选择对话框,依次查找并添加下列文件:
- fnlp-core-2.0.0-SNAPSHOT.jar
- trove4j-3.0.3.jar
- commons-cli-1.2.jar
【图:Add External Archives菜单】
这三个文件分别为FNLP的核心程序包,与两个库依赖的工具包。前者通过FNLP源码编译得到,而后者可以从互联网中下载。在命令行调用一节中已经提供了下载地址。
完成以上操作后,在Package Explorer
中的项目目录之下,可以在Referenced Libraries
目录中看到以上三个Jar程序包,则成功引用了FNLP。
- 修改最大内存量
【图:Referenced Libraries】
接下来修改程序的可用内存大小。由于FNLP的语言模型加载需要较大内存,Java默认的内存量通常不足,因此尽量设为1024MB或更大。
在Package Explorer
中选择项目名称,右击,在菜单中选择Properties
。在弹出的属性窗口左侧选择Run/Debug Settings
,则会呈现项目所有的启动配置。选择当前的启动配置,并点击右侧Edit...
,出现Edit Configuration
窗口。选择Arguments
栏,找到VM arguments
输入框,并添加如下参数:
-Xmx2048m
其中2048m表示允许最大内存空间2048MB,可以按需要进行修改,最后点击确认离开配置窗口。
【图:VM arguments修改后】
- 添加模型文件
模型文件指词典、训练后的中文分词器、POS标注器等,它们位于FNLP源码目录下的“models”目录之中。将此目录复制到Eclipse项目目录之下即可。
项目目录可以通过如下方法找到:在Package Explorer
的项目名称上右击,选择Properties
,出现属性窗口。窗口左侧选择Resource
,则Location
的内容即为项目目录。
【图:文件结构】
Intellij IDEA是近几年流行起来的IDE,引用FNLP库也十分简单(以IDEA 13版本为例)。
- 添加库引用
对于单个模块的应用程序,建议在IDE左侧Project
视图的项目目录中添加“libs”目录,查找并向此目录中复制如下Jar文件:
- fnlp-core-2.0.0-SNAPSHOT.jar
- trove4j-3.0.3.jar
- commons-cli-1.2.jar
以上三个文件的获取请参考上一节。完成上述操作后,可以在Project
视图的“libs”目录中看到三个Jar文件。依次在文件上右键,选择Add as Library...
,出现创建库窗口,在窗口中选择合适的配置,确认即可。
对于多模块的应用程序,也可以在Project Structure
窗口的Libraries
中添加库引用。使用这种方法添加的引用,需要添加了如上三个Jar程序包后,在Libraries
中的程序包上分别右键,选择Add to Modules...
,选择合适模块,以便所有调用FNLP的模块可以得到引用。
- 修改最大内存量
FNLP在载入语言模型时需要内存量较大,建议设为1024MB以上。点击菜单Run
,Edit Configurations...
,出现运行配置窗口。在窗口的左侧Application
栏目中选择当前的应用程序后,在窗口中的VM options
中添加如下参数:
-Xmx2048m
其中2040m表示最大内存为2048MB,可以按需要进行修改,最后点击确认离开配置窗口。
【图:修改后】
- 添加模型文件
FNLP的模型文件包含中文词典、已训练的分词器、POS标注器等,它们位于FNLP源码目录的“models”目录之中。只需把“models”目录复制到当前的项目目录即可。
项目目录可以通过如下方式查找:在IDE的Project
视图中,选择项目名称,右击并选择Show in Explorer
(Windows系统)或Reveal in Finder
(OS X系统)。
创建一个Java项目,准备好环境配置,则可以顺利的调用FNLP进行自然语言处理了。下面一步一步实现最简单常见的任务。
- 中文分词
中文分词工具使用的是CWSTagger
类,位于org.fnlp.nlp.cn.tag
包中。首先在文件中添加引用(后文略):
import org.fnlp.nlp.cn.tag.CWSTagger;
在main函数处中写入如下代码:
public static void main(String[] args) throws Exception {
// 创建一个中文分词器,并使用分词模型“seg.m”初始化分词器
CWSTagger tagger = new CWSTagger("models/seg.m");
// 使用分词器对中文句子进行分词,得到分词结果
String result = tagger.tag("关注自然语言处理、语音识别、深度学习等方向的前沿技术和业界动态。");
// 显示分词结果
System.out.println(result);
}
编译运行,就可以得到分词结果:
关注 自然 语言 处理 、 语音 识别 、 深度 学习 等 方向 的 前沿 技术 和 业界 动态 。
- 中文词性标注
位于org.fnlp.nlp.cn.tag
包的POSTagger
类提供了中文词性标注功能:
public static void main(String[] args) throws Exception {
// 创建一个POS标注器,使用分词模型“seg.m”与POS标注模型“pos.m”初始化标注器
POSTagger tagger = new POSTagger("models/seg.m", "models/pos.m");
// 使用标注器对中文句子进行标注,得到标注结果
String result = tagger.tag("关注自然语言处理、语音识别、深度学习等方向的前沿技术和业界动态。");
// 显示标注结果
System.out.println(result);
}
编译运行,可以得到标注结果: 关注/动词 自然/名词 语言/名词 处理/动词 、/标点 语音/名词 识别/名词 、/标点 深度/形容词 学习/名词 等/省略词 方向/名词 的/结构助词 前沿/名词 技术/名词 和/并列连词 业界/名词 动态/名词 。/标点
- 实体名识别
实体名识别采用NERTagger
类实现,位于org.fnlp.nlp.cn.tag
包之中。与前两者不同的是,实体名标注器返回的是一个HashMap
对象,其中包含已识别出的实体名与实体类型间的关系。
public static void main(String[] args) throws Exception {
// 创建一个实体名标注器,使用分词模型“seg.m”与POS标注模型“pos.m”初始化标注器
NERTagger tagger = new NERTagger("models/seg.m", "models/pos.m");
// 使用标注器对包含实体名的句子进行标注,得到结果
HashMap<String, String> result = tagger.tag("詹姆斯·默多克和丽贝卡·布鲁克斯 鲁珀特·默多克旗下的美国小报《纽约邮报》的职员被公司律师告知,保存任何也许与电话窃听及贿赂有关的文件。");
// 显示标注结果
System.out.println(result);
}
编译运行,得到识别结果:
{詹姆斯·默多克=人名, 鲁珀特·默多克旗=人名, 丽贝卡·布鲁克斯=人名, 纽约=地名, 美国=地名}
快速入门这一章节简单的介绍了FNLP库的编译安装、命令行调用,以及使用FNLP库。相信在这一章的介绍后,读者已经对FNLP的使用有了初步的认识。除了本教程以外,还可以通过互联网上的许多资源来更深入地研究、学习FNLP,下面就列出了部分相关的资料。如果您愿意与大家分享学习FNLP的经验,欢迎联系我们,这个列表将会不停更新下去。
- FNLP官方博客:http://fnlp.org
- FNLP Github页面:http://github.com/xpqiu/fnlp
- FNLP JavaDoc文档(版本待更新):http://fudannlp.googlecode.com/svn/FudanNLP-1.5-API/java-docs/index.html
- ...
【可以继续整理一下】
本章节介绍如何使用命令行调用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.0-SNAPSHOT.jar
./fnlp-app/target/fnlp-app-2.0.0-SNAPSHOT.jar
./fnlp-demo/target/fnlp-demo-2.0.0-SNAPSHOT.jar
./fnlp-train/target/fnlp-train-2.0.0-SNAPSHOT.jar
- 准备第三方工具包
FNLP依赖了Trove与Commons-cli两个第三方工具包,需要在调用时指定其路径。确保已经准备好了如下工具包:
* Trove 3.0.3:[下载页面][2.1]
* Commons-cli 1.2:[下载页面][2.2]
建议在FNLP的源码目录中创建“libs”文件夹,并把二者的Jar程序包复制进文件夹之中,以便后续使用(如同“快速入门”章节一样)。
- 调用方式
完成一切准备后就可以开始调用FNLP的命令行工具了。进入命令行,定位到FNLP源码目录,然后执行java
命令,格式如下:
java -Xmx1024m -classpath "fnlp-core/target/fnlp-core-2.0.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.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.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.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.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.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.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.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.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.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.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.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"); 第二行的初始化格式工厂需要在你项目建立好的类中,放在全局外面会报错。 导入包的时候有时候会出现格式错误,此时手打一遍可能会解决问题。