本章是接前两篇《分词工具Hanlp基于感知机的中文分词框架》和《基于结构化感知机的词性标注与命名实体识别框架》的。本系统将同时进行中文分词、词性标注与命名实体识别3个任务的子系统称为“词法分析器”。
加载
对应的类为PerceptronLexicalAnalyzer,其构造方法为递增的3个模型地址:
<!--[if !supportLists]-->l <!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException
<!--[if !supportLists]-->l <!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException
<!--[if !supportLists]-->l <!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile, String nerModelFile) throws IOException
用户根据自己要进行的任务,训练3个模型中的任意个数,然后灵活传入此类构造即可。此处假设训练了3个模型,那么传入这3个模型的路径即可构造词法分析器:
public void testCWSandPOSandNER() throws Exception
{
PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);
}
分析
词法分析器的分析接口如下:
public static final String SENTENCE = "香港特别行政区的张朝阳说商品和服务是三原县鲁桥食品厂的主营业务";
public void testCWSandPOSandNER() throws Exception
{
PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);
Sentence sentence = segmenter.analyze(SENTENCE);
System.out.println(sentence);
}
正常情况下输出:
[香港/ns 特别/a 行政区/n]/ns 的/n 张朝阳/nr 说/v 商品/n 和/c 服务/vn 是/v [三原县/ns 鲁桥/nz 食品厂/n]/nt 的/z 主营/vn 业务/n
Sentence结构是一个对人民日报语料格式的实现,用户可以方便地用for循环去遍历单词,用instanceof来判断单词属于复合词还是简单词。此处演示输出句子中所有复合词内部的简单词:
for (IWord word : sentence)
{
if (word instanceof CompoundWord)
System.out.println(((CompoundWord) word).innerList);
}
结果:
[香港/ns, 特别/a, 行政区/n]
[三原县/ns, 鲁桥/nz, 食品厂/n]
通过此结构,我们可以捕捉语言的复合结构(简单词构成复合词)。此结构输出为文本后满足人民日报2014语料格式,形成了一个语料与文本之间的闭环。
与HanLP旧接口的兼容
本系统依然兼容HanLP的seg接口,与analyze接口比较如下:
System.out.println(segmenter.seg(SENTENCE));
System.out.println(segmenter.analyze(SENTENCE));
输出:
[香港特别行政区/ns, 的/n, 张朝阳/nr, 说/v, 商品/n, 和/c, 服务/vn, 是/v, 三原县鲁桥食品厂/nt, 的/z, 主营/vn, 业务/n]
[香港/ns 特别/a 行政区/n]/ns 的/n 张朝阳/nr 说/v 商品/n 和/c 服务/vn 是/v [三原县/ns 鲁桥/nz 食品厂/n]/nt 的/z 主营/vn 业务/n
注意上面两个结果中的命名实体有着本质的不同,seg接口无法输出层次结构,而analyze接口可以。
在线学习
本框架另一个特色功能是“在线学习”,或称“增量训练”。其适用场景如下: 线上系统的统计模型依然会犯错误,但重新训练的代价过大(比如耗时长,没有语料等等)。本系统支持在线学习新知识,实时修正统计模型的错误。这里举一个分词的例子,人民日报1998年1月份训练出来的模型无法分对“下雨天地面积水”这个句子:
PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);
System.out.println(segmenter.segment("下雨天地面积水"));
输出:
[下雨, 天地, 面积, 水]
但本系统支持在线学习这个句子的正确分词方式:
segmenter.learn("下雨天 地面 积水");
System.out.println(segmenter.segment("下雨天地面积水"));
通过learn接口,感知机模型学习到了这个句子的正确分词方式,并输出了正确结果:
[下雨天, 地面, 积水]
对于类似的句子,也拥有了举一反三的泛化能力:
System.out.println(segmenter.segment("下雨天地面积累了很多水"));
输出:
[下雨天, 地面, 积累, 了, 很多, 水]
词性标注器和命名实体识别器也有类似的learn接口,用户可举一反三类似地调用,不再赘述。
模型压缩与持久化
在线学习或训练后的模型可以序列化到某个路径,其接口是:
/**
* @param ratio 压缩比c(压缩掉的体积,压缩后体积变为1-c)
* @return
*/
public LinearModel compress(final double ratio)
/**
* 保存到路径
*
* @param modelFile
* @throws IOException
*/
public void save(String modelFile, final double ratio) throws IOException
比如压缩比为0.1,则压缩后的体积为原来的0.9。此处的“体积”指的是特征数量,并不一定等于文件体积。
命令行接口
如上文所述,本框架中的功能可以通过命令行调用:
$ java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main
缺少必需参数: -model
用法: com.hankcs.hanlp.model.perceptron.Main
-task[TaskType]任务类型:CWS|POS|NER (CWS)
-train[flag]执行训练任务
-test[flag]执行预测任务
-evaluate[flag]执行评估任务
-model[String]模型文件路径
-input[String]输入文本路径
-result[String]结果保存路径
-gold[String]标准分词语料
-reference[String]训练集
-development[String]开发集
-iter[Integer]迭代次数 (5)
-compressRatio[Double]模型压缩比率 (0.0)
-thread[int]线程数 (8)
当用户按照上文所述训练了1到3个模型后,可以通过命令行接口交互式地观察效果:
$ java -cp target/hanlp-1.6.0.jar:src/main/resources com.hankcs.hanlp.model.perceptron.Main -test
商品和服务
商品/n 和/c 服务/vn
上海华安工业(集团)公司董事长谭旭光和秘书胡花蕊来到美国纽约现代艺术博物馆参观
[上海/ns 华安/nz 工业/n (/w 集团/n )/w 公司/n]/nt 董事长/n 谭旭光/nr 和/c 秘书/n 胡花蕊/nr 来到/v [美国/ns 纽约/ns 现代/t 艺术/n 博物馆/n]/ns 参观/v
<!--[if !supportLists]-->l <!--[endif]-->默认加载配置文件指定的模型,可以通过-model your/cws.bin,your/pos.bin,your/ner.bin指定别的模型。
<!--[if !supportLists]-->l <!--[endif]-->还可以将输入输出重定向到文件,形成一个pipeline。
<!--[if !supportLists]-->l <!--[endif]-->更多信息,请参考《编译运行》。
未来工作
<!--[if !supportLists]-->l <!--[endif]-->英文和数字最好要做特殊处理。
<!--[if !supportLists]-->l <!--[endif]-->与hanlp-lucene-plugin的集成。
<!--[if !supportLists]-->l <!--[endif]-->集成自定义词典。
<!--[if !supportLists]-->l <!--[endif]-->索引分词等功能。
<!--[if !supportLists]-->l <!--[endif]-->重构出新的分词、词性标注与命名实体识别接口,统一所有分词器,并逐步淘汰旧接口。
文章摘自:HanLP: Han Language Processing ——开源自由的汉语言处理包
相关推荐
HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法...
HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法...
analyzer = AbstractLexicalAnalyzer(PerceptronSegmenter(), tagger) # 构造词法分析器 text = "新华社北京 5 月 29 日电(记者严赋憬、杨淑君)记者从国家林草局获悉,在有关部门和京沪两地各方的高度重视和共同...
jieba(结巴分词) 免费使用 HanLP(汉语言处理包) 免费使用 SnowNLP(中文的类库) 免费使用 FoolNLTK(中文处理工具包) 免费...THULAC(清华中文词法分析工具包) 商用需要付费 NLPIR(汉语分词系统) 付费使用
java smack源码 Navigation-guide Navigation guide 基础部分 core java,javaIO,NIO,多线程,JVM运行机制,内存管理,网络协议 算法 多年积累的基础算法 ...实现的词法,语法,语义分析器 gecco 易用的
HanLP是中文自然语言处理库,具备强大的词法分析能力,能有效理解文本内容。接着,系统采用了SimHASH算法来计算文本的相似度。SimHASH是一种简单而有效的哈希方法,能够在大规模数据中快速查找相似文本,以此为依据...
2. HanLP:由福州大学与自然语言处理实验室开发,提供了分词、词性标注、命名实体识别等功能。 3. IK Analyzer:一个开源的Java分词器,适用于Lucene、Solr等全文检索引擎。 4. SmartChineseAnalyzer:基于Apache ...
"javacc-5.0.rar" 是JavaCC的压缩包,JavaCC 是一个Java语言的词法分析和语法分析工具,可能会用于定制Nutch的查询解析器。而"书名号搜索1.TXT"可能是书名号搜索的示例数据或解释文本。 通过深入理解和调整这些组件...
在处理中文全文检索时,Lucene的设计允许通过扩展其语言词法分析接口来支持中文。由于中文的特殊性,需要对词语进行切分,这通常涉及到词库和自动切分词算法。Lucene本身并不内置中文分词支持,但可以通过集成如IK ...
在Java中,有许多库可以用于实现词法分析或分词,如HanLP、IK Analyzer、jieba分词等。这些分词器通常具备以下特点: 1. 支持中文分词:考虑到中文没有明显的空格分隔词,分词器需要识别词边界。 2. 自适应性强:...