Python自然语言处理 8 分析句子结构
前面的章节重点关注词:如何识别它们,分析它们的结构,给它们分配词汇类别,以及获得它们的含义。
目的是要回答下列问题:
(1)如何使用形式化语法来描述无限的句子集合的结构?
(2)如何使用句法树来表示句子结构?
(3)解析器如何分析句子并自动构建语法树?
一 一些语法困境
#语言数据和无限可能性
文法的目的是给出一个明确的语言描述。而我们思考文法的方式与我们认为什么是一种语言紧密联系在一起。观察到的言语和书面文本是否是一个大却有限的集合呢?关于文法句子是否存在一些更抽象的东西,如有能力的说话者能理解的隐性知识?或者是两者的某种组合?我们不会解决这个问题,而是将介绍主要的方法。
#普遍存在的歧义
重要的目的是自然语言understanding,当识别一个文本所包含的语言结构时,可以从中获得多少文本的含义?一段程序在通读了一个文本后,它能否足够“理解”文本,并回答一些简答的问题,如“发生了什么事“或”谁对谁做了什么“?还像以前一样,我们将开发简单的程序来处理已注释的语料库,并执行有用的任务。
二 文法的用途
#超越n-grams
3 上下文无关文法
#一种简单的文法
在NLTK中,上下文无关文法定义在nltk.grammar模块
import nltk
from nltk import CFG
//grammar1 = CFG.fromstring("""
grammar1 = nltk.parse_cfg("""
s -> NP VP
VP -> V NP | V NP PP
PP -> P NP
V -> "saw" | "ate" | "walked"
NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
Det -> "a" | "an" | "the" | "my"
N -> "man" | "dog" | "cat" | "telescope" | "park"
P -> "in" | "on" | "by" | "with"
""")
sent = "Mary saw Bob".split()
rd_parser = nltk.RecursiveDescentParser(grammar1)
for tree in rd_parser.nbest_parse(sent):print tree
如果使用上述文法分析句子The dog saw a man in the park,结果将得到两棵树,被称为 结构上有歧义
#编写你自己的文法
编写mygrammar.cfg
grammar1 = nltk.data.load('file:mygrammar.cfg')
#句法结构中的递归
产生式左侧的文法类型也出现在右侧,那么这个文法被认为是递归的
四 上下文无关文法分析
解析器根据文法产生式处理输入的句子,并建立一个或多个符合文法的组成结构。
例如问答系统对提交的问题首先进行文法分析
在本节中,我们将看到两个简单的分析算法,一种自上而下的方法称为下降递归分析,一种自下而上的方法称为移进-归约分析。
以及更复杂的算法,一种称为左角落分析的带自下而上过滤的自上而下的方法:一种称为图表分析的动态规划技术
#递归下降解析器
nltk.RecursiveDescentParser(grammar1)
#移进-归约分析
nltk.ShiftReduceParser(grammar1)
#左角落解析器
带自下而上过滤的自上而下的解析器
#符合语句规则的子串表
五 依存关系和依存文法
短语结构文法是关于词和词序列如何结合形成句子成分的。
一种独特且互补的方式,依存文法,集中关注的是词与其他词之间的关系。
依存关系是一个中心词与其从属之间的二元非对称关系。一个句子的中心词通常是动词,所有其他词要么依赖于中心词,要么通过依赖路径与它相关联。
与短语结构文法相比,依存文法可以作为一种依存关系用来直接表示语法功能。
#配价与词汇
在表中的动词被认为具有不同的配价。配价限制不仅适用于动词,也适用于其他类的中心词。
#扩大规模
文法是否可以扩大到能覆盖自然语言中的大型语料库
使用各种正规工具
六 文法开发
如何访问树库,及开发覆盖广泛文法所具有的挑战
#树库和文法
corpus模块定义了树库语料的阅读器,其中包含了宾州树库语料10%的样本
from nltk.corpus import treebank
t = treebank.parsed_sents('wsj_0001.mrg')[0]
print t
(S(NP-SBJ(NP (NNP Pierre) (NNP Vinken))(, ,)(ADJP (NP (CD 61) (NNS years)) (JJ old))(, ,))(VP(MD will)(VP(VB join)(NP (DT the) (NN board))(PP-CLR (IN as) (NP (DT a) (JJ nonexecutive) (NN director)))(NP-TMP (NNP Nov.) (CD 29))))(. .))
def filter(tree): #搜索树库找出句子的补语child_nodes = [child.label for child in tree if isinstance(child, nltk.Tree)]#print tree.label#print [t for t in tree if tree.label == 'NP']return (tree.label == 'VP') and ('S' in child_nodes)
from nltk.corpus import treebank
[subtree for tree in treebank.parsed_sents()for subtree in tree.subtrees(filter)]
entries = nltk.corpus.ppattach.attachments('training')
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:key = entry.noun1 + '-' + entry.prep + '-' + entry.noun2table[key][entry.attachment].add(entry.verb)
for key in sorted(table):if len(table[key]) > 1:print key, 'N:', sorted(table[key]['N']), 'V:', sorted(table[key]['V'])
nltk.corpus.sinica_treebank.parsed_sents()[3450].draw() #中央研究院树库语料
#有害的歧义
歧义文法
#加权文法
处理歧义是开发覆盖广泛的解析器的主要任务。图表解析器提高了计算同一个句子的多个分析的效率,但它们仍然会因可能的分析数量过多而不堪重负。加权文法和概率分析算法为这些问题提供了有效的解决方案
def give(t):return t.label == 'VP' and len(t) > 2 and t[1].label == 'NP' \and (t[2].label == 'PP-DTV' or t[2].label == 'NP') \and ('give' in t[0].leaves() or 'gave' in t[0].leaves())
def sent(t):return ' '.join(token for token in t.leaves() if token[0] not in '*-0')
def print_node(t, width):output = "%s %s: %s / %s: %s" %\(sent(t[0]), t[1].label, sent(t[1]), t[2].label, sent(t[2]))if len(output) > width:output = output[:width] + "..."print output
for tree in nltk.corpus.treebank.parsed_sents():for t in tree.subtrees(give):print_node(t, 72)
#概率上下文无关文法(PCFG)
grammar = nltk.parse_pcfg("""
S -> NP VP [1.0]
VP -> TV NP [0.4]
VP -> IV [0.3]
VP -> DatV NP NP [0.3]
TV -> 'saw' [1.0]
IV -> 'ate' [1.0]
DatV -> 'gave' [1.0]
NP -> 'telescopes' [0.8]
NP -> 'Jack' [0.2]
""")
七 深入阅读
Python自然语言处理 8 分析句子结构相关推荐
- 《用Python进行自然语言处理》第8章 分析句子结构
1. 我们如何使用形式化语法来描述无限的句子集合的结构? 2. 我们如何使用句法树来表示句子结构? 3. 语法分析器如何分析一个句子并自动构建语法树? 8.1 一些语法困境 语言数据和无限可能性 #语 ...
- Python自然语言处理 10 分析语句的含义
既然已经有了分析机制和基于特征的文法,那么能否做一些类似分析语句的含义的事情? 回答下列问题: (1)如何表示自然语言的含义,并能通过计算机进行处理? (2)怎样才能将意思表示与无限制的语句集相关联? ...
- 基于python的情感分析案例-python自然语言处理情感分析案例
产品价值 自然语言处理是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,已经广泛应用在电商.文化娱乐.金融.物流等行业客户的多项业务中.自然语言处理API可帮助用户搭建内容搜索.内容推荐.舆情识 ...
- python自然语言处理书籍推荐-python自然语言处理
自然语言处理理论书籍很多,讲实际操作的不多,能讲的这么系统的更少.Python语言在做NLP方面有较明显的优势.之前国外有<Natural Language Process with Pytho ...
- Python自然语言处理中文版-学习笔记
第 1 章 语言处理与 Python 频率分布是项目连同它们的频率计数的集合(例如:一个文本中的词与它们出现的频率). 自然语言处理研究的一个重要目标一直是使用浅显但强大的技术代替无边无际的知识和推理 ...
- python中文版免费下载-PYTHON自然语言处理(中文最新完整版)pdf下载
内容简介 自然语言处理(natural language processing,nlp)是计算机科学领域与人工智能领域中的一个重要方向.它研究能够实现人与计算机之间用自然语言进行有效通信的各种理论和方 ...
- python数据获取与文本分析_python文本分析之处理和理解文本
前言: 在进行自然语言的建模(NLP)时,我们通常难以处理文字类型的数据,因此在常见的机器学习项目中,数据的格式是结构化的,就算在视觉处理的时候也是一个矩阵或者高维张量的形式.那么文字类型的数据我们应 ...
- python自然语言处理 |分析句子的意思
python自然语言处理的第10章 分析句子的意思,这一章在拆解英语的语法及对应于计算机语言的概念和内容变得更深更多,相应地需要理解和记忆的东西增多.整章读下来很吃力,可能大致有了个理解. 我们已经有 ...
- 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:03 理解句子的结构
03 理解句子的结构 3.1 理解NLP的组成 3.1.1 自然语言理解 3.1.2 自然语言生成 3.1.3 NLU和NLG的区别 3.1.4 NLP的分支 3.2 上下文无关文法 3.3 形态分析 ...
- 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第10章 分析句子的意思
第10章 分析句子的意思 10.1 自然语言理解 查询数据库 自然语言.语义和逻辑 10.2 命题逻辑 10.3 一阶逻辑 一阶定理证明 一阶逻辑语言总结 真值模型 独立变量和赋值 量化 量词范围歧义 ...
最新文章
- CENTOS 7 nginx-1.6.2 下载 解压 安装
- RCNN SPP-net Fast-RCNN Faster-RCNN
- SpringMVC学习(六)——Spring四种方式整合MyBatis
- linux安装定制添加输入,Arch Linux--定制自己的Linux操作系統(乙-國際化桌面安裝篇)...
- java第二章_零基础学Java第二章
- FaceDetector(人脸识别)
- 1038 一元三次方程求解
- 编码之Base64编码
- 最新Java基础面试题及答案整理
- Gillmeister Automatic PDF Processor(PDF文件自动处理工具)官方正式版V1.12.3 | pdf自动打印管理软件下载
- Minimax Problem
- Flask流式传输文件
- conda 查看已有环境
- 想知道表格文字识别怎么弄?分享2个表格识别的方法
- Mac上使用docker环境进行C++开发的实践
- android自动发布,Jenkins + Android 自动化打包 发布到蒲公英
- java一个对象回收的过程_一个Java对象的回忆录:垃圾回收
- PS对图片的基本处理
- LeetCode每日一题——904. 水果成篮
- Python-梯度下降法实践
热门文章
- Java批量png转jpg图片格式
- myeclipse出现Severs栏不显示Tomcat
- HI3519移植samba服务器
- matlab算方差std,MATLAB 方差函数 var std
- openg显示Bmp图片
- 注意力机制attention和Transformer
- 银行c语言面试题,笔试题(商业银行方面)
- 测试开发自我介绍模板
- bridging the gap between anchor-based and anchor-free detection via adaptive training sample select
- 剑网三手游哪个服务器人多稳定,“剑网三”手游开服后,我听了半个小时的骂街...