Ответ Джейкоба точен. Однако, чтобы расширить его, вы можете обнаружить, что вам нужно нечто большее, чем просто униграмма.
Например, рассмотрим три предложения:
select the files
use the select function on the sockets
the select was good
Здесь слово «выбор» используется как глагол, прилагательное и существительное соответственно. Unigram Tagger не сможет моделировать это. Даже биграмный тегер не может справиться с этим, потому что два случая имеют одно и то же предшествующее слово (то есть "the"). Вам понадобится триггерный тегер, чтобы правильно обрабатывать этот случай.
import nltk.tag, nltk.data
from nltk import word_tokenize
default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
def evaluate(tagger, sentences):
good,total = 0,0.
for sentence,func in sentences:
tags = tagger.tag(nltk.word_tokenize(sentence))
print tags
good += func(tags)
total += 1
print 'Accuracy:',good/total
sentences = [
('select the files', lambda tags: ('select', 'VB') in tags),
('use the select function on the sockets', lambda tags: ('select', 'JJ') in tags and ('use', 'VB') in tags),
('the select was good', lambda tags: ('select', 'NN') in tags),
]
train_sents = [
[('select', 'VB'), ('the', 'DT'), ('files', 'NNS')],
[('use', 'VB'), ('the', 'DT'), ('select', 'JJ'), ('function', 'NN'), ('on', 'IN'), ('the', 'DT'), ('sockets', 'NNS')],
[('the', 'DT'), ('select', 'NN'), ('files', 'NNS')],
]
tagger = nltk.TrigramTagger(train_sents, backoff=default_tagger)
evaluate(tagger, sentences)
#model = tagger._context_to_tag
Обратите внимание, что вы можете использовать NLTK NgramTagger для обучения тегера с использованием произвольно большого числа n-грамм, но обычно вы не получаете большого увеличения производительности после триграмм.