Tích hợp văn bản: Ngữ nghĩa của một câu riêng biệt có thể phụ thuộc vào những câu đứng trước, đồng thời nó cũng có thể ảnh hưởng đến các câu phía sau.. Mô hình phân tích cấu trúc văn phạ
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
BÁO CÁO THU HOẠCHNGÔN NGỮ HỌC MÁY TÍNH
Tháng 04 năm 2012
Trang 2PHÂN TÍCH CÚ PHÁP NGÔN NGỮ TỰ
NHIÊN VỚI CÔNG CỤ NLTK
(NATURAL LANGUAGE TOOLKIT)
Trang 3GIỚI THIỆU
Ngôn ngữ học máy tính là một ngành học trong lĩnh vực trí tuệ nhân tạo tập trung vào
tất cả các khia cạnh liên quan tới ngôn ngữ của con người và con người với máy tính
Đây là một ngành nghiên cứu có phạm vi khá rộng, nó liên quan chặc chẽ đến các
ngành khác trong trí tuệ nhân tạo
Theo yêu cầu đề tài môn “Ngôn Ngữ Học Máy Tính” và sự định hướng của thầy, TS
Nguyễn Tuấn Đăng em quyết định thực hiện bài nghiên cứu về “PHÂN TÍCH CÚ
PHÁP NGÔN NGỮ TỰ NHIÊN VỚI CÔNG CỤ NLTK (NATURAL
LANGUAGE TOOLKIT)” Mục tiêu chính của bài nghiên cứu này là tìm hiểu một
số nguyên lý và cách phân tích cú pháp trong bằng cách sử dụng bộ thư viện NLTK
trong python với 3 bước cơ bản sau:
- Tiền xử lý dữ liệu thô.
- Gán nhãn từ.
- Phân tích cú pháp.
Em xin chân thành gửi lời cám ơn và chúc sức khỏe đến thầy, TS Nguyễn Tuấn Đăng
đã tạo điều kiện cho em thực hiện bài nghiên cứu này
TP HCM, Ngày 07 tháng 04 năm 2012
Đỗ Văn Cang
Trang 4GIỚI THIỆU 2
1 XỬ LÝ NGÔN NGỮ TỰ NHIÊN 4
1.1 Định nghĩa 4
1.2 Các bước xử lý 4
1.3 Các bài toán ứng dụng 4
2 CÀI ĐẶT NLTK VÀ TỔNG QUAN CHỨC NĂNG 5
2.1 Cài đặt NLTK 5
2.2 Các tính năng 6
2.3 Mô hình phân tích cấu trúc văn phạm 7
3 CÁC NGUYÊN LÝ ỨNG DỤNG 8
3.1 Phân lớp văn bản (Text Classification) 8
3.1.1 Phân lớp có giám sát (Supervised Classification) 9
3.1.2 Cây quyết định (Decision Trees) 9
3.1.3 Phân lớp Naive Bayes 11
3.1.4 Phân lớp Maximum Entropy 13
3.2 Mô hình Markov ẩn 14
3.2.1 Mô hình Markov ẩn là gì? 14
3.2.2 Định nghĩa mô hình HMM 15
3.2.3 Ứng dụng HMM: 16
3.2.4 Ứng dụng vào gán nhãn trong NLTK 17
3.3 Tách câu với Punkt sentence tokenizer 18
3.4 Văn phạm phi ngữ cảnh (Context Free Grammar) 20
3.4.1 Định nghĩa 20
3.4.2 Hệ phái sinh (derivation) 22
4 TÌM HIỂU MỘT SỐ CHỨC NĂNG TRONG NLTK 23
4.1 Tách câu (sentences tokenization) 23
4.2 Tách từ (word tokenization) 23
4.3 Gán nhãn (tagging) 24
4.3.1 The Default Tagger 24
4.3.2 The Regular Expression Tagger 25
4.3.3 N-Gram Tagger 25
4.3.4 Affix tagger 28
4.3.5 Classifier-based tagger 28
4.3.6 TnT tagger 30
4.3.7 Brill tagger (transformational rule-based) 31
4.3.8 HMM Tagger 32
4.4 Parsing (phân tích cấu trúc câu) 34
4.4.1 Văn phạm phi ngữ cảnh (Context Free Grammar) 34
4.4.2 Recursive Descent Parsing 38
4.4.3 Shift-Reduce Parsing 42
4.4.4 The Left-Corner Parser 45
4.4.5 Chart Parsing: Well-Formed Substring Tables 46
4.4.6 Văn phạm phụ thuộc 50
5 KẾT LUẬN 52
Tài liệu tham khảo 52
Trang 52 XỬ LÝ NGÔN NGỮ TỰ NHIÊN
2.1 Định nghĩa
Xử lý ngôn ngữ tự nhiên (natural language processing - NLP) là một nhánh của trí
tuệ nhân tạo tập trung vào các ứng dụng trên ngôn ngữ của con người Trong trí tuệ
nhân tạo thì xử lý ngôn ngữ tự nhiên là một trong những phần khó nhất vì nó liên
quan đến việc phải hiểu ý nghĩa ngôn ngữ-công cụ hoàn hảo nhất của tư duy và
giao tiếp
2.2 Các bước xử lý
Phân tích hình thái: Trong bước này từng từ sẽ được phân tích và các ký tự
không phải chữ (như các dấu câu) sẽ được tách ra khỏi các từ Trong tiếng
Anh và nhiều ngôn ngữ khác, các từ được phân tách với nhau bằng dấu
cách Tuy nhiên trong tiếng Việt, dấu cách được dùng để phân tách các tiếng
(âm tiết) chứ không phải từ Cùng với các ngôn ngữ như tiếng Trung, tiếng
Hàn,tiếng Nhật, phân tách từ trong tiếng Việt là một công việc không hề đơn
giản
Phân tích cú pháp: Dãy các từ sẽ được biến đổi thành các cấu trúc thể hiện
sự liên kết giữa các từ này Sẽ có những dãy từ bị loại do vi phạm các luật
văn phạm
Phân tích ngữ nghĩa: Thêm ngữ nghĩa vào các cấu trúc được tạo ra bởi bộ
phân tích cú pháp
Tích hợp văn bản: Ngữ nghĩa của một câu riêng biệt có thể phụ thuộc vào
những câu đứng trước, đồng thời nó cũng có thể ảnh hưởng đến các câu
phía sau.
Phân tích thực nghĩa: Cấu trúc thể hiện điều được phát ngôn sẽ được thông
dịch lại để xác định nó thật sự có nghĩa là gì
Tuy nhiên, ranh giới giữa 5 bước xử lý này cũng rất mong manh Chúng có thể
được tiến hành từng bước một, hoặc tiến hành cùng lúc - tùy thuộc vào giải thuật và
ngữ cảnh cụ thể
2.3 Các bài toán ứng dụng
Nhận dạng chữ viết: Có hai kiểu nhận dạng, thứ nhất là nhận dạng chữ in, ví
dụ nhận dạng chữ trên sách giáo khoa rồi chuyển nó thành dạng văn bản
điện tử như dưới định dạng doc của Microsoft Word chẳng hạn Phức tạp
hơn là nhận dạng chữ viết tay, có khó khăn bởi vì chữ viết tay không có
khuôn dạng rõ ràng và thay đổi từ người này sang người khác Với chương
trình nhận dạng chữ viết in có thể chuyển hàng ngàn đầu sách trong thư viện
thành văn bản điện tử trong thời gian ngắn Nhận dạng chữ viết của con
người có ứng dụng trong khoa học hình sự và bảo mật thông tin (nhận dạng
chữ ký điện tử)
Nhận dạng tiếng nói: Nhận dạng tiếng nói rồi chuyển chúng thành văn bản
tương ứng Giúp thao tác của con người trên các thiết bị nhanh hơn và đơn
giản hơn, chẳng hạn thay vì gõ một tài liệu nào đó bạn đọc nó lên và trình
soạn thảo sẽ tự ghi nó ra Đây cũng là bước đầu tiên cần phải thực hiện trong
ước mơ thực hiện giao tiếp giữa con người với robot Nhận dạng tiếng nói có
khả năng trợ giúp người khiếm thị rất nhiều
Tổng hợp tiếng nói: Từ một văn bản tự động tổng hợp thành tiếng nói Thay
vì phải tự đọc một cuốn sách hay nội dung một trang web, nó tự động đọc
Trang 6cho chúng ta Giống như nhận dạng tiếng nói, tổng hợp tiếng nói là sự trợ
giúp tốt cho người khiếm thị, nhưng ngược lại nó là bước cuối cùng trong
giao tiếp giữa robot với người
Dịch tự động (machine translate): Như tên gọi đây là chương trình dịch tự
động từ ngôn ngữ này sang ngôn ngữ khác Một phần mềm điển hình về
tiếng Việt của chương trình này là Evtrans của Softex, dịch tự động từ tiếng
Anh sang tiếng Việt và ngược lại, phần mềm từng được trang web vdict.com
mua bản quyền, đây cũng là trang đầu tiên đưa ứng dụng này lên mạng
Tháng 10 năm 2008 có hai công ty tham gia vào lĩnh vực này cho ngôn ngữ
tiếng Việt là công ty Lạc Việt (công ty phát hành từ điển Lạc Việt) và Google,
một thời gian sau đó Xalo.vn cũng đưa ra dịch vụ tương tự
Tìm kiếm thông tin (information retrieval): Đặt câu hỏi và chương trình tự tìm
ra nội dung phù hợp nhất Thông tin ngày càng đầy lên theo cấp số nhân, đặc
biệt với sự trợ giúp của internet việc tiếp cận thông tin trở lên dễ dàng hơn
bao giờ hết Việc khó khăn lúc này là tìm đúng nhất thông tin mình cần giữa
bề bộn tri thức và đặc biệt thông tin đó phải đáng tin cậy Các máy tìm kiếm
dựa trên giao diện web như Google hay Yahoo hiện nay chỉ phân tích nội
dung rất đơn giản dựa trên tần suất của từ khoá và thứ hạng của trang và
một số tiêu chí đánh giá khác để đưa ra kết luận, kết quả là rất nhiều tìm kiếm
không nhận được câu trả lời phù hợp, thậm chí bị dẫn tới một liên kết không
liên quan gì do thủ thuật đánh lừa của các trang web nhằm giới thiệu sản
phẩm (có tên tiếng Anh là SEO viết tắt của từ search engine optimization)
Thực tế cho đến bây giờ chưa có máy tìm kiếm nào hiểu được ngôn ngữ tự
nhiên của con người trừ trang www.ask.com được đánh giá là “hiểu” được
những câu hỏi có cấu trúc ở dạng đơn giản nhất Mới đây cộng đồng mạng
đang xôn xao về trang Wolfram Alpha, được hứa hẹn là có khả năng hiểu
ngôn ngữ tự nhiên của con người và đưa ra câu trả lời chính xác[1] Lĩnh vực
này hứa hẹn tạo ra bước nhảy trong cách thức tiếp nhận tri thức của cả cộng
đồng
Tóm tắt văn bản: Từ một văn bản dài tóm tắt thành một văn bản ngắn hơn
theo mong muốn nhưng vẫn chứa những nội dung thiết yếu nhất
Khai phá dữ liệu (data mining) và phát hiện tri thức: Từ rất nhiều tài liệu khác
nhau phát hiện ra tri thức mới Thực tế để làm được điều này rất khó, nó gần
như là mô phỏng quá trình học tập, khám phá khoa học của con người, đây là
lĩnh vực đang trong giai đoạn đầu phát triển Ở mức độ đơn giản khi kết hợp
với máy tìm kiếm nó cho phép đặt câu hỏi để từ đó công cụ tự tìm ra câu trả
lời dựa trên các thông tin trên web mặc cho việc trước đó có câu trả lời lưu
trên web hay không (giống như trang Yahoo! hỏi và đáp, nơi chuyên đặt các
câu hỏi để người khác trả lời), nói một cách nôm na là nó đã biết xử lý dữ liệu
để trả lời câu hỏi của người sử dụng, thay vì máy móc đáp trả những gì chỉ
có sẵn trong bộ nhớ
Hệ thống hỏi trả lời (Question Answering)
3 CÀI ĐẶT NLTK VÀ TỔNG QUAN CHỨC NĂNG
3.1 Cài đặt NLTK
Các yêu cầu cụ thể cài đặt bộ thư viện NLTK tham khảo tại địa chỉ sau
http://www.nltk.org/download Sau khi cài đặt xong Python, chúng ta có thể cài các
thư viện bằng bộ xài trực tiếp hoặc build và cài từ source (không phụ thuộc hệ đều
hành) bằng lệnh sau, thực hiện với đường dẫn làm việc là thư mục nguồn
Trang 7python setup.py install
Các phần mềm yêu cầu cơ bản
Python Bài viết này sử dụng Python 2.7.x
NLTK Sử dụng version 2.x.x
NLTK-Data Chứa dữ liệu ví dụ và các dữ liệu thư viện đã được học
NumPy Thư viên tính toán hỗ trợ mảng đa chiều và đại số tuyến tính cần thiết
cho các xử lý xác suất, tagging, clustering, và classification
Matplotlib Thư viên vẽ sơ đồ trực quan được sử dụng minh họa trong NLTK
NetworkX Lưu trữ và tính toán tên mạng,đồ thị bao gồm đỉnh và cạnh, sử dụng
Graphviz cho thể hiên giao diện.
Prover9 Hỗ trợ nghiên cứu tự động suy diễn
3.2 Các tính năng
NLTK là một bộ thư viện, chương trình trợ rất mạnh mẽ xử lý ngôn ngữ tự nhiên
(NLP) bằng tất cả các kỹ thuật có thể có một cách trực tiếp hoặc gián tiếp trong
ngôn ngữ python Nó bao gồm tất cả các ví dụ, dữ liệu mẫu và các ứng dụng trình
diễn bằng đồ họa NLTK rất thích hợp cho các sinh viên học về NLP hoặc nghiên
cứu trong lĩnh vực NLP hoặc các lĩnh vực liên quan chặt chẽ như : ngôn ngữ học
thực nghiêm, khoa học nhận thức, trí tuệ nhân tạo, rút trích(tìm kiếm) thông tin, máy
học NLTK đã được sử dụng thành công như một công cụ giảng dạy,như một công
cụ nghiên cứu cá nhân, và như là một nền tảng cho các hệ thống nghiên cứu tạo
mẫu và xây dựng
Một số modules quan trọng của NLTK
Accessing corpora Chuẩn hóa giao diện đoạn
Collocation
discovery
Khám phá cụm từ: t-test, squared, point-wise mutual information
EM k-means
nltk.classify nltk.cluster
Chunking regular expression
n-gramnamed-entity
nltk.chunk
feature-based unification probabilistic,dependency
nltk.parse
Trang 8Tách câu Sentence segmentation (nltk.tokenize)
Tách từ Tokenization (nltk.tokenize)
Gán nhãn từ Tagging (nltk.tag)
Xác định thành phần Entity detection
Xác định quan hệ Relation detection
Chuẩn hóa từ
Stemming, Lemmatization
(nltk.stem)
Phân tích cú pháp Parsing
Structure sentence (list of trees)
Tokenized sentences (list of lists of strings)
Sentences (list of strings)
Semantic
interpretation lambda calculus, first-order logic, model checking nltk.semnltk.inference
Evaluation metrics precision, recall, agreement
Applications graphical concordancer, parsers,
WordNet browser, chatbots
nltk.appnltk.chatLinguistic fieldwork manipulate data in SIL Toolbox
Mallet Machine Learning - http://mallet.cs.umass.edu/
3.3 Mô hình phân tích cấu trúc văn phạm
Có thể nói rằng với hệ thống đồ sộ các thư viên trong NLTK, chúng ta có thể thực
hiện nhiều việc trong nhiều lĩnh vực khác nhau như đã đề cập phần 1.2, tuy nhiên
trong phạm vi bài tiểu luận này em tập trung chính vào việc phân tích cú pháp của
văn phạm nên em chỉ đưa ra mô hình phân tích đơn giản như sau:
Trang 94 CÁC NGUYÊN LÝ ỨNG DỤNG
4.1 Phân lớp văn bản (Text Classification)
Trong các mô hình xử lý ngôn ngữ tự nhiên, các mô hình dựa trên lý thuyết thống kê
là một phần rất quan trọng và mang tính thực tiễn cao Bởi vì ngôn ngữ tự nhiên qua
đa dạng để có thể sử dụng mô hình nào đó để áp dụng với độ chính xác cao Đó
cũng chính là chỗ khắc phục các yếu điểm của các mô hình khác của phương pháp
thống kê
Phân lớp
Cho tập các mẫu đã phân lớp trước, xây dựng mô hình cho từng lớp
Mục đích: Gán các mẫu mới vào các lớp với độ chính xác cao nhất có thể
Cho tập dữ liệu D = {t1,t2,…,tn} và tập các lớp C = {C1,….,Cm}, phân lớp là
bài toán xác định ánh xạ f: DC sao cho mỗi ti được gán vào một lớp Cj
Lưu ý: trong mỗi một phần tử dữ liệu sẽ chứa tập các thuộc tính của dữ
liệu Các thuộc tính này là các cột trong cơ sở dữ liệu hoặc là các đặc
trưng của các thể hiện đối tượng.
Phân lớp văn bản là các phương pháp phân lớp dựa trên nội dung của văn bản, nó
liên quan đến quá trình máy học thực hiện trên nội dung của văn bản để ra quyết
định cho các băn bản mới Giả sử chúng ta đã có khái niệm và am hiểu về khái niệm
phân lớp (trong lĩnh vực máy học), phần phân lớp văn bản này sẽ tìm hiểu một số
phương pháp phân lớp sử dụng cho phân lớp văn bản về xử lý ngôn ngữ tự nhiên
Ví dụ mình họa tập dữ liệu phân lớp trong đó C (Class)= {C1,C2}={yes,no}
Trang 104.1.1 Phân lớp có giám sát (Supervised Classification)
Một phân lớp được gọi là giám sát nếu nó được xây dựng trên cơ sở tập văn bản
huấn luyện chứa các nhãn chính xác cho mỗi đầu vào Sơ đồ khung được sử dụng
bởi phân lớp có giám sát như sau:
Feature extractor: lấy các đặc trưng (featutes) từ tập đầu vào.
Gồm 2 quá trình: quá trình huấn luyện(a) và quá trình dự đoán(b).
Huấn luyện: cặp bộ (đặc trưng,nhãn) được đưa vào các thuật toán máy học
để tạo ra mô hình Dữ liệu huấn luyện được phân tích bởi thuật tóan phân lớp
( có thuộc tính nhãn lớp)
Dự đoán: các đặc trưng được đưa vào mô hình để dự đoán ra kết quả các
nhãn.Dữ liệu kiểm tra được dùng để ước lượng độ chính xác của bộ phân
lớp Nếu độ chính xác là chấp nhận được thì có thể dùng bộ phân lớp để
phân lớp các mẫu dữ liệu mới
Độ chính xác (accuracy): Độ chính xác của bộ phân lớp trên tập kiểm tra
cho trước là phần trăm của các mẫu trong tập kiểm tra được bộ phân lớp xếp
lớp đúng
4.1.2 Cây quyết định (Decision Trees)
Cấu tạo cây quyết định: gồm 3 thành phần chính
Node không kết thúc: phép kiểm thử (test) trên một thuộc tính
Node kết thúc (lá) : nhãn/mô tả của một lớp (class label)
Nhánh từ một node không kết thúc: kết quả của một phép thử trên thuộc tính
tương ứng
Accuracy= correctly classified test sample
total number of test sampl
Trang 11Chiến lược cơ bản xây dựng cây:
Bắt đầu từ node đơn biểu diễn tất cả các mẫu
Thuật toán cơ bản
o Xây dựng một cây đệ quy phân chia và xác định đặc tính từ trên xuống
o Nếu các mẫu thuộc về cùng một lớp, node trở thành node lá và được
gán nhãn bằng lớp đó
o Ngược lại, dùng độ đo thuộc tính để chọn thuộc tính sẽ phân tách tốt
nhất các mẫu vào các lớp
o Một nhánh được tạo cho từng giá trị của thuộc tính được chọn và các
mẫu được phân hoạch theo tập giá trị đó
o Tiến trình kết thúc chỉ khi bất kỳ điều kiện nào sau đây là đúng
Tất cả các mẫu thuộc về cùng một lớp
Không còn thuộc tính nào nữa để phân chia
Không còn mẫu nào để phân lớp
Nhiều dạng khác nhau: ID3, C4.5, CART, CHAID
o Điểm khác biệt chính: tiêu chuẩn/thuộc tính phân chia, độ đo để chọn
lựa
Các độ đo thuộc tính
Độ đo Information Gain (ID3)
o Thuộc tính tương ứng với information gain lớn nhất sẽ được chọn
làm thuộc tính phân chia cho node N
o Lượng thông tin cần để phân loại một phần tử trong D (= Entropy của
Trang 12 Lượng thông tin này sẽ cho biết mức độ trùng lắp giữa các phân
hoạch, nghĩa là một phân hoạch chứa các phần tử từ một lớp hay nhiều lớp khác nhau
Mong đợi: InfoA(D) càng nhỏ càng tốt.
o Information gain chính là độ sai biệt giữa trị thông tin Info(D) ban đầu
(trước phân hoạch) và trị thông tin mới InfoA(D) (sau phân hoạch với
A)
Độ đo Gain Ratio (C4.5)
o Chuẩn hoá information gain với trị thông tin phân tách (split
information): SplitInfoA(D)
o Thuộc tính phân chia A tương ứng với trị GainRatio(A) là trị lớn nhất.
Độ đo Gini Index (CART)
o Sự phân tách nhị phân (binary split) cho mỗi thuộc tính A:
A ∈ S A ?
S A là một tập con gồm một hay v-1 trị thuộc tính A
o Gini index của một thuộc tính là trị nhỏ nhất tương ứng với một tập con
S A từ 2v – 2 tập con
o Thuộc tính phân chia tương ứng với gini index nhỏ nhất để tối đa hóa
sự suy giảm về độ trùng lắp giữa các phân hoạch
4.1.3 Phân lớp Naive Bayes
Phương pháp phân loại dựa trên xác suất
Định lý Bayes
o X: một tuple/đối tượng (evidence)
o H: giả thuyết (hypothesis)
Trang 13 Ví dụ: P(age=young, income=high) là xác suất khách hàng có
tuổi “young” và thu nhập “high”
P(age=young, income=high) = 2/14 = 0.143
o P(H), P(X|H), P(X) có thể được tính từ tập dữ liệu cho trước
o P(H|X) được tính từ định lý Bayes
Cho trước tập dữ liệu huấn luyện D với mô tả (nhãn) của các lớp Ci, i=1 m,
quá trình phân loại một tuple/đối tượng X = (x1, x2, …, xn) với mạng
Bayesian như sau:
o X được phân loại vào Ci nếu và chỉ nếu
P(C i|X) > P(C j|X) với 1<=j<=m, j<>i
Tối đa hóa P(Ci|X) (i.e chọn Ci nếu P(Ci|X) là trị lớn nhất)
Tối đa hóa P(X|Ci)P(Ci)
P( xk| Ci)= P (x1| Ci)∗ P( x2| Ci)∗ .∗P( xn| Ci)
Trang 14 P(X k| C i) tuân theo một phân bố xác suất nào đó (ví dụ: phân
bố Gauss)
Nếu P(X k| C i) = 0 thì P(X|C i) = 0!!!
4.1.4 Phân lớp Maximum Entropy
Khái niệm entropy: Trong cây quyết định, ta đã nhìn qua cách tính entropy (Infor),
vậy thì entropy là gì? Entropy là một đại lượng dùng để đo lượng thông tin không
chắc chắn (uncertaincy) của một biến cố hay một phân phối ngẫu nhiên cho trước
Ví dụ:
Một dòng chữ luôn chỉ có các ký tự "a" sẽ có entropy bằng 0, vì ký tự tiếp
theo sẽ luôn là "a"
Một dòng chữ chỉ có hai ký tự 0 và 1 ngẫu nhiên hoàn toàn sẽ có entropy là 1
bit cho mỗi ký tự
Entropy của biến ngẫu nhiên
Entropy của một biến ngẫu nhiên X cũng là giá trị mong đợi của các độ ngẫu nhiên
của các giá trị mà X có thể nhận
Xét một biến ngẫu nhiên X có phân phối:
Công thức tính Entropy của X:
Nhận xét:
Một phân phối xác suất càng lệch nhiều (có xác xuất rất nhỏ và rất lớn) thì
tính không chắc chắn càng nhỏ => entropy càng thấp
Trang 15 Một phân phối xác suất càng đều thì tính không chắc chắn càng lớn =>
entropy càng cao
Định lý cực đại của Entropy:
Ta có: H(p1,p2,…,pM)<=log(M)
Trong đó: đẳng thức xảy ra khi và chỉ khi p1=p2=…=pM=1/M, khi đó entropy đạt giá
trị cực đại (do thời gian giới hạn em xin phép không trình bày chi tiết mô hình này).
4.2 Mô hình Markov ẩn
4.2.1 Mô hình Markov ẩn là gì?
Mô hình Markov ẩn (tiếng Anh là Hidden Markov Model - HMM) là mô hình thống kê
trong đó hệ thống được mô hình hóa được cho là một quá trình Markov với các
tham số không biết trước và nhiệm vụ là xác định các tham số ẩn từ các tham số
quan sát được, dựa trên sự thừa nhận này Các tham số của mô hình được rút ra
sau đó có thể sử dụng để thực hiện các phân tích kế tiếp, ví dụ cho các ứng dụng
nhận dạng mẫu
Trong một mô hình Markov điển hình, trạng thái được quan sát trực tiếp bởi người
quan sát, và vì vậy các xác suất chuyển tiếp trạng thái là các tham số duy nhất Mô
hình Markov ẩn thêm vào các đầu ra: mỗi trạng thái có xác suất phân bổ trên các
biểu hiện đầu ra có thể Vì vậy, nhìn vào dãy của các biểu hiện được sinh ra bởi
HMM không trực tiếp chỉ ra dãy các trạng thái
Đây là một mô hình toán thống kê có ứng dụng rộng rãi trong Tin học và sinh học
Các chuyển tiếp trạng thái trong mô hình Markov ẩn
Giả sử tôi có một người bạn sống ở rất xa Hàng ngày chúng tôi gọi điện thoại cho
nhau và anh ta kể cho tôi nghe anh ta đã làm gì trong ngày Người bạn tôi chỉ có 3
công việc mà anh thích làm là 1) đi dạo, 2) đi chợ và 3) dọn phòng Hiển nhiên là sự
lựa chọn phải làm gì thì phụ thuộc trực tiếp vào thời tiết hôm đấy thế nào Như vậy,
tôi không nhận được thông tin cụ thể về thời tiết nơi anh bạn tôi sống nhưng tôi lại
biết về xu hướng chung Dựa vào lời kể của công việc hàng ngày của anh ta, tôi có
thể đoán về thời tiết hôm đó
Như vậy, thời tiết được vận hành như một chuỗi Markov cụ thể Có 2 trạng thái thời
tiết, "Mưa" và "Nắng", nhưng tôi không quan sát trực tiếp, do đó, chúng là ẩn đối với
tôi Vào mỗi ngày, anh bạn tôi sẽ làm một trong các việc sau phụ thuộc vào thời tiết
hôm đó là "đi dạo", "đi chợ" và "dọn phòng" Vì anh bạn tôi đã tường thuật lại hoạt
động của mình, đó là các dữ liệu quan sát Toàn bộ hệ thống này là một mô hình
Markov ẩn (HMM)
trạng thái = ('Mưa', 'Nắng')
Trang 16dữ liệu quan sát = ('đi dạo', 'đi chợ', 'dọn phòng')
'Mưa' : {'đi dạo': 0.1, 'đi chợ': 0.4, 'dọn phòng': 0.5},
'Nắng' : {'đi dạo': 0.6, 'đi chợ': 0.3, 'dọn phòng': 0.1},
}
Trong đoạn câu lệnh trên, khả_năng_ban_đầu cho thấy tôi không chắc về trạng thái
HMM khi người bạn đầu tiên gọi điện cho tôi (tất cả cái tôi biết là trời có vẻ
mưa).khả_năng_chuyển_dịch cho thấy những thay đổi về thời tiết trong chuỗi
Markov Trong ví dụ này, chỉ có 30% khả năng ngày mai trời sẽ nắng nếu hôm nay
trời mưa.Khả_năng_loại_bỏ cho thấy anh bạn thích làm những việc gì mỗi ngày
Nếu trời mưa thì có đến 50% khả năng anh bạn này sẽ dọn phòng, trong khi trời
nắng thì 60% khả năng anh ta sẽ đi dạo
4.2.2 Định nghĩa mô hình HMM
Trong đó
Trang 184.2.4 Ứng dụng vào gán nhãn trong NLTK
Mô hình Markov ẩn (HMMs) chủ yếu sử dụng để gán các chuỗi nhãn chính xác dữ
liệu tuần tự hoặc đánh giá xác suất của một nhãn và chuỗi dữ liệu Những mô hình
này là những trạng thái (status) giới hạn đặc trưng bởi trạng thái và sự thay đổi các
trạng thái, và các ký hiệu (symbols) ứng với từng trạng thái HMM là một phần mở
rộng chuỗi Markov, nơi mà mỗi trạng thái quyết định một sự kiện nhất định Trong
Trang 19HMM quan sát là một chức năng thống kê các trạng thái HMMs chia sẻ những giả
định của chuỗi Markov, là xác suất của quá trình chuyển đổi từ một trạng thái này
sang một trạng thái khác phụ thuộc vào trạng thái hiện tại - tức là hàng loạt của các
trạng thái đã dẫn đến trạng thái hiện tại không được sử dụng Chúng bất biến về
thời gian
HMM là một đồ thị có hướng, với các cạnh xác suất có trọng số (đại diện cho xác
suất của một quá trình chuyển đổi giữa các trạng thái nguồn và bên dưới), mỗi đỉnh
đại diện cho một kí hiệu đầu ra khi nhập vào Các kí hiệu (quan sát) không tạo ra
quyết định Vì lý do này, mà một chuỗi các quan sát đầu ra được tạo ra bởi một
HMM cho trước chưa chắc đúng với trình tự các trang thái được biết đến
Một cách hình thức, HMM có thể được đặc trưng bởi
Các kí hiệu chữ cái đầu ra (symbols) Đây là tập hợp các kí hiệu mà có thể là
quan sát như đầu ra của hệ thống
Tập các trạng thái (states)
Xác xuất chuyển đổi aij : xác suất chuyển đổi tới mỗi trạng thái từ trạng thái
cho trước
Ma trận chuẩn đổi trạng thái A = {aij}
Ma trận xác suất quan sát B = {bj(k)}: xác suất quan sát mỗi kí hiệu trong một
trạng thái nhất định
Phân phối trạng thái ban đầu π i, điều này xác định xác suất bắt đầu của mỗi
trạng thái
Chúng ta hãy xét trong ngữ cảnh gán nhãn từ HMM thực hiện với mong muốn xác
suất cao nhất của dãy nhãn có thể được tính cho một chuỗi câu đầu vào Điều này
khác với kỹ thuật gán nhãn khác thường chỉ quan tâm tới các từ đơn lẻ, tìm kiếm để
tối ưu hóa mỗi nhãn riêng biệt một cách tham lam mà không có liên quan đến sự kết
hợp tối ưu của các nhãn cho một đơn vị lớn hơn,chẳng hạn như một câu HMM thực
hiện điều này với các thuật toán Viterbi, mà hiệu quả tính toán đường đi tối
ưu thông qua các đồ thị của những dãy từ cho trước và 3 tham số còn lại nhận
được từ quá trình huấn luyện Với những thông tin này xác suất của một câu cho
trước có thể dễ dàng nhận được, bằng cách đơn giản tính tổng xác suất của mỗi
đường dẫn phân biệt thông qua mô hình Tương tự xác suất nhẫn tuần tự có thể
nhận được với thuật toán Viterbi, với các trạng thái là các nhẫn tuần tự
4.3 Tách câu với Punkt sentence tokenizer
Tách câu trong văn bản là bước đầu tiên sau bước thu thập dữ liệu văn bản từ các
nguồn dữ liệu văn bản Ứng với mỗi ngôn ngữ khác nhau, có rất nhiều cách để tách
câu ra từ một bài văn, từ những cách đơn giản nhất tới những cách hiệu quả nhất
cho từng loại ngôn ngữ Tuy nhiên,về cơ bản thì việc tách câu sẽ phụ thuộc vào các
kí tự kết thúc câu hay còn gọi là period, các dấu kết thúc này bao gồm các kí hiệu
như “.!?”… Vấn đề khó khăn xuất hiện là trong một số ngôn ngữ (trong đó có tiếng
anh) thì các kí tự kết thúc này cũng tồn tại bên trong một câu Do đó nhiều phương
pháp khá hiệu quả khác ra đời đề thực hiện việc này, phương pháp hiệu quả sử
dụng thường bằng phương pháp thống kê dựa trên các nội dung trước đó và toàn
bộ văn phạm, ý nghĩa của chữ viết
NLTK hầu hư hỗ trợ tất cả các phương pháp tách câu như, tuy nhiên ở đây chúng ta
sẽ nói về phương pháp khá hiệu quả được sử dụng mặc định trong NLTK đó là
Trang 20phương pháp “Punkt sentence tokenizer” Phương pháp này sử dụng theo nguyên lý
“Unsupervised Multilingual Sentence Boundary Detection [1]” được nghiên cứu
bởi các tác giả Kiss, Tibor and Strunk, Jan (2006)
Nguyên lý này thể hiện một cách tiếp cận độc lập ngôn ngữ, không có giám sát để
phát hiện ranh giới câu Nó dựa trên việc xác định các chữ viết tắt Thay vì việc
dựa vào toàn bộ văn phạm và ý nghĩa của chữ viết, hệ thống sẽ chỉ cần phát hiện
các chữ viết tắt với độ chính xác cao bằng cách sử dụng 3 tiêu chí mà chỉ cần
những thông tin về những loại ứng viên riêng và độc lập với ngữ cảnh:
Chữ viết tắt có thể được định nghĩa như là cụm từ rất chặt chẽ bao gồm từ
viết tắt và một dấu chấm cuối cùng (từ viết tắt trước dấu chấm và dấu chấm
của chính nó)
Chữ viết tắt thường ngắn
Từ viết tắt đôi khi có dấu chấm nội bộ
Chúng ta cũng thấy rằng sự sắp xếp rõ ràng của các cụm từ cho hai lưu ý khác
quan trọng của định hướng ranh giới câu, cụ thể là phát hiện các chữ và số thứ tự
Các thuật toán cơ bản đã được xác định bằng thực nghiệm trên mười một ngôn
ngữ: tiếng Anh, Bồ Đào Nha, Hà Lan, Estonia, Pháp, Đức, Ý, Na Uy, Tây Ban Nha,
Thụy Điển, và Thổ Nhĩ Kỳ với độ chính xác trung bình là 98,74%
Trong giai đoạn đầu tiên, một giải pháp được thực hiện trên cấp độ loại để phát
hiện loại từ viết tắt và các loại từ bình thường Sau khi giai đoạn này, văn bản nhận
một chú thích trung gian, nơi mà tất cả các trường hợp của chữ viết tắt được phát
hiện bởi các giai đoạn đầu tiên được đánh dấu như vậy với <A> thẻ và tất cả các
lược từ(phần thiếu của từ) với nhãn <E> Tất cả dấu chấm theo sau từ không viết tắt
được giả sử là mốc chỉ ranh giới câu và nhận được sự chú thích
Trang 214.4 Văn phạm phi ngữ cảnh (Context Free Grammar)
Rất nhiều ngôn ngữ quan trọng,ví dụ như ngôn ngữ lập trình, không thể được mô tả
bởi hữu hạn automata và các biểu thức chuẩn mực
Một cách định nghĩa chung nhất về mô hình cụm từ (constituent) gọi là
CFG = Context-Free Grammar = Phrase Structure Grammar
= BNF = Backus-Naur Form.
Ý tưởng cơ bản về văm phạm về cấu trúc cụm từ được nghiên cứu bởi Wilhem
Wundt (1890), nhưng không chính thức cho đến khi Chomsky (1956), và
độc lập bởi Backus (1959)
Phi ngữ cảnh là gì ?
Ta có quy tắc: A B C
Trong quy tắc trên, có thể viết A như BC, mà không phụ thuộc vào ngữ cảnh mà ta
tìm thấy A Do đó gọi là phi ngữ cảnh Các quy tắc văn phạm cấu trúc ngữ đoạn bao
gồm: quy tắc viết lại, luân phiên, tùy chọn, bắt buộc, quy hồi, bổ sung, trật tự…
S là biến đạc biệt ∈ N, gọi là biến khởi đầu văn phạm (start)
Ví dụ: câu “the man took the book” chứa các thành phần sau
Trang 22 Và cuối cùng P là các liên kết từ một nút đến các nút con của nó bằng diễn tả
bằng một luật
Các lưu ý:
Một văn phạm định nghĩa theo CFG có thể phát sinh ra nhiều câu
Nếu như S => *w với w chỉ gồm các kí hiệu kết thúc, ta nói w là một từ của
Trang 234.4.2 Hệ phái sinh (derivation)
Phương pháp top-down
Phương pháp bottom-up
Trang 245 TÌM HIỂU MỘT SỐ CHỨC NĂNG TRONG NLTK
5.1 Tách câu (sentences tokenization)
Cấu trúc thô của dữ liệu văn bản là một chuỗi dài các kí tự dữ liệu Chúng được
phân chia theo ngữ nghĩa bởi người viết (nói) bằng các cấp độ như: bài văn, đoạn
văn, câu văn, từ và cuối cùng là kí tự Như vậy bước đầu tiên của chúng ta là làm
cách nào để chia các đoạn văn, bài văn thành các câu văn (sentences), đó chính là
bước đầu tiên và cần thiết nhất trong quá trình xử lý dữ liệu văn bản
Bắt đầu với một ví dụ đơn giản như sau, lưu ý chúng ta phải import thư viện nltk
trước khi sử dụng và gọi hàm sent_tokenize của thư viện con tokenize Trong đó
đầu vào là một chuỗi gồm 3 câu tiếng anh phân biệt bởi dấu chấm câu Kết quả cho
ra danh sách 3 chuỗi là 3 câu đã được tách
>>> import nltk
>>> para = "Hello Teacher It's good to see you Thanks for
reading this essay."
>>> nltk.tokenize.sent_tokenize(para)
['Hello Teacher.', "It's good to see you.", 'Thanks for
reading this essay.']
Phương thức sent_tokenize sử dụng một thể hiện của lớp
PunktSentenceTokenizer trong module nltk.tokenize.punkt Thể hiện này đã tạo ra
dựa vào tập dữ liệu đã được huấn luyện và lưu trong file sử dụng để tách các câu
PunktSentenceTokenizer là một lớp sử dụng theo thuật giải không giám sát
“Unsupervised Multilingual Sentence Boundary Detection” xây dựng mô hình cho
các từ viết tắt (abbreviation), các cụm từ (collocations) và các từ bắt đầu câu Sau
đó nó sử dụng mô hình này để tìm ranh giới của câu.Cách tiếp cận này được đánh
giá làm việc khá hiệu quả cho các ngôn ngữ châu âu
Ngoài ra bạn có thể sử dụng RegexpTokenizer để tách 1 chuỗi thành các chuỗi con
sử dụng regular expression
5.2 Tách từ (word tokenization)
Sau khi có được các câu, bước kế tiếp cần làm là tách từ (tokenization) bởi vì từ là
đơn vị nhỏ nhất trong xử lý ngôn ngữ tự nhiên Tất cả các công đoạn xử lý khác luôn
luôn phải bắt đầu với một danh sách các từ trong một câu
Tương tự như tách câu, sử dụng tách từ rất đơn giản
>>> from nltk.tokenize import word_tokenize
>>> word_tokenize('Hello Tearcher.')
['Hello', ' Tearcher ', '.']
Trang 25word_tokenize() là hàm ngắn gọn sử dụng thể hiện của lớp
TreebankWordTokenizer để gọi thực hiện tách từ
>>> from nltk.tokenize import TreebankWordTokenizer
>>> tokenizer = TreebankWordTokenizer()
>>> tokenizer.tokenize('Hello Tearcher.')
TreebankWordTokenizer sử dụng quy tắc Penn Treebank để tách từ Một trong
những quy tắc là tách từ nối với dấu ‘
>>> nltk.word_tokenize("I can't stop")
['I', 'ca', "n't", 'stop']
Các lớp phân tích từ khác kế thừa từ giao diện
TokenizerI ( chứa các phương thức cần hiện
thực tokenize(),batch_tokenize()
- RegexpTokenizer:sử dụng regular
expressions(RE) để thực hiện tách từ,
tham số đầu tiên là pattern sử dụng để
tách, các tham số sau là các tùy chọn mềm
dẽo khác
Có 2 cách sử dụng pattern: khớp theo từ
và khớp theo phân cách từ
- WordPunctTokenizer: là lớp con của RegexTokenizer, bằng cách phân biệt các
kí tự chữ cái và không phải chữ cái với pattern như sau: r'\w+|[^\w\s]+’
>>> from nltk.tokenize import PunktWordTokenizer
>>> tokenizer = PunktWordTokenizer()
>>> tokenizer.tokenize("Can't is a contraction.")
['Can', "'t", 'is', 'a', 'contraction.']
- PunktWordTokenizer(PunktLanguageVars)
Chứa các biến và các RE thường xuyên nhất Phụ thuộc vào từng ngôn ngữ cho
ứng dụng Lớp này có thể mở rộng bằng cách thay đổi các thuộc tính thích hợp sử
5.3.1 The Default Tagger
Default tagging đơn giản gán nhãn mặc định cho tất cả các từ trong câu
>>> from nltk.tag import DefaultTagger
>>> tagger = DefaultTagger('NN')
>>> tagger.tag(['Hello', 'World'])
[('Hello', 'NN'), ('World', 'NN')]
DefaultTagger là một lớp con của SequentialBackoffTagger Tất cả các lớp con của
SequentialBackoffTagger phải cài đặt phương thức choose_tag() gồm 3 tham số:
Trang 261 Danh sách tokens.
2 Vị trí (index) của token hiện hành mà chúng ta muốn phân loại
3 Danh sách các nhãn trước đó đã được phân loại(history)
SequentialBackoffTagger hiện thực phương thức tag(), phương thức này gọi
choose_tag() của lớp con cho các index trong danh sách tokens
Phương thức choose_tag() của DefaultTagger chỉ đơn
giản là trả về nhãn mặc định đã được khởi tạo ban đầu
Nó không quan tâm đến 3 tham số đã nếu ở trên
5.3.2 The Regular Expression Tagger
Regular Expression Tagger sử dụng regular expression để gán nhãn từ, ví dụ, một
số có thể khớp với \d gán nhãn CD(cardinal number), hoặc có thể khớp với hậu tố
“ing” cho các từ có dạng sẳn như động từ tiếp diễn Tuy nhiên hãy cẩn thận vì ngôn
ngữ tự nhiên không luôn tuân theo một số quy tắc cố định Để sử dụng tốt dạng này
ta nên tìm hiểu rõ về cú pháp regular expression
Tạo RegexpTagger bằng danh sách các cặp giá trị (regular expression,nhãn):
>>> patterns = [
(r'^\d+$', 'CD'),
(r'.*ing$', 'VBG'), # gerunds, i.e wondering
(r'.*ment$', 'NN'), # i.e wonderment
(r'.*ful$', 'JJ') # i.e wonderful
]
>>> rt = nltk.tag.RegexpTagger(patterns)
>>> sent = 'wonderful tonight'.split()
>>> rt.tag(sent)
[('wonderful', 'JJ'), ('tonight', None)]
Phương thức gán nhãn của RegexpTagger cực kì đơn giản, nó sẽ duyệt qua tất cả
các regular expression trong chuỗi khởi tạo để so khớp với token hiện hành sử dụng
re.match() nó sẽ trả về nhãn khớp đầu tiên
def choose_tag(self, tokens, index, history):
for regexp, tag in self._regexps:
if re.match(regexp, tokens[index]): # ignore
history
return tag
return None
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 đó
Trang 27Ngữ 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)