Classifier-based tagger

Một phần của tài liệu TIỂU LUẬN NGÔN NGỮ HỌC MÁY TÍNH PHÂN TÍCH CÚ PHÁP NGÔN NGỮ TỰ NHIÊN VỚI CÔNG CỤ NLTK (NATURAL LANGUAGE TOOLKIT) (Trang 29)

5. TÌM HIỂU MỘT SỐ CHỨC NĂNG TRONG NLTK

5.3.5. Classifier-based tagger

ClassifierBasedPOSTagger là một lớp con của ClassifierBasedTagger thực hiện cài đặt bộ trích đặc trưng kết hợp với nhiều kỹ thuật gán nhãn trước đó tạo thành tập đặc trưng. Bộ trích đặc trưng tìm theo nhiều kích thước hậu tố, sử dụng regular expression, và sử dụng unigram,bigram, trigram history để tạo ra một tập hợp khá đầy đủ các đặc trưng cho mỗi từ. Tập đặc trưng này được huấn luyện vào bộ xử lý phân lớp, và được sử dụng để gán nhãn.

Cách sử dụng của ClassifierBasedPOSTagger hoàn toàn tương tự như các lớp gán nhãn khác gồm 2 bước huấn luyện và phân tích. Dữ liệu đầu huấn luyện là tập các câu cần huấn luyện.

>>> from nltk.tag.sequential import ClassifierBasedPOSTagger >>> tagger = ClassifierBasedPOSTagger(train=train_sents) >>> tagger.evaluate(test_sents)

0.93097345132743359

ClassifierBasedPOSTagger kế thừa từ ClassifierBasedTagger và chỉ hiện thức phương thức feature_detector(). Tất cả còn lại từ lớp cha, nó mặc định huấn luyện

NaiveBayesClassifier với dữ liệu đưa vào và sử dụng gán nhãn từ dựa vào các

đặc trưng được tạo bởi feature_detector(). Có thể sử dụng bộ phân lớp khác như

MaxentClassifier bằng cách truyền vào tham số khởi tạo lớp như sau:

>>> from nltk.classify import MaxentClassifier

>>> me_tagger = ClassifierBasedPOSTagger(train=train_sents, classifier_builder=MaxentClassifier.train)

>>> me_tagger.evaluate(test_sents) 0.93093028275415501

MaxentClassifier nhỉnh hơn NaiveBayesClassifier 1 chút nhưng tốc độ thì khá là chậm. Nếu có thư viện scipy và numpy thì tốc độ sẽ nhanh hơn nhưng vẫn chậm hơn NaiveBayesClassifier.

ClassifierBasedTagger thường được sử dụng nhất, nhưng nó gặp trỡ ngại về tốc độ. Để khắc phục vấn đề này, chúng ta nên sử dụng chúng kết hợp với backoff là các lớp gán nhãn như BrillTagger trong chuổi xử lý của các lớp con của NgramTagger(trong đó có ClassifierBasedTagger).

Tùy chỉnh bộ trích đặc trưng

Có hai cách để thực hiện

- Tạo lớp kế thừa từ ClassifierBasedTagger và cài đặt phương thức feature_detector() như ClassifierBasedPOSTagger.

- Đưa đối số là phương thức feature_detector vào ClassifierBasedTagger khi khởi tạo.

Dù cách nào đi nữa thì phương thúc feature_detector() cũng nhận 3 tham số như phương thức choose_tag(tokens,index,history) nhưng thay vì trả về nhãn của chỉ mục hiện hành, bạn nên trả về một bảng tra key-value thể hiện các đặt trưng và giá trị của chúng.

Ví dụ:

def unigram_feature_detector(tokens, index, history): return {'word': tokens[index]}

>>> from nltk.tag.sequential import ClassifierBasedTagger >>> from tag_util import unigram_feature_detector

>>> tagger = ClassifierBasedTagger(train=train_sents, feature_ detector=unigram_feature_detector)

>>> tagger.evaluate(test_sents) 0.87338657457371038

Xác suất sử dụng backoff

Bình thường bộ phân lớp luôn trả về kết quả tốt nhất có thể, do đó backoff sẽ vô dụng trừ khi bạn đưa vào tham số cutoff_prob để chỉ định ngưỡng xác suất cho phân lớp. Sau đó nếu xác suất gán nhãn nhỏ hơn cutoff_prob, backoff sẽ được sử dụng.

Ví dụ: sử dụng DefaultTagger gán mặc định nhãn NN cho các từ mà xác suất <30%

>>> default = DefaultTagger('NN')

>>> tagger = ClassifierBasedPOSTagger(train=train_sents, backoff=default, cutoff_prob=0.3)

>>> tagger.evaluate(test_sents) 0.93110295704726964

Sử dụng lại bộ phân lớp đã tồn tại

Sử dụng tham số classifier khi khởi tạo lớp để sử dụng. Lúc này classifier_builder và các tham số sử dụng để train được bõ qua.

Một phần của tài liệu TIỂU LUẬN NGÔN NGỮ HỌC MÁY TÍNH PHÂN TÍCH CÚ PHÁP NGÔN NGỮ TỰ NHIÊN VỚI CÔNG CỤ NLTK (NATURAL LANGUAGE TOOLKIT) (Trang 29)

Tải bản đầy đủ (DOCX)

(55 trang)
w