!"
#$%&'(
)''*'(+
, /0,1.23456
780,1. 9$:.;./
<=> ?@@?@@A
'BC ;DE78F(EG;H
EI./@A.:JK@?K
!"
#$%&'(
)''*'(+
2
2
%
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ề “ !
" # $% & '( )'
'*'(+L3Mụ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:
- ,M.NOPQRSP,TUVEW3
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ể.
K3c3I8ad,VDI.e./Rf./
• 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
4
4
ướ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 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ự
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)
5
5
c3 g'($hi6
c3?3d,jkV'(
Các yêu cầu cụ thể cài đặt bộ thư viện NLTK tham khảo tại địa chỉ sau
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.
python setup.py install
Các phần mềm yêu cầu cơ bản
El.JMJ m,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
o;CE0,p cho thể hiên giao diện.
Prover9 Hỗ trợ nghiên cứu tự động suy diễn.
c3K3I8VZ.E.:./
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
trJq;.=
.PVt38P;==,uw
.PVt38PU=Vqo
Chunking regular expression nltk.chunk
6
6
I8E8YU
2q.Vq.8q=q/Jq.V;V,D.
).PVt3VDtq.,pq+
I8EVX
Dtq.,p;V,D.
).PVt3VDtq.,pq+
I..E<.VX
;//,./
).PVt3V;/+
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)
EY.VZ8E8[CEIC
;o=,./
).PVt3C;o=q+
mSP,TU0:.a VEW
;zqNV)=Vo,./+
POS-tag sentence (list of lists of tuples)
Chunked sentence
Relation (list of tuples)
một số thự viện sau:
Weka Classsifiers - />Stanford NLP - />TADM -
Megam - />Mallet Machine Learning - />c3c3WE{.ECEY.VZ8E8|UVo[80:.CEvJ
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:
7
7
A3 #'^im&
A3?3EY.PBC0:.a )qNVP;==,u,8;V,D.+
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ê.
EY.PBC
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 m}~V?sVKs•sV.€ và tập các lớp }~?s•3sJ€, 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.
EY.PBC0:.a 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}
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 độ jDVEU„8VZ.E để 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.
10
10
I8j„jDVEU„8VZ.E
• Độ đo Information Gain (ID3)
o Thuộc tính tương ứng với ,.uDoJ;V,D./;,.PB..E|V 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
D): Info(D)
pi: xác suất để 1 phần tử bất kỳ trong D thuộc về lớp Ci với i =
1 m
: tập các phần tử của lớp Ci trong D
o Lượng thông tin cần để phân loại một phần tử trong D dựa trên thuộc
tính A: InfoA(D)
Thuộc tính A dùng phân tách D thành v phân hoạch {D1, D2, …,
Dj, …, Dv}.
Mỗi phân hoạch Dj gồm |Dj| phần tử trong D.
Lượng thông tin này sẽ cho biết mức độ trùng lắp giữa các phân
“high”.
o P(X|H): posterior probability
Xác suất có điều kiện của X đối với H.
Ví dụ: P(age=young, income=high|buys_computer=yes) là xác
suất khách hàng mua máy tính có tuổi “young” và thu nhập
“high”.
• P(age=young, income=high|buys_computer=yes) = 0
• P(age=young, income=high|buys_computer=no) = 2/5 =
0.4
o P(H): prior probability
Xác suất của H
Ví dụ: P(buys_computer=yes) là xác suất mua máy tính của
khách hàng nói chung
• P(buys_computer=yes) = 9/14 = 0.643
• P(buys_computer=no) = 5/14 = 0.357
o P(X): prior probability
Xác suất của X
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.
12
12
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(|X) > P(|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)
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.
14
14
_.EPQ8ƒ8jv,8ˆ;*.VoDCw:
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).
A3K3WE{.E;otD0Š.
A3K3?3 WE{.E;otD0Š.Pd/{‹
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
Ví dụ mô hình Markov.
- x — Các trạng thái trong mô hình
Markov
- a — Các xác suất chuyển tiếp
- b — Các xác suất đầu ra
- y — Các dữ liệu quan sát
$ZRf
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.
A3K3K3 _.E./E`;JWE{.E
Trong đó
16
16
A3K3c3 i./Rf./
Ứng dụng của HMM tập trung vào 3 vấn đề
,-,xUwyV0|.jMVEe?
,-,xUwyV0|.jMVEeK
,-,xUwyV0|.jMVEec
17
17
A3K3A3 i./Rf./0dD/I..E<.VoD./'(
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
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
18
18
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
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à
phương pháp “Punkt sentence tokenizer”. Phương pháp này sử dụng theo nguyên lý
19
19
“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 8|Cj„ PDv, để 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
S = {Sentence}
N = {Sentence,NP,VP,Verb}
T = {the,man,took,book}
P = {
Sentence NP VP
VP Verb NP
Verb took
NP Det N
Det the
N man | book
}
Có thể hình dung dễ dàng được trên cây văn phạm bên cạnh như sau:
là các nút lá
là các nút không phải nút lá
2 là nút gốc
Và cuối cùng 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.
21
21
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
văn phạm G.
• Tập hợp tât cả các từ như vậy tạo thành một ngôn ngữ tương ứng với CFG
G, kí hiệu là L(G).
• Ngôn ngữ này thuộc loại văn phạm phi ngữ cảnh context-free grammar.
o L(G) = {w | w chỉ gồm các chốt | S=>*w}
• Chuỗi phù hợp với LG được gọi là hợp văn phạm (GRAMMARTICAL).
ví dụ các từ vựng ví dụ về văn phạm
22
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.
H3K3I8EVX)zDoRVDtq.,p;V,D.+
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 ', '.']
word_tokenize() là hàm ngắn gọn sử dụng thể hiện của lớp
oqqa;.t“DoRDtq.,pqo để gọi thực hiện tách từ
24
24
>>> 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
Dtq.,pqo ( chứa các phương thức cần hiện
thực tokenize(),batch_tokenize()
- RegexpTokenizer:sử dụng regular
25
25