2016-04-05 7 views
0

Я новичок в nltk и python. Я пытался использовать функцию оценки для проверки точности текстового документа, который я читал. Это то, что у меня есть до сих пор.с использованием функции оценки в документах с тегами nltk

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 значение для распаковки.

Я не уверен, как исправить это. Благодарю.

+0

Таггер вход оценка представляет собой список кортежей =) – alvas

ответ

0

Обучать и использовать UnigramTagger с помощью NLTK:

>>> 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'.')] 

Чтобы оценить эту отметку, вы должны были бы иметь аннотированные предложения, чтобы проверить тег из Tagger. Вход в UnigramTagger.evaluate() представляет собой список кортежей, где первым элементом в кортеже является слово, а второй элемент в кортеже - это POS (то есть тот же тип ввода, что и функция UnigramTagger.train()). .

См https://github.com/nltk/nltk/blob/develop/nltk/tag/api.py#L53 Так давайте сначала разделить Treebank предложения на 2 части, 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 
+0

Спасибо за ваш ответ. Я вижу, что команда «оценить» работает для данных, уже находящихся в корпусе. Мне было интересно, есть ли способ заставить его работать для моего предложения, то есть для данных, не существующих в корпусе. –

+0

вам нужно вручную аннотировать ваш корпус, чтобы использовать 'evaluation()' – alvas

+0

okay thanks, я попробую это. –