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 하위 클래스는 세 항목, 즉 두 개의 이전 태그 단어와 하나의 현재 태그 단어를 살펴 봅니다.
실제로 신청하면 BigramTagger 과 TrigramTaggerUnigramTagger 하위 클래스에서했던 것처럼 개별적으로 하위 클래스는 성능이 매우 떨어집니다. 아래 예를 살펴 보겠습니다.
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 % 증가하는 것을 볼 수 있습니다.