ชุดเครื่องมือภาษาธรรมชาติ - Unigram Tagger
Unigram Tagger คืออะไร?
ตามความหมายของชื่อ unigram tagger คือแท็กเกอร์ที่ใช้เพียงคำเดียวเป็นบริบทในการกำหนดแท็ก POS (Part-of-Speech) พูดง่ายๆ Unigram Tagger คือแท็กเกอร์ตามบริบทที่มีบริบทเป็นคำเดียวคือ Unigram
มันทำงานอย่างไร?
NLTK จัดเตรียมโมดูลที่ชื่อ UnigramTaggerเพื่อจุดประสงค์นี้. แต่ก่อนที่จะลงลึกในการทำงานให้เราเข้าใจลำดับชั้นด้วยความช่วยเหลือของแผนภาพต่อไปนี้ -
จากแผนภาพด้านบนเป็นที่เข้าใจว่า UnigramTagger สืบทอดมาจาก NgramTagger ซึ่งเป็นคลาสย่อยของ ContextTaggerซึ่งสืบทอดมาจาก SequentialBackoffTagger.
การทำงานของ UnigramTagger อธิบายด้วยความช่วยเหลือของขั้นตอนต่อไปนี้ -
อย่างที่เราเห็น UnigramTagger สืบทอดมาจาก ContextTaggerมันใช้ context()วิธี. นี้context() วิธีการใช้สามอาร์กิวเมนต์เดียวกันกับ choose_tag() วิธี.
ผลของ context()วิธีการจะเป็นโทเค็นคำที่ใช้ในการสร้างแบบจำลองต่อไป เมื่อสร้างแบบจำลองแล้วโทเค็นคำจะถูกใช้เพื่อค้นหาแท็กที่ดีที่สุด
ทางนี้, UnigramTagger จะสร้างแบบจำลองบริบทจากรายการประโยคที่ติดแท็ก
การฝึก Unigram Tagger
NLTK ของ UnigramTaggerสามารถฝึกได้โดยให้รายการประโยคที่ติดแท็กในขณะเริ่มต้น ในตัวอย่างด้านล่างเราจะใช้ประโยคที่ติดแท็กของคลังข้อมูลธนาคารต้นไม้ เราจะใช้ 2500 ประโยคแรกจากคลังข้อมูลนั้น
ตัวอย่าง
ก่อนอื่นให้นำเข้าโมดูล UniframTagger จาก nltk -
from nltk.tag import UnigramTagger
จากนั้นนำเข้าคลังข้อมูลที่คุณต้องการใช้ ที่นี่เรากำลังใช้คลังข้อมูลธนาคารต้นไม้ -
from nltk.corpus import treebank
ตอนนี้ใช้ประโยคสำหรับการฝึกอบรม เราใช้ 2500 ประโยคแรกเพื่อจุดประสงค์ในการฝึกอบรมและจะแท็ก -
train_sentences = treebank.tagged_sents()[:2500]
จากนั้นใช้ UnigramTagger กับประโยคที่ใช้เพื่อการฝึกอบรม -
Uni_tagger = UnigramTagger(train_sentences)
ใช้บางประโยคไม่ว่าจะเท่ากับหรือน้อยกว่าที่นำมาเพื่อวัตถุประสงค์ในการฝึกอบรมเช่น 2500 เพื่อการทดสอบ ที่นี่เราใช้ 1,500 คนแรกเพื่อการทดสอบ -
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sents)
เอาต์พุต
0.8942306156033808
ที่นี่เรามีความแม่นยำประมาณ 89 เปอร์เซ็นต์สำหรับแท็กเกอร์ที่ใช้การค้นหาคำเดียวเพื่อกำหนดแท็ก POS
ตัวอย่างการใช้งานที่สมบูรณ์
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
เอาต์พุต
0.8942306156033808
การลบล้างโมเดลบริบท
จากแผนภาพด้านบนแสดงลำดับชั้นสำหรับ UnigramTaggerเรารู้จักแท็กเกอร์ทั้งหมดที่สืบทอดมาจาก ContextTaggerแทนที่จะฝึกด้วยตนเองสามารถใช้แบบจำลองที่สร้างไว้ล่วงหน้า โมเดลที่สร้างไว้ล่วงหน้านี้เป็นเพียงการแมปพจนานุกรม Python ของคีย์บริบทไปยังแท็ก และสำหรับUnigramTaggerคีย์บริบทคือคำแต่ละคำในขณะที่คำอื่น ๆ NgramTagger คลาสย่อยมันจะเป็นทูเปิล
เราสามารถลบล้างโมเดลบริบทนี้ได้โดยส่งโมเดลพื้นฐานอื่นไปยังไฟล์ UnigramTaggerชั้นเรียนแทนที่จะผ่านชุดฝึก ให้เราเข้าใจโดยใช้ตัวอย่างง่ายๆด้านล่าง -
ตัวอย่าง
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’})
Override_tagger.tag(treebank.sents()[0])
เอาต์พุต
[
('Pierre', None),
('Vinken', 'NN'),
(',', None),
('61', None),
('years', None),
('old', None),
(',', None),
('will', None),
('join', None),
('the', None),
('board', None),
('as', None),
('a', None),
('nonexecutive', None),
('director', None),
('Nov.', None),
('29', None),
('.', None)
]
เนื่องจากโมเดลของเรามี 'Vinken' เป็นคีย์บริบทเพียงอย่างเดียวคุณสามารถสังเกตได้จากผลลัพธ์ด้านบนว่ามีเพียงคำนี้เท่านั้นที่มีแท็กและคำอื่น ๆ ทุกคำไม่มีเป็นแท็ก
การกำหนดเกณฑ์ความถี่ขั้นต่ำ
สำหรับการตัดสินใจว่าแท็กใดมีแนวโน้มมากที่สุดสำหรับบริบทหนึ่ง ๆ ContextTaggerคลาสใช้ความถี่ของการเกิดขึ้น มันจะทำตามค่าเริ่มต้นแม้ว่าคำบริบทและแท็กจะเกิดขึ้นเพียงครั้งเดียว แต่เราสามารถกำหนดเกณฑ์ความถี่ขั้นต่ำได้โดยส่งcutoff ค่า UnigramTaggerชั้นเรียน ในตัวอย่างด้านล่างเรากำลังส่งผ่านค่าคัตออฟในสูตรก่อนหน้าซึ่งเราฝึก UnigramTagger -
ตัวอย่าง
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences, cutoff = 4)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
เอาต์พุต
0.7357651629613641