不同的解析器类型:
解析器通常需要对一个用于表达一组语法规则的输入字符串继续处理,然后构成一个或者多个可用于构成某种语法概念的规则。语法是我们衡量一个句子是否良好的一份规范说明,而解析器则是一个用于解读语法的程序。该程序会通过搜索各种不同的树结构空间,找出给定句子的最佳树结构,下面是一些解析器的运用细节和实际用途。
递归下降解析器:
递归下降解析器(recursive descent parsing)是一个自上而下的处理过程,由于解析器的基本操作是从左向右读取输入流中的信息,所以他会试着去验证其语法的正确性。该解析其的基本操作是从输入流中读取字符,然后将它们与终端所输入的语法规则进行匹配,递归下降解析器会在其得到一次正确匹配时会超前查看一个字符,并领先于其输入流的读取指针。
移位-归约解析器:
移位-归约解析器(shift-reduce parser)是一种简单的自下而上的解析器,其试着去寻找一个单词和短语的序列,它们一方面对应着语法生成器的右侧,另一方面则会用生成器左侧的内容对其进行替换,直到归简出完整的句子为止。
图表解析器:
将动态规划技术应用到解析器上,动态规划将中间的结果保存下来,然后再适当的时候重新启动它们,以便提高效率。在文本解析中将解析任务分成几个部分来解决,并将各个部分的结果先存储起来,然后在必要时再考虑如何将其有效地组合成一个完整的解决方法,这种方法被称为图表解析(chart parsing)
正则表达式解析器:
正则表达式解析器使用的是一个正则表达式,定义该表达式的语法形式是在完成了词性标注的字符串之上构建而成的。该解析器将使用这些正则表达式来解析给定的句子,并为他们生成解析树。下面是使用正则表达式所产生的解析实例:
import nltk
from nltk.chunk.regexp import *
chunk_rules=ChunkRule("<.*>","chunk everything")
reg_parser=RegexpParser('''
NP: {<DT>?<JJ>* <NN>*}
P: {<IN>}
V: {<V.*>}
PP: {<P> <VP>}
VP: {<V> <NP|PP>*}
'''
)
test_sent="Mr. Obama played a big role in the Health insurance bill."
test_sent_pos=nltk.pos_tag(nltk.word_tokenize(test_sent))
paresed_out=reg_parser.parse(test_sent_pos)
print(paresed_out)
结果:
(S
Mr./NNP
Obama/NNP
(VP (V played/VBD) (NP a/DT big/JJ role/NN))
(P in/IN)
(NP the/DT)
Health/NNP
(NP insurance/NN bill/NN)
./.)
可视化后树结构为:
例子中我们(基于POS正则表达式)定义了模式的种类希望用模式来生成短语,例如,如果某个短语匹配{