我正在尝试在NLTK中实现一个基于tagger的chunker。 我把代码编写为,
>>> import nltk,pprint,re,nltk.tree,string,codecs
>>> import nltk.corpus, nltk.tag
>>> import datetime
>>> from nltk.corpus import conll2000
>>> train_sents = conll2000.chunked_sents('train.txt', chunk_types=['NP'])
>>> test_sents = conll2000.chunked_sents('test.txt', chunk_types=['NP'])
>>> def conll_tag_chunks(chunk_sents):
tag_sents = [nltk.chunk.tree2conlltags(tree) for tree in chunk_sents]
return [[(t, c) for (w, t, c) in chunk_tags] for chunk_tags in tag_sents]
>>> tr_chunk = conll_tag_chunks(train_sents)
>>> te_chunk = conll_tag_chunks(test_sents)
>>> u_chunker = nltk.UnigramTagger(tr_chunk)
>>> accuracy=u_chunker.evaluate(te_chunk)
>>> print accuracy
0.832112628491
事情看起来很好,但我无法给新的申请句子分类。这可能是非常愚蠢但却无法解决的问题。
如果有人可能会建议
答案 0 :(得分:0)
培训数据始终是成对列表(<input>, <desired output>)
。您训练的标记器采用相同类型的<input>
。所以看看你的培训输入:
>>> print(tr_chunk[0][:5], "...")
[('NN', 'B-NP'), ('IN', 'O'), ('DT', 'B-NP'), ('NN', 'I-NP'), ('VBZ', 'O')] ...
您已经训练了一个基于他们的POS标签(丢弃原始单词)查找命名实体的组块,因此要使用它,您还必须只传递一个POS标签列表。
>>> words = "I sure love New York .".split()
>>> tags = [ t for (w, t) in nltk.pos_tag(words) ]
>>> u_chunker.tag(tags)
如果没有任何好处,请训练一个更好的chunker。