Hanlp自然语言处理工具之词法分析器

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: 本章是接前两篇《分词工具Hanlp基于感知机的中文分词框架》和《基于结构化感知机的词性标注与命名实体识别框架》的。本系统将同时进行中文分词、词性标注与命名实体识别3个任务的子系统称为“词法分析器”。

本章是接前两篇《分词工具Hanlp基于感知机的中文分词框架》和《基于结构化感知机的词性标注与命名实体识别框架》的。本系统将同时进行中文分词、词性标注与命名实体识别3个任务的子系统称为“词法分析器”。

8b4c859fd5b4b5c432d1eae1f7a6f4859b0759c2 

加载

对应的类为PerceptronLexicalAnalyzer,其构造方法为递增的3个模型地址:

l  public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException

l  public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException

l  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

l  默认加载配置文件指定的模型,可以通过-model your/cws.bin,your/pos.bin,your/ner.bin指定别的模型。

l  还可以将输入输出重定向到文件,形成一个pipeline。

l  更多信息,请参考《编译运行》。

未来工作

l  英文和数字最好要做特殊处理。

l  hanlp-lucene-plugin的集成。

l  集成自定义词典。

l  索引分词等功能。

l  重构出新的分词、词性标注与命名实体识别接口,统一所有分词器,并逐步淘汰旧接口。

 文章摘自:HanLP: Han Language Processing ——开源自由的汉语言处理包

相关文章
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2
|
4月前
|
自然语言处理 算法 数据可视化
NLP-基于bertopic工具的新闻文本分析与挖掘
这篇文章介绍了如何使用Bertopic工具进行新闻文本分析与挖掘,包括安装Bertopic库、加载和预处理数据集、建立并训练主题模型、评估模型性能、分类新闻标题、调优聚类结果的详细步骤和方法。
NLP-基于bertopic工具的新闻文本分析与挖掘
|
5月前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
134 0
|
7月前
|
机器学习/深度学习 自然语言处理 Java
中文自然语言处理相关资料 | Chinese NLP Toolkits 中文NLP工具
中文自然语言处理相关资料 | Chinese NLP Toolkits 中文NLP工具
|
机器学习/深度学习 自然语言处理 数据可视化
nlp入门之spaCy工具的使用
本文作为nlp开山篇的第四篇,简要介绍了spaCy工具的用法
|
机器学习/深度学习 数据采集 自然语言处理
nlp入门之nltk工具的使用
本文作为nlp入门开山第三篇,简要的介绍了nltk工具的使用
|
自然语言处理 算法 Java
NLP快速入门:手把手教你用HanLP做中文分词
NLP快速入门:手把手教你用HanLP做中文分词
1096 0
NLP快速入门:手把手教你用HanLP做中文分词
|
机器学习/深度学习 人工智能 自然语言处理
谷歌开源最精确自然语言解析器SyntaxNet的深度解读:一次关键进步以及一个重要工具
自然语言理解研究中,如何处理语言歧义是个难题。 SyntaxNet 将神经网络和搜索技术结合起来,在解决歧义问题上取得显著进展:SyntaxNet 能像训练有素的语言学家一样分析简单句法。今天,谷歌开源了SyntaxNet,也发布了针对英语的预训练解析程序 Parsey McParseface。除了让更多人使用到最先进的分析技术之外,这次开源举措也有利于公司借助社区力量加快解决自然语言理解难题的步伐,惠及谷歌业务。
843 0
谷歌开源最精确自然语言解析器SyntaxNet的深度解读:一次关键进步以及一个重要工具
|
数据采集 人工智能 自然语言处理
用于提取数据的三个开源NLP工具
用于提取数据的三个开源NLP工具
236 0
|
自然语言处理
自然语言处理工具Spacy使用笔记
自然语言处理工具Spacy使用笔记