N-Gram 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 26)

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

5.3.3.N-Gram Tagger

N-gram tagger là một lớp gán nhãn ngữ cảnh(context) tổng quát, nó dựa vào dự sắp xếp tuần tự của các token trong câu, chọn nhãn của token hiện hành dựa vào các nhãn của n tokens trước đó.

Ngữ cảnh ở đây có thể là tập các danh sách các cặp (token,tag) đã được định nghĩa hoặc có sẳn từ trước (gọi là tagged sentences).

Có 3 dạng con của lớp gán nhãn này là UnigramTagger, BigramTagger và TrigramTagger.

UnigramTagger

Bigram chỉ sử dụng token hiện hành để quyết định nhãn kết quả.

ví dụ sử dụng tập dữ liệu có sẵn trong corpus, lấy ra danh sách train_sents sử dụng để train cho tagger.

>>> from nltk.tag import UnigramTagger >>> from nltk.corpus import treebank

>>> train_sents = treebank.tagged_sents()[:3000] >>> test_sents = treebank.tagged_sents()[3000:]

Xem dữ liệu câu đầu tiên

>>> treebank.sents()[0]

['Pierre', 'Vinken', ',', '61', 'years', 'old', ',', 'will', 'join', 'the', 'board', 'as', 'a', 'nonexecutive', 'director', 'Nov.', '29', '.']

Xem dữ liệu nhãn của câu đầu tiên

>>> train_sents[0]

[('Pierre', 'NNP'), ('Vinken', 'NNP'), (',', ','), ('61', 'CD'), ('years', 'NNS'), ('old', 'JJ'), (',', ','), ('will', 'MD'),

('join', 'VB'), ('the', 'DT'), ('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN'), ('Nov.', 'NNP'), ('29', 'CD'), ('.', '.')]

Xây dựng tagger và kiểm tra với câu đầu tiên, kết quả cho ra 100% giống như kết quả ở trên ( do dữ liệu test trùng với dữ liệu train)

>>> tagger = UnigramTagger(train_sents) >>> tagger.tag(treebank.sents()[0]) [('Pierre', 'NNP'), …]

UnigramTagger xây dựng một mô hình ngữ cảnh(context) từ danh sách những câu được gán nhãn. Vì UnigramTagger kế thừa từ ContextTagger do đó thay vì hiện thực phương thức choose_tag() , nó phải làm trên phương thức context() có cùng tham số như choose_tag() và trả về kết quả được sử dụng để tra giá trị nhãn.

- UnigramTagger context() sẽ trả về word hiện hành.

- BigramTagger trả về ((prevtag,), word)

- TrigramTagger trả về ((prevtag1, prevtag2), word). Prevtag là các nhãn của token trước đó.

Kiểm tra độ chính xác

>>> tagger.evaluate(train_sents) 0.9599153668511566

>>> tagger.evaluate(test_sents) 0.8584502482192964

Định nghĩa lại ngữ cảnh

Tất cả các lớp gán nhãn kế thừa từ ContextTagger có thể tự xây dựng lại mô hình thay cho dữ liệu huấn luyện. Mô hình này là một bộ bảng tra (key-value) trong đó value là nhãn. Ví dụ dưới đây định nghĩa lại ngữ cảnh từ mô hình tập huấn luyện thành mô hình đơn giản chỉ gồm một cặp key/value, vì vậy kết quả gán nhãn chỉ gán cho các từ đã đnịh nghĩa, các từ khác mặc định bằng None, tức là không biết nhãn.

>>> tagger = UnigramTagger(model={'Pierre': 'NN'}) >>> tagger.tag(treebank.sents()[0])

[('Pierre', 'NN'), ('Vinken', None), (',', None), ('61', None), ('years', None), ('old', None), (',', None), ('will', None),

('join', None), ('the', None), ('board', None), ('as', None), ('a', None), ('nonexecutive', None), ('director', None), ('Nov.', None), ('29', None), ('.', None)]

Tham số giới hạn số lần xuất hiện

ContextTagger sử dựng tấng suất xuất hiện để quyết định nhãn tốt nhất trong ngữ cảnh cho trước, mặc định nó sẽ quyết định với số lượng tối thiểu số từ và nhãn là một. tham số cutoff cho phép thay đổi giá trị này (adsbygoogle = window.adsbygoogle || []).push({});

>>> tagger = UnigramTagger(train_sents, cutoff=3) >>> tagger.evaluate(test_sents)

0.775350744657889

Khi thay đổi giá trị này lên 3, thì độ chính xác sẽ giảm, tất nhiên vì mặc định của nó là 1, khi lên 3 thì nhiều từ hơn sẽ không được gán nhãn chính xác.

Kết hợp các bộ gán nhãn với backoff.

Gán nhãn backoff là một trong những tính năng chính của SequentialBackoffTagger. Nó cho phép bạn liên kết các bộ gán nhãn cùng với nhau theo cách thực hiện : nếu một bộ gán nhãn không biết nhãn của từ, nó sẽ chuyển sang bộ gán nhãn backoff kế tiếp, quá trình này lặp cho tới khi không còn bộ gán nhãn backoff nào nữa.

Ví dụ sau sử dụng một backoff là DefaultTagger để gán nhãn mặc định cho các từ không biết nhãn là danh từ  tăng độ chính xác 2%.

>>> tagger1 = DefaultTagger('NN')

>>> tagger2 = UnigramTagger(train_sents, backoff=tagger1) >>> tagger2.evaluate(test_sents)

0.87459529462551266

Huấn luyện và kết hợp các bộ gán nhãn Ngram với nhau

Ngram là một chuỗi gồm từ hiện hành và n-1 các nhãn trước đó được sử dụng để làm ngữ cảnh phân tích cho từ hiện hành. Ví dụ: Unigram sử dụng từ hiện hành, Bigram sử dụng từ hiện hành và 1 nhãn trước đó, Trigram sử dụng từ hiện hành và 2 nhãn trước đó.

Một ví dụ để sử dụng NgramTagger là một từ có thể thuộc nhiều nhãn khác nhau: một từ có thể là động từ (verb) vừa là danh từ (noun), do đó để có thể khẳng định chính xác nhãn của nó chúng ta cần các từ trước đó trong câu.

Nếu chỉ sử dụng NgramTagger hiệu quả sẽ rất kém, do chúng không thể học từ ngữ cảnh các từ đầu tiên trong câu. Để có thể khắc phục vấn đề này chúng ta sẽ sử dụng phần mở rộng backoff, backoff sẽ được sử dụng khi các mô hình trước đó không thể tìm ra nhãn.

Định nghĩa hàm tạo một bộ gán nhãn móc xâu như sau

def backoff_tagger(train_sents, tagger_classes, backoff=None): for cls in tagger_classes:

backoff = cls(train_sents, backoff=backoff) return backoff

Sử dụng

>>> from tag_util import backoff_tagger >>> backoff = DefaultTagger('NN')

>>> tagger = backoff_tagger(train_sents, [UnigramTagger, BigramTagger,

TrigramTagger], backoff=backoff) >>> tagger.evaluate(test_sents) 0.88163177206993304

Đoạn code trên sẽ sử dụng 4 bộ gán nhãn liên tục nhau theo thứ tự: trước tiên là sử dụng unigram nếu nó không nhận ra nhãn thì nó sẽ chuyển cho bigram,trigram và cuối cùng là defaultgram. Kết quả tăng thêm 1%.

Phương pháp này có thể sử dụng liên kết cho tất cả các loại bộ gán nhãn cùng kế thừa chung lớp SequentialBackoffTagger.

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 26)