แท็กชุดเครื่องมือภาษาธรรมชาติเพิ่มเติม
ติดแท็กเกอร์
คลาสย่อยที่สำคัญอีกคลาสของ 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%