【问题标题】:Why is one set of tagged not parsing?为什么一组标记不解析?
【发布时间】:2017-03-03 04:20:34
【问题描述】:

所以我应该使用我非常简单的解析器从 WSJ 语料库中分块一些标记的句子。当我自己标记句子时,它可以工作......但是使用他们给定的方式来获取标记的句子却没有。

我的作业告诉我使用标记的 WSJ 语料库 nltk.corpus.treebank.tagged_sents() 的句子 200–220。但是我的解析器给了我一个错误。

我的代码有效(手动标记句子有效):

tbss = concat(treebank.sents()[200:220])
tag1 = nltk.pos_tag(tbss)
print(cp.parse(tag1))

使用他们不起作用的代码:

tag2 = nltk.corpus.treebank.tagged_sents()[200:220]
print(cp.parse(tag2))
>>> ValueError: chunk structures must contain tagged tokens or trees

为什么第二个会给出这个错误?我打印了标签 1 和标签 2,它们看起来几乎相同......那么为什么一个解析而不是另一个......我做错了吗?

【问题讨论】:

  • 打印结构可能没有那么有用。看看repr(...) 的对象,或者甚至打开它并单独检查子结构。也可能是抛出异常的对象遗漏了某个方法,所以需要以某种方式包装它以提供所需的接口。
  • 另外,在第一种情况下,您应用默认的 POS 标记器(我不会称之为“手动”,顺便说一句),您首先连接句子,因此您可能会得到一个标记序列.我看不到在第二种情况下会发生这种情况,因此您可能有多个标记序列(每个句子一个)。

标签: python nlp nltk tagging pos-tagger


【解决方案1】:

您收到错误是因为您传递了cp.parse() 一个句子列表,而不是一个标记标记列表。您没有显示concat 的来源,但显然(正如@lenz 评论的那样)它将句子连接成一个单词列表。要在第二种情况下做同样的事情,你需要cp.parse(concat(tag2))

但是,除非您的语法非常不寻常,否则这是不正确的。解析器一次只处理一个句子,因此您应该将句子分开,而不是将它们连接在一起。遍历您的句子列表并解析每个句子,或者使用cp.parse_sents(tag2) 一次解析所有标记的句子。这同样适用于自标记的树库句子,应该像这样标记和解析:

tbss = treebank.sents()[200:220]
tag1 = nltk.pos_tag_sents(tbss)
parsed1 = cp.parse_sents(tag1)
for sent in parsed1:
    print(sent)

【讨论】:

  • @alexis ...谢谢伙计,这很有效...请您看看我的另一个问题,这是对这个问题的跟进吗?这个问题的后续行动是stackoverflow.com/questions/42572648/… 你看我的主要任务是对这些树库句子进行分块......但我在处理所有案例时遇到了一些困难......而且网上关于这种类型的分块的信息也很少语法:(
  • 我不会那样做,对不起。您的另一个问题不是关于 nltk 的语法,而是关于英语语法。
猜你喜欢
  • 2015-05-11
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多