Bộ công cụ ngôn ngữ tự nhiên - Kết hợp trình gắn thẻ
Kết hợp trình gắn thẻ
Kết hợp các trình gắn thẻ hoặc trình gắn thẻ chuỗi với nhau là một trong những tính năng quan trọng của NLTK. Khái niệm chính đằng sau việc kết hợp các trình gắn thẻ là, trong trường hợp nếu một trình gắn thẻ không biết cách gắn thẻ một từ, thì nó sẽ được chuyển cho trình gắn thẻ theo chuỗi. Để đạt được mục đích này,SequentialBackoffTagger cung cấp cho chúng tôi Backoff tagging đặc tính.
Gắn thẻ dự phòng
Như đã nói trước đó, gắn thẻ dự phòng là một trong những tính năng quan trọng của SequentialBackoffTagger, cho phép chúng tôi kết hợp các trình gắn thẻ theo cách mà nếu một người gắn thẻ không biết cách gắn thẻ một từ, thì từ đó sẽ được chuyển cho trình gắn thẻ tiếp theo và cứ tiếp tục như vậy cho đến khi không còn trình gắn thẻ dự phòng nào để kiểm tra.
Làm thế nào nó hoạt động?
Trên thực tế, mọi lớp con của SequentialBackoffTaggercó thể lấy một đối số từ khóa 'backoff'. Giá trị của đối số từ khóa này là một trường hợp khác củaSequentialBackoffTagger. Bây giờ bất cứ khi nàoSequentialBackoffTaggerlớp được khởi tạo, một danh sách bên trong các trình kích hoạt dự phòng (với chính nó là phần tử đầu tiên) sẽ được tạo. Hơn nữa, nếu một trình gắn thẻ dự phòng được cung cấp, danh sách nội bộ của trình gắn thẻ dự phòng này sẽ được thêm vào.
Trong ví dụ dưới đây, chúng tôi đang lấy DefaulTagger như trình gắn thẻ dự phòng trong công thức Python ở trên mà chúng tôi đã đào tạo UnigramTagger.
Thí dụ
Trong ví dụ này, chúng tôi đang sử dụng DefaulTaggernhư người gắn thẻ backoff. Bất cứ khi nàoUnigramTagger không thể gắn thẻ một từ, trình gắn thẻ lùi, tức là DefaulTagger, trong trường hợp của chúng tôi, sẽ gắn thẻ nó bằng '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)
Đầu ra
0.9061975746536931
Từ kết quả trên, bạn có thể quan sát thấy rằng bằng cách thêm một trình gắn thẻ dự phòng, độ chính xác được tăng lên khoảng 2%.
Tiết kiệm người gắn thẻ với dưa chua
Như chúng ta đã thấy rằng việc đào tạo một người gắn thẻ là rất phức tạp và cũng cần nhiều thời gian. Để tiết kiệm thời gian, chúng tôi có thể chọn một người gắn thẻ được đào tạo để sử dụng nó sau này. Trong ví dụ bên dưới, chúng tôi sẽ thực hiện việc này với trình gắn thẻ đã được đào tạo của chúng tôi có tên‘Uni_tagger’.
Thí dụ
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)
Lớp NgramTagger
Từ sơ đồ phân cấp đã thảo luận trong phần trước, UnigramTagger được thừa kế từ NgarmTagger nhưng chúng ta có thêm hai lớp con của NgarmTagger lớp học -
Lớp con BigramTagger
Trên thực tế, một ngram là một dãy con của n mục, do đó, như tên của nó, BigramTaggerlớp con xem xét hai mục. Mục đầu tiên là từ được gắn thẻ trước đó và mục thứ hai là từ được gắn thẻ hiện tại.
Lớp con TrigramTagger
Trên cùng một ghi chú của BigramTagger, TrigramTagger lớp con xem xét ba mục tức là hai từ được gắn thẻ trước đó và một từ được gắn thẻ hiện tại.
Thực tế nếu chúng ta áp dụng BigramTagger và TrigramTaggercác lớp con riêng lẻ như chúng ta đã làm với lớp con UnigramTagger, cả hai đều hoạt động rất kém. Hãy cho chúng tôi xem trong các ví dụ dưới đây:
Sử dụng BigramTagger Subclass
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)
Đầu ra
0.44669191071913594
Sử dụng lớp con 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)
Đầu ra
0.41949863394526193
Bạn có thể so sánh hiệu suất của UnigramTagger, chúng tôi đã sử dụng trước đây (cho độ chính xác khoảng 89%) với BigramTagger (cho độ chính xác khoảng 44%) và TrigramTagger (cho độ chính xác khoảng 41%). Lý do là các trình gắn thẻ Bigram và Trigram không thể học ngữ cảnh từ (các) từ đầu tiên trong câu. Mặt khác, lớp UnigramTagger không quan tâm đến ngữ cảnh trước đó và đoán thẻ phổ biến nhất cho mỗi từ, do đó có thể có độ chính xác cơ sở cao.
Kết hợp các trình gắn thẻ ngram
Như từ các ví dụ trên, rõ ràng là các trình gắn thẻ Bigram và Trigram có thể đóng góp khi chúng tôi kết hợp chúng với gắn thẻ dự phòng. Trong ví dụ dưới đây, chúng tôi đang kết hợp các trình gắn thẻ Unigram, Bigram và Trigram với gắn thẻ dự phòng. Khái niệm này giống như công thức trước khi kết hợp UnigramTagger với trình gắn thẻ dự phòng. Sự khác biệt duy nhất là chúng tôi đang sử dụng hàm có tên backoff_tagger () từ tagger_util.py, được cung cấp bên dưới, cho hoạt động dự phòng.
def backoff_tagger(train_sentences, tagger_classes, backoff=None):
for cls in tagger_classes:
backoff = cls(train_sentences, backoff=backoff)
return backoff
Thí dụ
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)
Đầu ra
0.9234530029238365
Từ kết quả trên, chúng ta có thể thấy nó tăng độ chính xác lên khoảng 3%.