Python NLTK解析标记文本:如何检索标记文本

时间:2015-10-12 04:37:32

标签: python regex nltk

我是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)完成,我无法恢复标记文本。

怎么做?这是错误的方式吗?

1 个答案:

答案 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)))