1. Trang chủ
  2. » Luận Văn - Báo Cáo

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)

55 3,7K 20

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 55
Dung lượng 2,61 MB

Nội dung

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 2

PHÂN TÍCH CÚ PHÁP NGÔN NGỮ TỰ

NHIÊN VỚI CÔNG CỤ NLTK

(NATURAL LANGUAGE TOOLKIT)

Trang 3

GIỚ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 4

GIỚ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 5

2 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 6

cho 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 7

python 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 8

Tá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 9

4 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: DC 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 10

4.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 11

Chiế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 16

dữ 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 18

4.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 19

HMM 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 20

phươ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 21

4.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 23

4.4.2 Hệ phái sinh (derivation)

Phương pháp top-down

Phương pháp bottom-up

Trang 24

5 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 25

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

1 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 27

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)

Ngày đăng: 11/04/2015, 15:07

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w