8 分析句子结构
英文文档 http://www.nltk.org/book/
中文文档 https://www.bookstack.cn/read/nlp-py-2e-zh/0.md
以下编号按个人习惯
Analyzing Sentence Structure(分析句子结构)
1 Some Grammatical Dilemmas(一些语法困境)
歧义在语言中是普遍存在的,重要的目的是能够理解自然语言。
2 What’s the Use of Syntax?(语法有什么用)
2.1 Beyond n-grams(超越n-grams)
下图中,我们系统地将较长的序列替换为较短的序列,并且保留了语法性。每个组成单元的序列实际上都可以被一个单词替换,最后我们只得到两个元素。
替换单词序列:从第一行开始,我们可以将特定的单词序列(例如the brook)替换为单个的单词(例如it);重复这个过程,我们得到一个合乎语法的两个词的句子。
3 Context Free Grammar(上下文无关语法)
无上下文语法定义在nltk.grammar模块中。下面例子定义了一个简单的语法,并用其解析句子。
上下文无关语法不考虑它所处的上下文。
# 简单的无上下文语法
def asimple_grammar():
grammar1 = CFG.fromstring("""
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"
""")
sent1 = "Mary saw Bob".split()
rd_parser = nltk.RecursiveDescentParser(grammar1)
# 解析sent1。只有一种结果
for tree in rd_parser.parse(sent1):
print(tree)
sent2 = "the dog saw a man in the park".split()
# 解析sent2,得到两棵树,则在结构上有歧义——介词短语附件歧义
for tree in rd_parser.parse(sent2):
print(tree)
可以在一个文件中自己编写语法,并加载。
# 在文件mygrammar.cfg中,编写自己的语法。
# 加载自定义的语法文件
grammar1 = nltk.data.load('file:mygrammar.cfg')
mygrammar.cfg文件中内容如下:
S -> NP VP
VP -> V NP | V NP PP
PP -> P NP
V -> "saw" | "