Natural Language Toolkit-Tagger 결합

태거 결합

태거를 결합하거나 태거를 연결하는 것은 NLTK의 중요한 기능 중 하나입니다. 타거 결합의 기본 개념은 한 타거가 단어에 태그를 지정하는 방법을 모르는 경우 연결된 타거에게 전달된다는 것입니다. 이 목적을 달성하기 위해SequentialBackoffTagger 우리에게 제공 Backoff tagging 특색.

백 오프 태깅

앞서 말했듯이 백 오프 태깅은 SequentialBackoffTagger,이를 통해 한 태거가 단어에 태그를 지정하는 방법을 알지 못하는 경우 해당 단어가 확인해야 할 백 오프 태거가 남지 않을 때까지 다음 태거에게 전달되는 방식으로 태거를 결합 할 수 있습니다.

어떻게 작동합니까?

실제로 모든 하위 클래스 SequentialBackoffTagger'백 오프'키워드 인수를 사용할 수 있습니다. 이 키워드 인수의 값은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 클래스의 하위 클래스가 두 개 더 있습니다. NgarmTagger 클래스-

BigramTagger 하위 클래스

실제로 ngram은 n 항목의 하위 시퀀스이므로 이름에서 알 수 있듯이 BigramTagger하위 클래스는 두 항목을 살펴 봅니다. 첫 번째 항목은 이전 태그 단어이고 두 번째 항목은 현재 태그 단어입니다.

TrigramTagger 하위 클래스

같은 메모에 BigramTagger, TrigramTagger 하위 클래스는 세 항목, 즉 두 개의 이전 태그 단어와 하나의 현재 태그 단어를 살펴 봅니다.

실제로 신청하면 BigramTaggerTrigramTaggerUnigramTagger 하위 클래스에서했던 것처럼 개별적으로 하위 클래스는 성능이 매우 떨어집니다. 아래 예를 살펴 보겠습니다.

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 tagger 결합

위의 예에서와 같이 Bigram 및 Trigram 태거는 백 오프 태깅과 결합 할 때 기여할 수 있습니다. 아래 예에서는 Unigram, Bigram 및 Trigram 태거를 백 오프 태깅과 결합하고 있습니다. 개념은 이전 레시피와 동일하며 UnigramTagger와 backoff tagger를 결합합니다. 유일한 차이점은 백 오프 작업을 위해 아래에 주어진 tagger_util.py의 backoff_tagger ()라는 함수를 사용하고 있다는 것입니다.

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 % 증가하는 것을 볼 수 있습니다.