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 BigramTaggerTrigramTaggercá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%.