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.