【问题标题】:Python NLTK parse tagged text: how to retrieve the tagged textPython NLTK 解析标记文本:如何检索标记文本
【发布时间】:2016-01-09 11:24:06
【问题描述】:

我是 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)

所以我用正则表达式标记文本,然后使用其他正则表达式标记文本,最后我使用解析器来生成语法树。但是解析只使用标签(only_tags)完成,我无法恢复标记的文本。

如何做到这一点?是不是走错路了?

【问题讨论】:

  • mhhh...没有答案没有 cmets。愚蠢的问题?

标签: python regex nltk


【解决方案1】:

我理解您仅为 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)))

【讨论】:

  • 感谢您的评论。我现在正在使用 Chunk 语法切换到 RegexParser。 NLTK 提供的 CFG 解析器似乎不那么死板。
  • 我建议你研究一下统计解析。除非你有足够的资源来写成千上万的人,否则手写规则并不适合认真使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多