第1关:Pyhanlp 的使用
任务描述
本关任务:根据本关所学有关 Pyhanlp 的知识,完成使用 Pyhanlp 进行关键词提取并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
Pyhanlp 的基础知识;
-
学会使用 Pyhanlp。
Pyhanlp 简介
HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
不同于一些简陋的分词类库,HanLP 精心优化了内部数据结构和 IO 接口,做到了毫秒级的冷启动、千万字符每秒的处理速度,而内存最低仅需120MB 。无论是移动设备还是大型集群,都能获得良好的体验。不同于市面上的商业工具, HanLP 提供训练模块,可以在用户的语料上训练模型并替换默认模型,以适应不同的领域。项目主页上提供了详细的文档,以及在一些开源语料上训练的模型。
HanLP 希望兼顾学术界的精准与工业界的效率,在两者之间取一个平衡,真正将自然语言处理普及到生产环境中去。
Pyhanlp 的使用
1、分词
pyhanlp 可以自定义多种分词规则和模型,也可以加入自定义词典,经测试,默认的分词方法效果就不错,而且兼备词性标注以及命名实体识别,可以识别人名、地名、机构名等信息。
示例1:分词
texts = HanLP.segment(sentence) # 对文本进行分词
for term in texts: # 输出分词结果
print(term.word,term.nature)
2、关键词提取
在 pyhanlp 中,关键词提取是基于 TextRank 算法而实现的。
示例2:关键词提取
document = "一系列研究表明,苹果很可能是人们日常饮食中最健康的食物之一。食用苹果会降低许多重大疾病(包括糖尿病和癌症)的风险。此外,苹果的可溶性纤维含量可促进体重减轻和肠道健康。"
print(HanLP.extractKeyword(document, 2))
输出结果:[苹果, 健康]
3、句法分析
在 pyhanlp 中,句法分析主要是通过依存句法分析的相关方法实现的。
示例3:依存句法分析
text=input()
print(HanLP.parseDependency(text))
编程要求
在右侧编辑器中的 Begin-End 之间补充 Python 代码,使用 pyhanlp 模块对所输入文本进行关键词提取,并输出关键词提取结果。其中文本内容通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
测试输入: 疫情是一场灾难,这场灾难甚至要比地震、海啸等自然灾害来得更为持久。疫情像一面照妖镜,照向了人性最深处。照妖镜之下,有人为了暴利制假售假、哄抬物价,有人为了“便利”抗拒防控、冲击关卡,也有人伺机打劫绑架、寻衅滋事。而每当灾难来临,每个普通人在身心上也将受到不同程度的冲击,变得尤为敏感,缺乏安全感与归宿感。
预期输出: [冲击, 灾难]
from pyhanlp import HanLP
text=input()
# 任务:使用pyhanlp对text进行关键词提取并输出前两个关键词
# ********** Begin *********#
# texts = HanLP.segment(sentence) # 对文本进行分词
# for term in texts: # 输出分词结果
# print(term.word,term.nature)
print(HanLP.extractKeyword(text, 2))
# ********** End **********#
第2关:句法分析的常用方法与实战
任务描述
本关任务:根据本关所学有关句法分析算法的知识,完成基于 pyhanlp 模块进行句法分析的程序的编写并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
句法分析各种算法的思想;
-
使用 pyhanlp 进行句法分析。
基于 PCFG 的句法分析
PCFG( Probabilistic Context Free Grammar )是基于概率的短语结构分析方法,是目前研究最为充分、形式最为简单的统计句法分析模型,也可以认为是规则方法与统计方法的结合。
PCFG是上下文无关文法的扩展,是一种生成式的方法,其短语结构文法可以表示为一个五元组(X,V,S,R,P)。其具体含义为:
-
X 是一个有限词汇的集合(词典),它的元素称为词汇或终结符;
-
V 是一个有限标注的集合,称为非终结符集合;
-
S 称为文法的开始符号,其包含于 V,即 S∈V;
-
R 是有序偶对 (α,β) 的集合,也就是产生的规则集;
-
P 代表每个产生规则的统计概率。
PCFG 可以解决以下问题:
-
基于 PCFG 可以计算分析树的概率值;
-
若一个句子有多个分析树,可以依据概率值对所有的分析树进行排序;
-
PCFG 可以用来进行句法排歧,面对多个分析结果选择概率值最大的。
PCFG 的三个基本问题:
-
给定上下文无关文法 G,如何计算句子 S 的概率,即如何求
P(S|G)
,利用内向和外向算法解决; -
给定上下文无关文法 G 以及句子 S ,如何选择最佳句法树,即如何计算
arg max_T P(T/S,G)
,使用 Viterbi 算法解决; -
如何为文法规则选参数,从而使训练句子的概率最大,即如何计算
arg max_G P(S/G)
,使用 EM 算法解决;
基于最大间隔马尔可夫网络的句法分析
最大间隔是 SVM (支持向量机)中的重要理论,而马尔可夫网络是概率图模型中一种具备一定结构处理关系能力的算法。最大间隔马尔可夫网络( Max- Margin MarkovNetworks )就是这两者的结合,能够解决复杂的结构化预测问题,尤为适合用于句法分析任务。这是一种判别式的句法分析方法,通过丰富特征来消解分析过程中产生的歧义。
类似 SVM 算法,最大间隔马尔可夫网络要实现多元分类,可以采用多个独立而且可以并行训练的二分类器来代替。这样,每个二分类器识别一个短语标记,通过组合这些分类器就能完成句法分析任务,同时也能通过并行方式,大大提升训练速度。
基于移进-归约的句法分析模型
基于移进-归约方法是一种自下而上的方法。其从输入串开始,逐步进行“归约”,直至归约到文法的开始符号。移进-归约算法类似于下推自动机的 LR 分析法,其操作的基本数据结构是堆栈,此算法主要涉及四种操作( S 表示句法树的根节点),包含:
-
移进:从句子左端将一个终结符一道栈顶;
-
归约:根据规则,将栈顶的若干个字符替换为一个符号;
-
接收:句子中所有词均移入栈中,栈中只剩一个符号 S ,从而判定分析成功,结束;
-
拒绝:句子中所有词已进栈,栈中不止一个符号 S ,也就无法进行任何归约操作,导致分析失败。
基于移进-归约的句法分析通常会出现冲突情况,一种是既可以移进又可以规约,还有一种是可以采用不同的规则进行规约。一般可通过引入规则、引入上下文以及缓冲区等方式进行改进。基于移进-规约的句法分析应用于中文时,其对词性非常敏感,常常需要和准确度较高的词性标注工具一块使用。
句法分析工具
FNLP 主要是为中文自然语言处理而开发的工具包,也包含为实现这些任务 的机器学习算法和数据集。目前,FNLP 功能包括信息检索(文本分类、新闻聚类等等),中文处理(中文分词、词性标注、实体名识别、关键词抽取等等),结构化学习算法(在线学习、层次学习、聚类等等)。
在 FNLP 中,依存句法分析使用的是基于转换的依存句法分析。在基于转换的分析方法中,依存分析被看作是对输入句子执行若干动作,由这些动作建立起句子中词与词之间的联系。每一个动作都将当前的分析状态转换到新的状态。基于转换的分析方法并不搜索全局最优的动作序列,而是采用贪婪的策略,根据当前状态选择局部最优的动作。
斯坦福句法分析工具使用 java 语言开发,支持中文的分词,词性标注,句法分析和命名实体识别。斯坦福句法分析集成了三种算法:概率上下文无关文法( PCFG ) 基于神经网络的依存句法分析和基于转换的依存句法分析。
HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。不仅仅是分词,而是提供词法分析、句法分析、语义理解等完备的功能。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
HanLP 希望兼顾学术界的精准与工业界的效率,在两者之间取一个平衡,真正将自然语言处理普及到生产环境中去。pyhanlp 即为 python 包装了 HanLp 的 java 接口,不同于市面上的商业工具,HanLP 提供训练模块,可以在用户的语料上训练模型并替换默认模型,以适应不同的领域。
示例:基于 HanLP 进行句法分析 sentence = HanLP.parseDependency(text) # 对 text 进行句法分析 print(sentence)
在调用函数对 text 文本内容进行句法分析后,会返回一个句法分析的结果,该结果为数组形式。我们可以通过它的 HEAD.LEMMA 属性以及 LEMMA 属性得到两个相邻词的内容并通过 DEPREL 得到它们之间的句法关系。
编程要求
在右侧编辑器中的 Begin-End 之间补充 Python 代码,完成基于 pyhanlp 模块对所输入文本进行句法分析,并输出句法分析结果。其中文本内容通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
测试输入: 疫情不结束不下战场
预期输出: 疫情 --(主谓关系)--> 结束 不 --(状中结构)--> 结束 结束 --(核心关系)--> 核心 不下 --(定中关系)--> 战场 战场 --(动宾关系)--> 结束
from pyhanlp import HanLP
text=input()
# ********** Begin *********#
sentence = HanLP.parseDependency(text) # 对 text 进行句法分析
for sen in sentence.iterator():
print("%s --(%s)--> %s"%(sen.LEMMA,sen.DEPREL,sen.HEAD.LEMMA))
# ********** End **********#