더 많은 Natural Language Toolkit Taggers
태거 부착
ContextTagger 하위 클래스의 또 다른 중요한 클래스는 AffixTagger입니다. AffixTagger 클래스에서 컨텍스트는 단어의 접두사 또는 접미사입니다. 이것이 AffixTagger 클래스가 단어의 시작 또는 끝 부분의 고정 길이 부분 문자열을 기반으로 태그를 학습 할 수있는 이유입니다.
어떻게 작동합니까?
그 작업은 접두사 또는 접미사의 길이를 지정하는 affix_length라는 인수에 따라 다릅니다. 기본값은 3입니다. 그런데 AffixTagger 클래스가 단어의 접두사 또는 접미사를 학습했는지 여부를 어떻게 구별합니까?
affix_length=positive − affix_lenght 값이 양수이면 AffixTagger 클래스가 단어의 접두사를 학습 함을 의미합니다.
affix_length=negative − affix_lenght의 값이 음수이면 AffixTagger 클래스가 단어의 접미사를 학습 함을 의미합니다.
더 명확하게하기 위해 아래 예제에서는 태그가 지정된 트리 뱅크 문장에 AffixTagger 클래스를 사용합니다.
예
이 예에서 AffixTagger는 affix_length 인수에 대한 값을 지정하지 않았기 때문에 단어의 접두사를 학습합니다. 인수는 기본값 3을 사용합니다-
from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Prefix_tagger = AffixTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Prefix_tagger.evaluate(test_sentences)
산출
0.2800492099250667
affix_length 인수에 값 4를 제공 할 때 정확도가 무엇인지 아래 예제에서 살펴 보겠습니다.
from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Prefix_tagger = AffixTagger(train_sentences, affix_length=4 )
test_sentences = treebank.tagged_sents()[1500:]
Prefix_tagger.evaluate(test_sentences)
산출
0.18154947354966527
예
이 예에서 AffixTagger는 affix_length 인수에 음수 값을 지정하므로 단어의 접미사를 학습합니다.
from nltk.tag import AffixTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Suffix_tagger = AffixTagger(train_sentences, affix_length = -3)
test_sentences = treebank.tagged_sents()[1500:]
Suffix_tagger.evaluate(test_sentences)
산출
0.2800492099250667
브릴 태거
Brill Tagger는 변형 기반 태거입니다. NLTK는BrillTagger 하위 클래스가 아닌 첫 번째 태거 클래스 SequentialBackoffTagger. 반대로, 초기 태거의 결과를 수정하는 일련의 규칙은BrillTagger.
어떻게 작동합니까?
훈련하려면 BrillTagger 사용하는 수업 BrillTaggerTrainer 다음 함수를 정의합니다.
def train_brill_tagger(initial_tagger, train_sentences, **kwargs) −
templates = [
brill.Template(brill.Pos([-1])),
brill.Template(brill.Pos([1])),
brill.Template(brill.Pos([-2])),
brill.Template(brill.Pos([2])),
brill.Template(brill.Pos([-2, -1])),
brill.Template(brill.Pos([1, 2])),
brill.Template(brill.Pos([-3, -2, -1])),
brill.Template(brill.Pos([1, 2, 3])),
brill.Template(brill.Pos([-1]), brill.Pos([1])),
brill.Template(brill.Word([-1])),
brill.Template(brill.Word([1])),
brill.Template(brill.Word([-2])),
brill.Template(brill.Word([2])),
brill.Template(brill.Word([-2, -1])),
brill.Template(brill.Word([1, 2])),
brill.Template(brill.Word([-3, -2, -1])),
brill.Template(brill.Word([1, 2, 3])),
brill.Template(brill.Word([-1]), brill.Word([1])),
]
trainer = brill_trainer.BrillTaggerTrainer(initial_tagger, templates, deterministic=True)
return trainer.train(train_sentences, **kwargs)
보시다시피이 기능에는 initial_tagger 과 train_sentences. 그것은 걸립니다initial_tagger 인수 및 템플릿 목록. BrillTemplate상호 작용. 그만큼BrillTemplate 인터페이스는 nltk.tbl.template기준 치수. 그러한 구현 중 하나는brill.Template 수업.
변환 기반 태거의 주요 역할은 초기 태거의 출력이 학습 문장과 더 일치하도록 수정하는 변환 규칙을 생성하는 것입니다. 아래 워크 플로를 보겠습니다.
예
이 예에서는 combine_tagger 백 오프 체인에서 (이전 레시피에서) 태거를 결합하면서 생성 한 NgramTagger 클래스, initial_tagger. 먼저 다음을 사용하여 결과를 평가하겠습니다.Combine.tagger 다음으로 사용 initial_tagger 브릴 타거를 훈련시키기 위해.
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
이제 평가 결과를 살펴 보겠습니다. Combine_tagger 다음과 같이 사용됩니다. initial_tagger 브릴 타거를 훈련하기 위해-
from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)
산출
0.9246832510505041
우리는 BrillTagger 클래스에 비해 정확도가 약간 증가했습니다. Combine_tagger.
완전한 구현 예
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)
from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)
산출
0.9234530029238365
0.9246832510505041
TnT 태거
Trigrams'nTags의 약자 인 TnT Tagger는 2 차 Markov 모델을 기반으로하는 통계 태거입니다.
어떻게 작동합니까?
우리는 다음 단계를 통해 TnT tagger의 작동을 이해할 수 있습니다.
먼저 훈련 데이터를 기반으로 TnT tegger는 여러 내부 FreqDist 과 ConditionalFreqDist 인스턴스.
그 유니 그램 이후에는 이러한 주파수 분포에 의해 bigram 및 trigram이 계산됩니다.
이제 태깅하는 동안 빈도를 사용하여 각 단어에 대해 가능한 태그의 확률을 계산합니다.
그것이 NgramTagger의 백 오프 체인을 구성하는 대신 모든 ngram 모델을 함께 사용하여 각 단어에 가장 적합한 태그를 선택하는 이유입니다. 다음 예제에서 TnT tagger로 정확도를 평가 해 보겠습니다.
from nltk.tag import tnt
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
tnt_tagger = tnt.TnT()
tnt_tagger.train(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
tnt_tagger.evaluate(test_sentences)
산출
0.9165508316157791
Brill Tagger로 얻은 것보다 정확도가 약간 떨어집니다.
전화를해야합니다. train() 전에 evaluate() 그렇지 않으면 0 %의 정확도를 얻을 수 있습니다.