แท็กชุดเครื่องมือภาษาธรรมชาติเพิ่มเติม

ติดแท็กเกอร์

คลาสย่อยที่สำคัญอีกคลาสของ ContextTagger คือ AffixTagger ในคลาส AffixTagger บริบทคือคำนำหน้าหรือคำต่อท้ายของคำ นั่นคือเหตุผลที่คลาส AffixTagger สามารถเรียนรู้แท็กตามสตริงย่อยที่มีความยาวคงที่ของจุดเริ่มต้นหรือสิ้นสุดของคำ

มันทำงานอย่างไร?

การทำงานขึ้นอยู่กับอาร์กิวเมนต์ชื่อ affix_length ซึ่งระบุความยาวของคำนำหน้าหรือคำต่อท้าย ค่าเริ่มต้นคือ 3 แต่จะแยกแยะได้อย่างไรว่าคลาส AffixTagger เรียนรู้คำนำหน้าหรือคำต่อท้ายหรือไม่?

  • affix_length=positive - หากค่าของ affix_lenght เป็นค่าบวกหมายความว่าคลาส AffixTagger จะเรียนรู้คำนำหน้าของคำ

  • affix_length=negative - ถ้าค่าของ affix_lenght เป็นลบแสดงว่าคลาส AffixTagger จะเรียนรู้คำต่อท้ายของคำ

เพื่อให้ชัดเจนขึ้นในตัวอย่างด้านล่างเราจะใช้คลาส AffixTagger กับประโยค Treebank ที่ติดแท็ก

ตัวอย่าง

ในตัวอย่างนี้ 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

ให้เราดูในตัวอย่างด้านล่างว่าอะไรจะเป็นความแม่นยำเมื่อเราให้ค่า 4 กับอาร์กิวเมนต์ affix_length -

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

Brill Tagger เป็นแท็กเกอร์ตามการเปลี่ยนแปลง NLTK ให้BrillTagger คลาสซึ่งเป็น tagger ตัวแรกที่ไม่ใช่คลาสย่อยของ 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 ซึ่งเราสร้างขึ้นในขณะที่รวม taggers (ในสูตรก่อนหน้า) จาก backoff chain ของ NgramTagger คลาสเช่น initial_tagger. ขั้นแรกให้เราประเมินผลลัพธ์โดยใช้Combine.tagger แล้วใช้เป็น initial_tagger ในการฝึกอบรมแท็กเกอร์ brill

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 ในการฝึกอบรมแท็กเกอร์ brill -

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 Tagger

TnT Tagger ย่อมาจาก Trigrams'nTags คือแท็กเกอร์ทางสถิติซึ่งอิงตามแบบจำลอง Markov ลำดับที่สอง

มันทำงานอย่างไร?

เราสามารถเข้าใจการทำงานของ TnT tagger ด้วยความช่วยเหลือของขั้นตอนต่อไปนี้ -

  • อันดับแรกจากข้อมูลการฝึกอบรม TnT tegger จะเก็บข้อมูลภายในไว้หลายอย่าง FreqDist และ ConditionalFreqDist ตัวอย่าง.

  • หลังจากนั้น unigrams bigrams และ trigrams จะถูกนับโดยการแจกแจงความถี่เหล่านี้

  • ตอนนี้ในระหว่างการแท็กโดยใช้ความถี่จะคำนวณความน่าจะเป็นของแท็กที่เป็นไปได้สำหรับแต่ละคำ

นั่นเป็นเหตุผลว่าทำไมแทนที่จะสร้างห่วงโซ่ backoff ของ 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%