为什么一组标记不解析?

Why is one set of tagged not parsing?

所以我应该使用我非常简单的解析器从 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,它们看起来几乎相同......那么为什么一个解析而不是另一个......我做错了什么?

您收到一个错误,因为您传递 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)