所以我应该使用我非常简单的解析器从WSJ语料库中删除一些带标签的句子。当我自己标记句子时,它可以正常工作......但是使用他们给定的方式获得标记的句子则不行。
我的任务告诉我使用标记为WSJ语料库的句子200-220 nltk.corpus.treebank.tagged_sents()。但是我的解析器给了我一个错误。
我的代码有效(手动标记有效的句子):
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的打印,它们看起来几乎相同......所以为什么一个解析而不是另一个......我做错了什么?
答案 0 :(得分: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)