Набор инструментов для естественного языка - Unigram Tagger

Что такое Unigram Tagger?

Как следует из названия, устройство для тегов unigram - это устройство для тегов, которое использует только одно слово в качестве контекста для определения тега POS (часть речи). Проще говоря, Unigram Tagger - это контекстный теггер, контекст которого представляет собой одно слово, то есть Unigram.

Как это работает?

NLTK предоставляет модуль с именем UnigramTaggerдля этого. Но прежде чем углубляться в его работу, давайте разберемся с иерархией с помощью следующей диаграммы -

Из приведенной выше диаграммы понятно, что UnigramTagger унаследовано от NgramTagger который является подклассом ContextTagger, который наследуется от SequentialBackoffTagger.

Работа UnigramTagger объясняется с помощью следующих шагов -

  • Как мы видели, UnigramTagger наследуется от ContextTagger, он реализует context()метод. Этотcontext() метод принимает те же три аргумента, что и choose_tag() метод.

  • Результат context()Метод будет токеном слова, который в дальнейшем будет использоваться для создания модели. После создания модели слово token также используется для поиска лучшего тега.

  • Таким образом, UnigramTagger построит контекстную модель из списка помеченных предложений.

Обучение теггера Unigram

НЛТК UnigramTaggerможно обучить, предоставив список помеченных предложений во время инициализации. В приведенном ниже примере мы собираемся использовать предложения с тегами из корпуса treebank. Мы будем использовать первые 2500 предложений из этого корпуса.

пример

Сначала импортируйте модуль UniframTagger из nltk -

from nltk.tag import UnigramTagger

Затем импортируйте корпус, который хотите использовать. Здесь мы используем корпус treebank -

from nltk.corpus import treebank

Теперь возьмем предложения для тренировочных целей. Мы берем первые 2500 предложений для учебных целей и помечаем их -

train_sentences = treebank.tagged_sents()[:2500]

Затем примените UnigramTagger к предложениям, используемым в учебных целях -

Uni_tagger = UnigramTagger(train_sentences)

Возьмите несколько предложений, равных или меньше взятых для целей обучения, например 2500, для целей тестирования. Здесь мы берем первые 1500 для тестирования -

test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sents)

Вывод

0.8942306156033808

Здесь мы получили около 89% точности для теггера, который использует поиск по одному слову для определения тега POS.

Полный пример реализации

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)

Вывод

0.8942306156033808

Переопределение контекстной модели

На диаграмме выше показана иерархия для UnigramTagger, мы знаем все тегеры, которые наследуются от ContextTagger, вместо обучения самостоятельно, можно взять заранее построенную модель. Эта предварительно созданная модель представляет собой просто сопоставление словаря Python контекстного ключа с тегом. И дляUnigramTagger, контекстные ключи - это отдельные слова, а для других NgramTagger подклассы, это будут кортежи.

Мы можем переопределить эту контекстную модель, передав другую простую модель в UnigramTaggerкласс вместо прохождения обучающего набора. Давайте разберемся с этим с помощью простого примера ниже -

пример

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’})
Override_tagger.tag(treebank.sents()[0])

Вывод

[
   ('Pierre', None),
   ('Vinken', 'NN'),
   (',', None),
   ('61', None),
   ('years', None),
   ('old', None),
   (',', None),
   ('will', None),
   ('join', None),
   ('the', None),
   ('board', None),
   ('as', None),
   ('a', None),
   ('nonexecutive', None),
   ('director', None),
   ('Nov.', None),
   ('29', None),
   ('.', None)
]

Поскольку наша модель содержит «Винкен» в качестве единственного контекстного ключа, вы можете заметить из вышеприведенного вывода, что только это слово имеет тег, а каждое другое слово имеет тег None.

Установка минимального порога частоты

Чтобы решить, какой тег наиболее подходит для данного контекста, ContextTaggerкласс использует частоту появления. Он будет делать это по умолчанию, даже если контекстное слово и тег встречаются только один раз, но мы можем установить минимальный порог частоты, передавcutoff ценность для UnigramTaggerкласс. В приведенном ниже примере мы передаем значение отсечки из предыдущего рецепта, в котором мы обучили UnigramTagger -

пример

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences, cutoff = 4)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)

Вывод

0.7357651629613641