生成式句法分析指的是,生成一系列依存句法树,从它们中用特定算法挑出概率最大那一棵。句法分析中,生成模型的构建主要使用三类信息:词性信息、词汇信息和结构信息。前二类很好理解,而结构信息需要特殊语法标记,不做考虑。
本文主要利用了词汇+词性生成联合概率模型,使用最大生成树Prim算法搜索最终结果,得到了一个简单的汉语依存句法分析器。
开源项目
本文代码已集成到HanLP中开源:http://hanlp.dksou.com/
基本思路
统计词语WordA与词语WordB构成依存关系DrC的频次,词语WordA与词性TagB构成依存关系DrD的频次,词性TagA与词语WordB构成依存关系DrE的频次,词性TagA与词词性TagB构成依存关系DrF的频次。为句子中词语i与词语j生成多条依存句法边,其权值为上述四种频次的综合(主要利用词-词频次,其余的作平滑处理用)。取边的权值最大的作为唯一的边,加入有向图中。
在有向图上使用Prim最大生成树算法,计算出最大生成树,格式化输出。
模型训练
简单地统计一下清华大学语义依存网络语料,得到如下结果:
@符号连接起两个词汇或词性,用<>括起来的表示词性,否则是词汇。如果@后面没有内容,则表示频次,否则表示一些依存关系与其出现的频次。
依存句法分析
分词标注
以“我吃米饭”为例,先进行分词与词性标注,结果:
生成有向图
由于依存句法树中有虚根的存在,所以为其加入一个虚节点,这样一共有四个节点:
每个节点都与另外三个构成一条有向边,一共4 * 3 = 12 条:
<!--[if !supportLists]-->1. <!--[endif]-->##核心##/root 到 我/rr : 未知 10000.0
<!--[if !supportLists]-->2. <!--[endif]-->##核心##/root 到 吃/v : 未知 10000.0
<!--[if !supportLists]-->3. <!--[endif]-->##核心##/root 到 米饭/n : 未知 10000.0
<!--[if !supportLists]-->4. <!--[endif]-->我/rr 到 ##核心##/root : 核心成分 6.410175
<!--[if !supportLists]-->5. <!--[endif]-->我/rr 到 吃/v : 施事 21.061098 经验者 28.54827 目标 33.656525 受事 37.021248 限定 43.307335 相伴体 48.00737 关系主体 53.115623 内容 53.115623 来源 64.101746
<!--[if !supportLists]-->6. <!--[endif]-->我/rr 到 米饭/n : 限定 22.2052 施事 48.00737 受事 57.170277 目标 57.170277 经验者 64.101746 连接依存 64.101746
<!--[if !supportLists]-->7. <!--[endif]-->吃/v 到 ##核心##/root : 核心成分 1.7917595
<!--[if !supportLists]-->8. <!--[endif]-->吃/v 到 我/rr : 连接依存 96.688614 介词依存 107.67474 施事 107.67474
<!--[if !supportLists]-->9. <!--[endif]-->吃/v 到 米饭/n : 限定 24.849068
<!--[if !supportLists]-->10. <!--[endif]-->米饭/n 到 ##核心##/root : 核心成分 37.077995
<!--[if !supportLists]-->11. <!--[endif]-->米饭/n 到 我/rr : 连接依存 113.2556
<!--[if !supportLists]-->12. <!--[endif]-->米饭/n 到 吃/v : 受事 0.6931472
其中“未知”表示边不存在,“受事”“施事”表示依存关系,后面的小数表示权值。我对概率取了负对数,所以接下来用加法求最小生成树即可。
最小生成树
关于最小生成树的Prim算法请参考《最小生成树算法初步》,这里必须有所改动,由于虚根有且只能有一个孩子,所以虚根必须单独计算:
然后就是中规中矩的Prim算法:
得出最小生成树:
格式化输出
将其转为CoNLL格式输出:
可视化
使用可视化工具展现出来:
结果评测
我没有进行严格的测试,这只是一个玩具级别的汉语依存句法分析器。先来看几个good case与bad case——
效果比较马虎,为何这么说,这是因为分词的训练语料和句法分析语料不同,且我自知此方法严重依赖词汇共现,主要是这种二元词汇生成模型无法充分利用上下文。
短一点的搜索语句可能还是有微量的利用价值。
TODO
应当采用判别式模型,导入SVM或最大熵作为权值的计算工具,然后使用最大生成树算法获取全局最优解。
文章转载自hankcs 的博客
相关推荐
Stanford Parser 是一种功能强大的中文句法分析器,它可以对中文句子进行依存关系分析,生成句法树和词性标注。下面是使用 Stanford Parser 进行中文句法分析的教程。 一、使用时注意两点: 在使用 Stanford ...
针对中文复杂名词短语的依存句法分析...实验证明对于复杂名词短语的依存句法分析,算法准确率比简单边优先算法有明显提高,且优于基于最大生成树算法的中文句法分析器;算法分析效率更高,时间复杂度为O(n2 log n)。
总的来说,MSTParser是一个基于最大生成树理论的高效依存句法分析器,它通过判别式模型和特征函数优化依存树的构建,为理解和处理自然语言提供了有力的工具。无论是在学术研究还是在实际的NLP项目中,MSTParser都是...
该文采用英文语义角色标注的研究方法,实现了一个基于中文依存句法分析的语义角色标注系统。该系统针对中文依存关系树,采用有效的剪枝算法和特征,使用最大熵分类器进行语义角色的识别和分类。系统使用了两种不同的...
2. **NLTK**:NLTK是一个广泛使用的Python NLP库,虽然它的依存句法分析能力相对较弱,但它可以与MaltParser或UDPipe等外部解析器结合使用。首先,需要下载相关的数据资源,然后调用`nltk.parse.malt`模块进行句法...
**maltparser 1.7 句法分析器** maltparser 1.7 是一个广泛使用的开源软件,专门用于句法分析,尤其在数据驱动的依存句法解析领域表现出色。它由瑞典乌普萨拉大学的研究团队开发,为自然语言处理(NLP)提供了强大...
句法分析分为两个主要类型:【成分句法分析】和【依存句法分析】。前者关注识别句子中的短语结构和它们的层次组合,后者侧重于揭示单词间的二元依存关系。 过去的研究重点在于通过【数据驱动】的方法提升句法分析器...
总之,"句法分析器"是一个用于解析中文文本句法结构的工具,涉及到词法分析、分词、句法树构建和依存关系分析等多个技术环节。开源的源代码使得用户可以深入了解其工作原理,并根据需求进行定制和优化。Stanford ...
句法分析主要分为两类:【短语结构分析】和【依存句法分析】。短语结构分析,又称为树形分析,重点关注句子中词汇单位如何组成短语,并进一步构建整个句子的句法树。完全句法分析和局部句法分析是短语结构分析的两个...
而`PcfgParser`可能是一个实现PCFG句法分析的程序或库,它能够读取输入规则并进行句法分析,输出句法树。 在实践中,利用PCFG进行句法分析通常涉及以下步骤: 1. **构建PCFG模型**:定义非终结符、终结符、产生规则...
还有许多开源的句法分析器可供研究和应用,如基于上述方法开发的工具。 **线图分析法** 线图分析法是句法分析的一种重要技术,可以采用自底向上、自顶向下或结合两者的方式进行。该方法通过在二维表格(线图)上...
《斯坦福大学句法分析器在Java中的中英文调用》 斯坦福大学句法分析器,全称为Stanford Parser,是由斯坦福自然语言处理组开发的一款强大的自然语言处理工具,广泛应用于句法分析、语义解析等领域。该工具基于统计...
中文分词 最短路分词 N-最短路分词 CRF分词 索引分词 极速词典分词 用户自定义词典 词性标注 命名实体识别 ...基于神经网络的高性能依存句法分析器 MaxEnt依存句法分析 CRF依存句法分析 语料库工具
这通常通过构建句法树来实现,Java版的句法分析器可能采用了如CFG(上下文无关文法)、依存句法分析或者更现代的深度学习模型(如LSTM、Transformer)来完成。这样的工具对于理解文本意义,特别是进行复杂的语义分析...
在实践中,句法分析器通常会集成多种算法和方法,以应对自然语言理解中的复杂性和不确定性。句法分析不仅是自然语言处理技术中的核心内容,也是理解语言深层结构和语义的重要步骤。随着人工智能技术的发展,句法分析...