-
【说话处理惩罚与Python】8.5依存关系和依存文法\8.6文法开辟
添加时间:2013-6-2 点击量:短语布局文法是关于词和词序列如何连络起来形成句子成分的。
依存文法是一个独特的和互补的体式格式,集中存眷的是词与其他词之间的关系。依存关系是一个中间词与它的依附之间的二元对称关系。一个句子的中间凡是是动词,所有其他词要么依附于中间词,要么依附路径与它联通。
依附关系默示是一个加标签的有向图,此中节点是词汇项,加标签的弧默示依附关系,从中间词到依附。
图中显示了一个依存关系图,箭头从中间词指向它们的依附。
1、shot是全部句子的中间词;
2、I是shot的SBJ(主语)
3、in是一个NMOD(elephant的名词润饰词)
4、与短语布局文法比拟,依存文法可以作为一种依存关系直接用来默示语能。
下面是NLTK为依存文法编码的一种体式格式-重视他只能捕获依存关系信息,不克不及指定依存关系类型:
>>>groucho_dep_grammar= nltk.parse_dependency_grammar("""
... shot -> I | elephant | in
... elephant -> an | in
... in -> pajamas
... pajamas -> my
... """)
>>>print groucho_dep_grammar
Dependency grammar with 7 productions
shot -> I
shot -> elephant
shot -> in
elephant -> an
elephant -> in
in -> pajamas
pajamas -> my
下面的例子,演示了如何捕获歧义:
>>>pdp= nltk.ProjectiveDependencyParser(groucho_dep_grammar)
>>>sent = I shot an elephant in mypajamas.split()
>>>trees = pdp.parse(sent)
>>>for tree in trees:
... print tree
(shot I (elephant an (in (pajamas my))))
(shot I (elephant an) (in (pajamas my)))
配价与词汇
我们来看如许一组句子:
(12)a. Thesquirrel wasfrightened.
b.Chatterersaw the bear.
c.Chattererthought Busterwasangry.
d.Joe put the fish onthe log.
这些句子对应着下面这个表格,显现了VP产生式和他们的中间词汇
在表中,动词被认为具有不合的配价。
依附ADJ,NP,PP和S凡是背成为各主动词的补语。
为了扩大VP后动词至于他们正确的补语一同呈现,我们可以经由过程将动词划分成更多的子类别做到这个,每个子类别与一组不合的补语接洽关系。例如:及物动词后面须要跟NP;可认为及物动词引入一个新的标签,叫做TV。
VP-> TV NP
TV-> chased | saw
扩大范围
若是把这种做法可以扩大到覆盖天然说话的大型语料库,手工构建如许一套产生式是很是艰苦的。
8.6文法开辟
在这一节中测验测验扩大这种办法的范围来处理惩罚实际的说话语料库。这这里接见树库,并看看开辟广泛覆盖的文法的挑衅。
树库和文法
corpus模块定义了树库语料的浏览器。
>>> nltk.corpusimport 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))))
(. .))
鄙人面的法度中,应用了一个简单的过滤器找出带句子补语的动词。
假设我们已经有了一个形如VP->SV S的产生式,这个信息使我们可以或许辨认出那些包含在SV中的扩大中的特此外动词。
#搜刮树库找出句子的补语
def filter(tree):
child_nodes = [child.node for child in tree
if isinstance(child, nltk.Tree)]
return (tree.node ==VP) and (S in child_nodes)
>>> nltk.corpusimport treebank
>>>[subtree for tree in treebank.parsed_sents()
... for subtree in tree.subtrees(filter)]
[Tree(VP, [Tree(VBN, [named]), Tree(S,[Tree(NP-SBJ, ...]), ...]), ...]
nltk.corpus.ppattach是一个关于希罕动词配价的信息源。在这里找出具有固定介词和名词的介词短语对,此中介词短语附着到VP还是NP,由选择的动词决意。
>>>entries = nltk.corpus.ppattach.attachments(training)
>>>table = nltk.defaultdict(lambda: nltk.defaultdict(set))
>>>for entry in entries:
... key = entry.noun1 + - +entry.prep + - + entry.noun2
... table[key][entry.attachment].add(entry.verb)
...
>>>for keyin sorted(table):
.. . if len(table[key]) > 1:
... print key,N:, sorted(table[key][N]), V:, sorted(table[key][V])
有害的歧义
文法解析是轻易产生歧义的.在这里不做过多的申明,有的时辰在解析句子的时辰可骇的低效.
为懂得决这个题目,概率解析会帮我们解决,它使我们可以或许以来自语料库的证据为根蒂根基对歧义句的解析进行排名.
加权文法
概率高低文无关文法(probabilistic context-free grammar,PCFG)是一种高低文无关文法,他的每一个产生式接洽关系一个概率。PCFG产生的一个解析的概率,仅仅是他用到的产生式的概率的乘积。
如下面这个文法:
grammar= nltk.parse_pcfg("""
S -> NPVP [1.0]
VP -> TVNP [0.4]
VP -> IV [0.3]
VP -> DatVNPNP [0.3]
TV -> saw [1.0]
IV -> ate [1.0]
DatV-> gave [1.0]
NP -> telescopes [0.8]
NP -> Jack [0.2]
""")
为了确保由文法生成的树能形成概率分布,PCFG文法强加了束缚:产生式所有给定的左侧的概率之和必须为1。
 
>>>viterbi_parser= nltk.ViterbiParser(grammar)
>>>print viterbi_parser.parse([Jack,saw, telescopes])
(S (NP Jack) (VP (TV saw) (NP telescopes))) (p=0.064)