Trình gắn thẻ Bộ công cụ ngôn ngữ tự nhiên hơn

Affix Tagger

Một lớp quan trọng khác của lớp con ContextTagger là AffixTagger. Trong lớp AffixTagger, ngữ cảnh là tiền tố hoặc hậu tố của một từ. Đó là lý do tại sao lớp AffixTagger có thể học các thẻ dựa trên các chuỗi con có độ dài cố định ở phần đầu hoặc phần cuối của một từ.

Làm thế nào nó hoạt động?

Hoạt động của nó phụ thuộc vào đối số có tên là affix_length chỉ định độ dài của tiền tố hoặc hậu tố. Giá trị mặc định là 3. Nhưng làm thế nào nó phân biệt được liệu lớp AffixTagger đã học tiền tố hay hậu tố của từ?

  • affix_length=positive - Nếu giá trị của affix_lenght là dương thì có nghĩa là lớp AffixTagger sẽ học các tiền tố của từ.

  • affix_length=negative - Nếu giá trị của affix_lenght là âm thì có nghĩa là lớp AffixTagger sẽ học các hậu tố của từ.

Để làm rõ hơn, trong ví dụ dưới đây, chúng ta sẽ sử dụng lớp AffixTagger trên các câu ngân hàng cây được gắn thẻ.

Thí dụ

Trong ví dụ này, AffixTagger sẽ học tiền tố của từ vì chúng tôi không chỉ định bất kỳ giá trị nào cho đối số affix_length. Đối số sẽ có giá trị mặc định là 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)

Đầu ra

0.2800492099250667

Hãy để chúng tôi xem trong ví dụ bên dưới độ chính xác sẽ như thế nào khi chúng tôi cung cấp giá trị 4 cho đối số 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)

Đầu ra

0.18154947354966527

Thí dụ

Trong ví dụ này, AffixTagger sẽ học hậu tố của từ vì chúng tôi sẽ chỉ định giá trị âm cho đối số 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)

Đầu ra

0.2800492099250667

Brill Tagger

Brill Tagger là một trình gắn thẻ dựa trên chuyển đổi. NLTK cung cấpBrillTagger lớp là trình gắn thẻ đầu tiên không phải là lớp con của SequentialBackoffTagger. Ngược lại với nó, một loạt các quy tắc để sửa kết quả của một trình gắn thẻ ban đầu được sử dụng bởiBrillTagger.

Làm thế nào nó hoạt động?

Để đào tạo một BrillTagger lớp học sử dụng BrillTaggerTrainer chúng tôi xác định chức năng sau:

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)

Như chúng ta có thể thấy, chức năng này yêu cầu initial_taggertrain_sentences. Nó cần mộtinitial_tagger đối số và danh sách các mẫu, triển khai BrillTemplategiao diện. CácBrillTemplate giao diện được tìm thấy trong nltk.tbl.templatemô-đun. Một trong những cách triển khai như vậy làbrill.Template lớp học.

Vai trò chính của trình gắn thẻ dựa trên chuyển đổi là tạo ra các quy tắc chuyển đổi để điều chỉnh đầu ra của trình gắn thẻ ban đầu để phù hợp hơn với các câu đào tạo. Hãy cho chúng tôi xem quy trình làm việc bên dưới -

Thí dụ

Đối với ví dụ này, chúng tôi sẽ sử dụng combine_tagger mà chúng tôi đã tạo trong khi lược bỏ các trình gắn thẻ (trong công thức trước) từ một chuỗi dự phòng NgramTagger các lớp học, như initial_tagger. Trước tiên, hãy để chúng tôi đánh giá kết quả bằng cách sử dụngCombine.tagger và sau đó sử dụng nó như initial_tagger để đào tạo trình gắn thẻ 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)

Đầu ra

0.9234530029238365

Bây giờ, chúng ta hãy xem kết quả đánh giá khi Combine_tagger Được sử dụng như initial_tagger để đào tạo trình gắn thẻ brill -

from tagger_util import train_brill_tagger
brill_tagger = train_brill_tagger(combine_tagger, train_sentences)
brill_tagger.evaluate(test_sentences)

Đầu ra

0.9246832510505041

Chúng tôi có thể nhận thấy rằng BrillTagger lớp có độ chính xác tăng lên một chút so với Combine_tagger.

Hoàn thành ví dụ triển khai

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)

Đầu ra

0.9234530029238365
0.9246832510505041

Trình gắn thẻ TnT

TnT Tagger, viết tắt của Trigrams'nTags, là một trình gắn thẻ thống kê dựa trên các mô hình Markov bậc hai.

Làm thế nào nó hoạt động?

Chúng ta có thể hiểu hoạt động của trình gắn thẻ TnT với sự trợ giúp của các bước sau:

  • Đầu tiên dựa trên dữ liệu đào tạo, TnT tegger duy trì một số FreqDistConditionalFreqDist các trường hợp.

  • Sau các đơn vị đó, các bát quái và bát quái sẽ được đếm theo các phân bố tần số này.

  • Bây giờ, trong quá trình gắn thẻ, bằng cách sử dụng tần số, nó sẽ tính toán xác suất của các thẻ có thể có cho mỗi từ.

Đó là lý do tại sao thay vì xây dựng chuỗi dự phòng của NgramTagger, nó sử dụng tất cả các mô hình ngram cùng nhau để chọn thẻ tốt nhất cho mỗi từ. Hãy để chúng tôi đánh giá độ chính xác với trình gắn thẻ TnT trong ví dụ sau:

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)

Đầu ra

0.9165508316157791

Chúng tôi có độ chính xác kém hơn một chút so với chúng tôi với Brill Tagger.

Xin lưu ý rằng chúng tôi cần gọi train() trước evaluate() nếu không chúng ta sẽ nhận được độ chính xác 0%.