在nltk标记文档中使用evaluate功能

时间:2016-04-05 22:54:01

标签: python nlp nltk n-gram pos-tagger

我是nltk和python的新手。我试图使用评估功能来测试我阅读的文本文档的准确性。这是我到目前为止所做的。

    from nltk.tag import UnigramTagger
    from nltk.corpus import treebank
    from nltk.tokenize import word_tokenize 
    train_sents = treebank.tagged_sents() 
    tagger = UnigramTagger(train_sents) 
    text1 = "This is the first sentence.  Now this is another one!   
              How many do you plan to write?" 
    words = word_tokenize(text1) 
    value = tagger.tag(words) 
    accuracy = tagger.evaluate(words) 

我无法使用此计算精确度。我收到以下错误。

ValueError:需要多于1个值才能解包。

我不知道如何纠正这个问题。谢谢。

1 个答案:

答案 0 :(得分:0)

使用NLTK训练和使用UnigramTagger

>>> from nltk.tag import UnigramTagger
>>> from nltk.corpus import treebank
>>> from nltk import word_tokenize
>>> sent1 = "This is the first sentence."
>>> train_sents = treebank.tagged_sents()
>>> tagger = UnigramTagger(train_sents)
>>> tagger.tag(word_tokenize(sent1))
[('This', u'DT'), ('is', u'VBZ'), ('the', u'DT'), ('first', u'JJ'), ('sentence', u'NN'), ('.', u'.')]

要评估标记器,您需要使用带注释的句子来验证标记器中的标记。 UnigramTagger.evaluate()的输入是元组列表,其中元组中的第一项是单词,元组中的第二项是POS(即与UnigramTagger.train()函数相同的输入类型) 。 。

参见https://github.com/nltk/nltk/blob/develop/nltk/tag/api.py#L53 因此,让我们首先将树库句子分成两部分,90%和10%:

>>> train_sents = treebank.tagged_sents()
>>> treebank_sents = treebank.tagged_sents()
>>> len(treebank_sents)
3914
>>> int(0.9 * len(treebank_sents))
3522
>>> train_sents = treebank.tagged_sents()[:3522]
>>> test_sents = treebank.tagged_sents()[3522:]
>>> tagger = UnigramTagger(train_sents)
>>> tagger.evaluate(test_sents)
0.8647328244274809