我是NLTK的新手,我想为我的玩具项目试验语法解析器。
以下是我使用的代码:
tokens = nltk.regexp_tokenize(test_sentence, ptrn_for_tokenizer, flags = flags )
tagged_text = regexp_tagger.tag(tokens)
only_tags = [tag for text, tag in tagged_text]
grammar = CFG.fromstring(GRAMMAR)
parser = nltk.ChartParser(grammar, trace=0)
trees = parser.parse(only_tags)
所以我使用正则表达式对文本进行标记,然后使用其他正则表达式标记文本,最后我使用Parser来获取语法树。但Parse仅使用标签(only_tags)完成,我无法恢复标记文本。
怎么做?这是错误的方式吗?
答案 0 :(得分:2)
我理解你为POS标签编写语法的动机:NLTK基于规则的解析器没有大词汇量的地方,因为它们是不适合实际使用的教学工具。我不太确定你的解析树是什么样的,但如果POS标签是叶子节点,你可以编辑树并将这些单词放回去。
我将首先手动编写一个类似于解析器可能给你的样本树:
mytree = nltk.Tree.fromstring("(S (DP D (AP A N)) (VP V))")
所以这里是如何把话放回来的:
>>> tokens = "the big dog runs".split()
>>> for n, pos in enumerate(mytree.leaves()):
mytree[mytree.leaf_treeposition(n)] = nltk.Tree(pos, [ tokens[n] ])
>>> print(mytree)
(S (DP (D the) (AP (A big) (N dog))) (VP (V runs)))