Инструментарий естественного языка - объединение тегеров

Объединение тегеров

Объединение тегеров или связывание тегеров друг с другом - одна из важных особенностей NLTK. Основная концепция объединения тегеров заключается в том, что в случае, если один теггер не знает, как пометить слово, оно будет передано связанному теггеру. Для достижения этой целиSequentialBackoffTagger предоставляет нам Backoff tagging характерная черта.

Отложенные теги

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

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

Фактически, каждый подкласс SequentialBackoffTaggerможет принимать аргумент ключевого слова 'backoff'. Значение этого аргумента ключевого слова является еще одним экземпляромSequentialBackoffTagger. Теперь, когда этоSequentialBackoffTaggerкласс инициализируется, будет создан внутренний список тегеров отсрочки (с ним в качестве первого элемента). Более того, если задан тегер отсрочки, будет добавлен внутренний список тегеров отсрочки.

В приведенном ниже примере мы берем DefaulTagger в качестве тега отката в приведенном выше рецепте Python, с помощью которого мы обучили UnigramTagger.

пример

В этом примере мы используем DefaulTaggerкак теггер отсрочки. Когда быUnigramTagger не может пометить слово, теггер отсрочки, т.е. DefaulTaggerв нашем случае пометит его "NN".

from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Uni_tagger = UnigramTagger(train_sentences, backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)

Вывод

0.9061975746536931

Из вышеприведенных выходных данных вы можете заметить, что добавление теггера отсрочки увеличивает точность примерно на 2%.

Сохранение тегеров с рассолом

Как мы видели, обучение теггера очень громоздко и требует времени. Чтобы сэкономить время, мы можем выбрать обученного теггера для использования в дальнейшем. В приведенном ниже примере мы собираемся сделать это с нашим уже обученным теггером с именем‘Uni_tagger’.

пример

import pickle
f = open('Uni_tagger.pickle','wb')
pickle.dump(Uni_tagger, f)
f.close()
f = open('Uni_tagger.pickle','rb')
Uni_tagger = pickle.load(f)

Класс NgramTagger

Из диаграммы иерархии, обсуждаемой в предыдущем разделе, UnigramTagger унаследовано от NgarmTagger class, но у нас есть еще два подкласса NgarmTagger класс -

Подкласс BigramTagger

На самом деле nграмма - это подпоследовательность из n элементов, следовательно, как следует из названия, BigramTaggerподкласс смотрит на два элемента. Первый элемент - это предыдущее помеченное слово, а второй - текущее помеченное слово.

Подкласс TrigramTagger

На той же ноте BigramTagger, TrigramTagger подкласс смотрит на три элемента, то есть на два предыдущих слова с тегами и одно текущее слово с тегами.

Практически, если мы применим BigramTagger и TrigramTaggerподклассы по отдельности, как мы делали с подклассом UnigramTagger, они оба работают очень плохо. Давайте посмотрим на примеры ниже:

Использование подкласса BigramTagger

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

Вывод

0.44669191071913594

Использование подкласса TrigramTagger

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

Вывод

0.41949863394526193

Вы можете сравнить производительность UnigramTagger, который мы использовали ранее (точность около 89%), с BigramTagger (точность около 44%) и TrigramTagger (точность около 41%). Причина в том, что тегеры Bigram и Trigram не могут узнать контекст из первого слова (слов) в предложении. С другой стороны, класс UnigramTagger не заботится о предыдущем контексте и угадывает наиболее распространенный тег для каждого слова, следовательно, может иметь высокую базовую точность.

Объединение тегеров ngram

Как видно из приведенных выше примеров, очевидно, что тегеры Bigram и Trigram могут внести свой вклад, если мы объединим их с тегами отсрочки. В приведенном ниже примере мы комбинируем тегеры Unigram, Bigram и Trigram с тегами отсрочки. Концепция та же, что и в предыдущем рецепте, но объединяет UnigramTagger с теггером backoff. Единственное отличие состоит в том, что мы используем функцию backoff_tagger () из tagger_util.py, приведенную ниже, для операции отсрочки.

def backoff_tagger(train_sentences, tagger_classes, backoff=None):
   for cls in tagger_classes:
      backoff = cls(train_sentences, backoff=backoff)
   return backoff

пример

from tagger_util import backoff_tagger
from nltk.tag import UnigramTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Combine_tagger = backoff_tagger(train_sentences,
[UnigramTagger, BigramTagger, TrigramTagger], backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Combine_tagger.evaluate(test_sentences)

Вывод

0.9234530029238365

Из приведенного выше вывода мы видим, что он увеличивает точность примерно на 3%.