Avoid signed/unsigned char pitfalls when calling viet_is* functions
[vspell.git] / thesis / main.tex
blob666389fc98a4832d7aedc21140836eb8d4a7b8e9
1 \documentclass[a4paper,oneside,14pt]{extbook} % -*- coding: vietnamese-utf8 mode: latex -*-
2 \usepackage[utf8]{vietnam}
3 \renewcommand{\rmdefault}{utm}
4 \renewcommand{\sfdefault}{uhv}
5 \renewcommand{\ttdefault}{ucr}
7 \usepackage[vmargin={3cm,3.5cm},hmargin={3.5cm,2cm}]{geometry}
8 \usepackage{graphicx}
9 \usepackage{amsmath}
10 %TOC
11 \usepackage[vietnam]{minitoc}
12 \usepackage{tabularx}
13 \usepackage{footnote}
14 \usepackage{tipa}
15 %\usepackage{fancyvrb}
16 %\usepackage{subfigure}
17 %\usepackage{longtable}
19 %\usepackage{theorem}
20 %\theoremstyle{break}
21 %\newtheorem{algo}{Thuật toán}
23 %\setlength{\parskip}{1.2ex plus 0.7ex minus 0.6ex}
24 \usepackage{setspace}
25 \usepackage{fancyhdr}
26 \usepackage[sideway]{rotating} % sideway tables
29 %TOC
30 \setcounter{minitocdepth}{4}
31 %TOC
32 \setlength{\mtcindent}{12pt}
34 %\usepackage{tocloft}
35 %\newcommand{\listalgo}{Danh sách thuật toán}
36 %\newlistof{algo}{algo}{\listalgo}
37 \usepackage{float} % fancy floats
38 \floatstyle{boxed}
39 \newfloat{algo}{htbp}{loa}[chapter]
40 \floatname{algo}{Thuật toán}
42 \usepackage{varioref}
43 \def\reftextfaceafter{ở trang kế tiếp}
44 \def\reftextfacebefore{ở trang đối diện}
45 \def\reftextafter{ở trang kế tiếp}
46 \def\reftextbefore{ở trang trước}
47 \def\reftextcurrent{ở trang này}
48 \def\reftextfaraway#1{ở trang~\pageref{#1}}
49 \def\reftextpagerange#1#2{ở các trang~\pageref{#1}--\pageref{#2}}%
50 \def\reftextlabelrange#1#2{\ref{#1} đến~\ref{#2}}%
52 \newcommand{\note}[1]{\underline{#1}}
53 \newcommand{\comment}[1]{}
55 \title{Chương trình bắt lỗi chính tả tiếng Việt}
56 \author{Nguyễn Thái Ngọc Duy\\0012020}
58 \begin{document}
59 \begin{spacing}{1.24}
61 %TOC
62 \dominitoc
63 %\doparttoc
64 %\maketitle
65 %\large
67 \begin{titlepage}
68 \begin{center}
69 \Large Lời cảm ơn
70 \end{center}
71 Lời đầu tiên em xin chân thành cảm ơn thầy Đinh Điền, người đã trực tiếp hướng dẫn em hoàn thành luận văn này. Thầy là người đã truyền thụ cho em rất nhiều kiến thức về tin học và ngôn ngữ học, giúp em có được hiểu biết sâu hơn về một trong các ứng dụng có ý nghĩa vô cùng to lớn trong cuộc sống của tin học –-- vấn đề dịch máy.
73 Em cũng xin chân thành cảm ơn các thầy cô trong khoa Công nghệ thông tin đã tận tình chỉ bảo và giúp đỡ cho em trong suốt thời gian em học đại học và hỗ trợ em trong quá trình thực hiện luận văn.
75 Con xin chân thành cảm ơn ba mẹ, các anh và những người thân trong gia đình đã nuôi dạy, tạo mọi điều kiện tốt nhất cho con học tập và động viên con trong thời gian thực hiện luận văn.
77 Và cuối cùng, xin gởi lời cảm ơn đến tất cả bạn bè và nhất là các bạn trong nhóm VCL (Vietnamese Computational Linguistics), những người đã giúp đỡ và hỗ trợ trong quá trình hoàn thiện luận văn này.
79 %% Xin chân thành cảm ơn TS. Đinh Điền đã tận tình hướng dẫn, giúp đỡ
80 %% trong quá trình làm luận văn. Ngoài ra xin cảm ơn các thành viên
81 %% trong nhóm VCL đã hỗ trợ, động viên hoàn thành luận văn này.
82 \vskip 1cm
83 \begin{flushright}
84 Tp. Hồ Chí Minh, tháng 7 năm 2004
86 Nguyễn Thái Ngọc Duy --- 0012020
87 \end{flushright}
88 \end{titlepage}
90 \tableofcontents
91 %%\eject\addcontentsline{toc}{chapter}{\listfigurename}
92 \listoffigures
93 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}\listfigurename}
95 %%\eject\addcontentsline{toc}{chapter}{\listtablename}
96 \listoftables
97 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}\listtablename}
99 %%\eject\addcontentsline{toc}{chapter}{Danh sách thuật toán}
100 %%%\listof{algo}{Danh sách thuật toán}
101 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}Danh sách thuật toán}
104 %% \chapter{Giới thiệu}
105 %% \label{cha:intro}
106 %% \begin{center}
108 %% I kept the right ones out
110 %% And let the wrong ones in
112 %% Had an angel of mercy
114 %% To see me through all my sins
116 %% There were times in my life
118 %% When I was goin' insane
120 %% Tryin' to walk through the pain
122 %% ****
124 %% And when I lost my grip
126 %% And I hit the floor
128 %% Yeah, I thought I could leave
130 %% But couldn't get out the door
132 %% I was so sick n' tired
134 %% Of livin' a lie
136 %% I was wishing that I would die
138 %% ****
140 %% It's amazing
142 %% With the blink of an eye
144 %% You finally see the light
146 %% It's amazing
148 %% That when the moment arrives
150 %% You know you'll be alright
152 %% It's amazing
154 %% And I'm saying a prayer
156 %% To the desperate hearts tonight
159 %% ****
162 %% That one last shot's a Permanent Vacation
164 %% And a how high can you fly with broken wings
166 %% Life's a journey - not a destination
168 %% And I just can't tell just what tomorrow brings
171 %% ****
174 %% You have to learn to crawl
176 %% Before you learn to walk
178 %% But I just couldn't listen
180 %% To all that righteous talk
182 %% I was out on the street
184 %% Just tryin' to survive
186 %% Scratchin' to stay alive
189 %% ****
192 %% ``To all of you people out there
194 %% Wherever you are - remember:
196 %% The light at the end of the tunnel
198 %% May be you - goodnight''
199 %%\end{center}
201 \chapter*{Tóm tắt luận văn}
202 \markboth{\MakeUppercase{Tóm tắt luận văn}}{}
203 \addstarredchapter{Tóm tắt luận văn}
204 \pagestyle{fancy}
206 \paragraph{Vấn đề nghiên cứu}
208 Xây dựng chương trình bắt lỗi chính tả tiếng Việt nhằm phát hiện và đề nghị
209 từ thay thế cho các lỗi chính tả thường gặp. Đề tài này chỉ giới hạn
210 bắt lỗi chính tả trong các văn bản hành chính.
213 \paragraph{Cách tiếp cận}
215 Sử dụng cách tiếp cận như sau: Phát sinh những câu có khả năng thay
216 thế dựa trên các nguyên nhân gây lỗi chính tả, sau đó sử dụng mô hình
217 ngôn ngữ dựa trên từ để xác định câu đúng nhất. Dựa trên sự khác biệt
218 giữa câu gốc và câu được chọn, ta sẽ có thể biết được từ nào sai chính
219 tả, và cách viết đúng chính tả là như thế nào. Mô hình sử dụng ngữ
220 liệu thô chưa tách từ, tự huấn luyện để phù hợp với mục đích của mô
221 hình.
223 Mô hình bắt lỗi chính tả theo hai giai đoạn. Giai đoạn thứ nhất tìm và
224 yêu cầu người dùng sửa lỗi tiếng (những tiếng không tồn tại trong
225 tiếng Việt). Giai đoạn này chủ yếu sửa những lỗi sai do nhập liệu từ
226 bàn phím. Giai đoạn hai được dùng để bắt lỗi từ. Tất cả các cách tách
227 từ có thể có của câu nhập vào được xây dựng dựa trên lưới từ. Sau đó
228 lưới từ này được mở rộng để thêm vào những câu mới nhờ áp dụng các
229 nguyên nhân gây lỗi chính tả, nhằm tạo ra câu đúng từ câu sai chính
230 tả. Mô hình ngôn ngữ được áp dụng để đánh giá từng cách tách từ trong
231 lưới từ và chọn ra cách tách từ tốt nhất. Dựa vào cách tách từ này và
232 câu gốc, ta sẽ xác định từ sai chính tả và đưa ra từ đề nghị. Một số
233 heuristic được áp dụng để hiệu chỉnh lưới từ nhằm tạo ra một kết quả
234 tốt hơn.
236 Mô hình ngôn ngữ được dùng là trigram dựa trên từ. Việc huấn luyện
237 trigram dựa trên ngữ liệu đã tách từ sẵn có và tạo thêm ngữ liệu
238 mới từ ngữ liệu thô chưa tách từ. Với ngữ liệu thô, mô hình ngôn ngữ
239 được huấn luyện để thu thập tất cả cách tách từ có thể có của mỗi câu
240 trong ngữ liệu huấn luyện thay vì sử dụng bộ tách từ rồi huấn luyện
241 trên cách tách từ tốt nhất đó. Các trigram trong mỗi cách tách từ được
242 thu thập dựa theo khả năng của mỗi cách tách từ. Trigram của cách tách
243 từ tốt hơn sẽ có trọng số cao hơn các cách tách từ còn lại
245 \paragraph{Kết quả}
247 Chương trình hoạt động tốt và đạt được một số kết quả nhất định. Các
248 lỗi sai âm tiết được phát hiện hoàn toàn. Lỗi sai từ có thể phát hiện
249 đến trên 88\%. Các loại lỗi khác đạt độ chính xác rất cao.
251 Chương trình có thể được cải tiến thêm bằng cách sử dụng các thông tin
252 cao cấp hơn như thông tin từ loại, thông tin cú pháp, ngữ nghĩa~\ldots
253 nhằm nâng cao độ chính xác hơn nữa.
256 \chapter{Mở đầu}
257 \label{cha:overview}
258 %TOC
259 \minitoc
262 Ngôn ngữ là một phần quan trọng của đời sống, là phương tiện chuyển
263 tải thông tin trong đời sống. Trong thời đại bùng nổ thông tin hiện
264 nay thì ngôn ngữ đóng vai trò hết sức quan trọng, đặc biệt là ngôn ngữ
265 viết.
267 % Tại sao lại làm đề tài này? (Đặt vấn đề)
268 Khi viết, đôi khi ta mắc phải những lỗi sai chính tả. Chữ quốc ngữ
269 là thứ chữ ghi âm nên một số âm tiết rất dễ
270 nhầm lẫn, khó phân biệt rõ ràng. Ngôn ngữ nói ở những vùng khác nhau lại
271 có những điểm khác nhau. Những điểm khác nhau này rất dễ gây ra
272 những lỗi chính tả khi viết nếu người viết không để ý khi sử dụng tiếng
273 Việt.
275 Những thao tác chuyển thông tin ở dạng khác thành văn bản cũng có thể
276 gây ra lỗi chính tả. Ví dụ, nếu nhập liệu không cẩn thận dẫn đến lỗi
277 sai chính tả. Khi ghi lại lời nói của người khác mà người đó sử dụng
278 giọng địa phương cũng có thể dẫn đến lỗi chính tả. Quét các văn bản
279 giấy thành văn bản điện tử, sử dụng chương trình nhận dạng chữ, cũng
280 có thể dẫn đến lỗi chính tả do chương trình nhận dạng nhầm lẫn~\ldots{}
282 Văn bản dễ bị sai chính tả do nhiều yếu tố khách quan. Để kiểm lỗi
283 chính tả những văn bản này đòi hỏi nhiều công sức và thời gian, đặc
284 biệt khi khối lượng văn bản bùng nổ như hiện nay. Do đó cần có một
285 công cụ hỗ trợ kiểm lỗi chính tả, giúp nhanh chóng phát hiện lỗi chính
286 tả và đề nghị cách khắc phục.
288 Trong thời đại tin học hoá, máy tính được tận dụng để giảm thiểu công
289 sức của con người, đồng thời tăng tính hiệu quả. Tin học đã được áp
290 dụng trong nhiều lĩnh vực khác nhau và chứng tỏ tính hiệu quả của
291 nó. Tuy nhiên, việc ứng dụng tin học nhằm hỗ trợ bắt lỗi
292 chính tả tiếng Việt chỉ mới được bắt đầu trong thời gian gần
293 đây. Những ứng dụng bắt lỗi chính tả hiện có vẫn còn khá đơn
294 giản, hoặc chưa hiệu quả, chưa đáp ứng được nhu cầu thực tế. Luận văn này đề ra một giải
295 pháp khác để bắt lỗi chính tả, với hy vọng góp phần nâng cao chất
296 lượng ứng dụng bắt lỗi chính tả tiếng Việt bằng máy tính.
298 \section{Nội dung bài toán}
300 Bài toán có thể được phát biểu như sau:
301 Cho một văn bản tiếng Việt. Tìm tất cả các từ sai chính tả trong văn bản
302 và đề nghị cách giải quyết lỗi nếu có.
304 % Phạm vi bài toán
306 Do ngôn ngữ là một lĩnh vực quá rộng. Việc bắt lỗi chính tả tiếng Việt
307 tổng quát là cực kỳ khó khăn. Do vậy đề tài này chỉ giới hạn bắt lỗi
308 chính tả trong các văn bản hành chính.
310 Chỉ sử dụng từ điển từ, từ điển tiếng và ngữ liệu thô làm đầu vào.
312 Khái niệm từ ở đây là ``từ từ điển'' --- tức là các từ đơn, từ ghép,
313 cụm từ được lưu trong từ điển.
315 Lỗi chính tả ở đây bao gồm chủ yếu hai loại lỗi sau:
316 \begin{itemize}
317 \item Lỗi nhập liệu sai: lỗi gõ thiếu chữ, gõ dư chữ, gõ nhầm vị trí
318 hai chữ liên tiếp nhau, gõ nhầm một chữ bằng một chữ khác, sai sót
319 do bộ gõ tiếng Việt~\ldots{}
320 \item Lỗi phát âm sai: chủ yếu là do đặc điểm phát âm của từng vùng,
321 dẫn đến sai chính tả khi viết.
322 \end{itemize}
324 Không xử lý lỗi từ vựng, lỗi cú pháp.
326 Giả định rằng, nếu từ bị sai chính tả, thì chỉ sai bởi một trong những
327 lý do nêu trên {\em một lần} (mỗi từ chỉ sai một lỗi chính tả, lỗi đó thuộc
328 một trong những loại đã nêu). Nghĩa là không xét những trường hợp sai
329 chính tả, vừa gõ nhầm chữ này bằng chữ khác, vừa gõ dư chữ.
331 Giả định người dùng chỉ sử dụng một trong hai cách gõ tiếng Việt là
332 VNI hoặc TELEX.
334 Văn bản tiếng Việt được coi là thuần Việt. Không kiểm tra chính tả đối
335 với những từ nước ngoài. Những từ nước ngoài và các ký hiệu khác đều
336 bị coi là sai chính tả.
338 \section{Đặc điểm}
340 Bắt lỗi chính tả, xét từ quan điểm tin học, là một bài toán khó. Khó
341 bởi vì ngôn ngữ là một phần rất quan trọng của đời sống xã hội, nó bao
342 hàm rất nhiều khía cạnh của văn hoá, xã hội. Ngôn ngữ dùng để diễn đạt
343 suy nghĩ, chuyển tải thông tin, nên nó chứa đựng một khối lượng tri
344 thức đồ sộ. Để xử lý ngôn ngữ tự nhiên một cách đúng đắn đòi hỏi một
345 trình độ nhất định. Bởi vậy, việc giải quyết bài toán bắt lỗi chính tả
346 bằng máy tính là hết sức khó khăn.
348 Bắt lỗi chính tả đôi khi được mở rộng để phát hiện những lỗi khác
349 trong văn bản như lỗi cú pháp, lỗi từ vựng~\ldots{} Điều này cũng dễ
350 hiểu vì người sử dụng cần một chương trình giúp họ phát hiện và loại
351 bỏ tất cả các lỗi trong văn bản, không quan trọng lỗi đó thuộc loại
352 lỗi nào. Thông thường những lỗi từ vựng thường bị nhầm lẫn với lỗi
353 chính tả, buộc chương trình bắt lỗi chính tả phải phát hiện cả lỗi từ
354 vựng. Đây là một vấn đề khó vì để bắt lỗi từ vựng, đôi khi cần phải
355 hiểu nội dung cả văn bản.
357 Nếu tìm hiểu sâu hơn về bài toán này, ta lại gặp một khó khăn khác do
358 bản chất của tiếng Việt. Đối với tiếng Việt, cũng như một số
359 ngôn ngữ châu Á khác, một từ chính tả có thể không tương ứng với một
360 ``từ'' trên văn bản. Đối với các thứ tiếng châu Âu, ta có thể dễ dàng
361 nhận ra một từ, do các từ được phân cách bằng khoảng trắng. Điều đó
362 không đúng với tiếng Việt. Trong tiếng Việt, các tiếng được phân cách
363 bởi khoảng trắng, không phải các từ. Điều này dẫn đến một bài toán
364 mới: tách từ trong tiếng Việt. Do tiếng Việt là ngôn ngữ nói sao viết
365 vậy, nên rất ít khi gặp lỗi sai về tiếng. Đa số các lỗi chính tả là
366 lỗi sai từ, nên việc xác định đâu là từ cực kỳ quan trọng.
368 Vấn đề càng trở nên khó khăn hơn khi phải thực hiện cùng lúc hai bài
369 toán là tách từ tiếng Việt và kiểm tra chính tả. Thật sự là tách từ
370 tiếng Việt trước, sau đó bắt lỗi chính tả. Tuy nhiên, do khi tách từ
371 thường ngầm định là dữ liệu đúng chính xác. Nên khi phải tách từ trước
372 bước kiểm tra chính tả, ngầm định trên không còn đúng. Bài toán tách
373 từ trở thành một bài toán khác, phức tạp hơn.
375 Đề tài này chỉ sử dụng các cách hình
376 thành lỗi chính tả, từ điển từ tiếng Việt và ngữ liệu văn bản dạng
377 thô. Việc không thể áp dụng được những thông tin cấp cao hơn như từ
378 loại, cú pháp, ngữ nghĩa~\ldots{} sẽ làm chương trình không thể phát
379 huy tối đa khả năng.
381 %% Dùng sai từ là lỗi từ vựng
383 \section{Hướng giải quyết}
385 % Bối cảnh %%%%Nổ thêm về bối cảnh ở đây. Cố để lấn qua trang kế%%%
387 Bài toán bắt lỗi chính tả đã được tìm hiểu từ rất lâu. Tuy nhiên đa số
388 đều tập trung vào các ngôn ngữ phổ dụng ở châu Âu. Trong khi đó các ngôn
389 ngữ châu Á, đặc biệt là tiếng Việt, có những đặc trưng riêng, đặt ra
390 nhiều thách thức mới. Bài toán bắt lỗi chính tả trên các ngôn ngữ châu
391 Á như tiếng Trung Quốc, tiếng Hàn Quốc, tiếng Nhật, tiếng Thái và tiếng Việt
392 chỉ bắt đầu được nghiên cứu gần đây.
394 Đối với các ngôn ngữ châu Âu, cách giải quyết đơn giản là dựa vào từ
395 điển. Nếu một từ trên văn bản không có trong từ điển nghĩa là từ đó
396 sai chính tả.
398 Đối với các ngôn ngữ như tiếng Trung Quốc, tiếng Nhật~\ldots{}, nhiều
399 giải pháp được đề ra để giải quyết bài toán. Tuy nhiên hầu hết các
400 giải pháp đều dựa trên ý tưởng áp dụng tập nhầm lẫn để phát sinh các
401 từ gần đúng, sau đó sử dụng mô hình ngôn ngữ để định lượng, xác định
402 xem từ nào là đúng nhất.
405 Đề tài này áp dụng cách giải quyết truyền thống, so sánh từ dựa trên
406 từ điển. Nếu từ không có trong từ điển nghĩa là sai chính tả, từ đó
407 đưa ra những gợi ý thích hợp.
409 Bài toán đặt ra một bài toán con khác là tách từ tiếng Việt trong điều
410 kiện văn bản bị sai chính tả. Cách giải quyết bài toán này là phát sinh
411 mọi cách tách từ có thể, sử dụng tập nhầm lẫn, và sau đó áp dụng mô hình
412 ngôn ngữ để tìm ra cách tách từ đúng nhất. Tập nhầm lẫn được phát sinh
413 dựa vào nguồn gốc gây lỗi. Các lỗi về phát âm sẽ dựa trên các thói
414 quen phát âm của từng vùng để tạo tập nhầm lẫn. Các lỗi về nhập liệu
415 sẽ dựa trên các nghiên cứu về lỗi nhập liệu để đưa ra tập nhầm lẫn
416 tương ứng.
419 \section{Bố cục luận văn}
421 Luận văn được chia thành các chương sau:
422 \begin{itemize}
423 \item Chương 1 giới thiệu chung về luận văn, các vấn đề cần giải
424 quyết, đặc điểm, phạm vi của bài toán và hướng giải quyết.
425 \item Chương 2 trình bày cơ sở lý thuyết ngôn ngữ học.
426 \item Chương 3 trình bày cơ sở lý thuyết toán học/tin học. Các mô hình
427 được áp dụng để giải quyết bài toán.
428 \item Chương 4 trình bày mô hình đề nghị cho bắt lỗi chính tả tiếng Việt.
429 \item Chương 5 trình bày các chi tiết khi cài đặt chương trình.
430 \item Chương 6 tóm tắt luận văn, các kết quả đạt được, tìm hiểu các
431 đặc điểm của mô hình cũng như chương trình cài đặt, các hạn chế và
432 các hướng giải quyết trong tương lai.
433 \item Phần phụ lục trình bày các thông tin liên quan.
434 \end{itemize}
436 \chapter{Cơ sở lý thuyết ngôn ngữ}
437 \label{cha:vietnamese}
438 %TOC
439 \minitoc
442 \section{Âm tiết}
444 Ngôn ngữ là một hệ thống tín hiệu. Khi nói, vỏ vật chất của tín hiệu
445 là âm thanh, khi viết nó được thể hiện bằng chữ. Không phải chữ viết
446 lúc nào cũng phản ánh chính xác các âm tố tương ứng. Vì vậy, các âm tố
447 được biểu diễn bằng những ký hiệu đặc biệt, gọi là phiên âm. Các ký
448 hiệu phiên âm thường đặt giữa \textipa{/\quad/} hoặc
449 \textipa{[\quad]}.
451 Âm thanh trong tự nhiên được tạo thành nhờ sự rung động của một vật
452 thể đàn hồi. Âm thanh của tiếng nói được hình thành nhờ ``bộ máy phát
453 âm'' của con người --- bao gồm môi, răng, lưỡi, khoang miệng, khoang
454 mũi, yết hầu, thanh hầu, phổi~\ldots{}. Ngoài ra, tai người chỉ có thể
455 tiếp nhận một khoảng âm thanh nhất định. Những chấn động không nghe
456 được gọi là siêu âm và âm ngoại.
458 Âm học phân biệt các âm thanh theo những đặc trưng khác nhau, bao gồm:
459 độ cao, độ mạnh, độ dài. Độ cao phụ thuộc vào tần số dao động. Tần số
460 dao động càng lớn thì âm thanh càng cao. Tai người có khả năng nhận
461 biết độ cao trong khoảng từ 16 đến 20.000 $H_z$. Độ mạnh~(cường độ)
462 phụ thuộc vào biên độ dao động. Biên độ càng lớn, âm thanh càng
463 to. Cường độ âm thanh trong ngôn ngữ đảm bảo sự xác minh trong giao tế
464 và là cơ sở để tạo thành các kiểu trọng âm khác nhau. Độ dài~(trường
465 độ) là khoảng thời gian kéo dài của âm thanh. Ngôn ngữ chỉ quan trọng
466 thời gian tương đối của âm thanh. Ví dụ, các nguyên âm có trọng âm
467 thường dài hơn nguyên âm không có trọng âm.
470 \subsection{Nguyên âm và phụ âm}
472 Các âm tố có thể chia thành nguyên âm và phụ âm, dựa vào các đặc điểm
473 âm học, cấu âm và vai trò trong cấu tạo âm tiết.
475 Nguyên âm có đặc điểm cấu tạo:
476 \begin{itemize}
477 \item Luồng hơi ra tự do, không bị cản trở, không có vị trí cấu âm.
478 \item Bộ máy phát âm căng thẳng toàn bộ.
479 \item Luồng hơi ra yếu.
480 \end{itemize}
482 Phụ âm có đặc điểm cấu tạo hoàn toàn trái ngược với nguyên âm:
483 \begin{itemize}
484 \item Luồng hơi bị cản trở do sự xuất hiện chướng ngại trên lối ra của
485 luồng không khí, chướng ngại thường xuất hiện ở các khoang trên
486 thanh hầu do các khí quan tiếp xúc nhau hay nhích gần nhau mà thành,
487 điểm có chướng ngại được gọi là vị trí cấu âm của phụ âm.
488 \item Bộ máy phát âm không căng thẳng toàn bộ mà sự căng thẳng cơ thịt
489 tập trung ở vị trí cấu âm.
490 \item Luồng hơi ra mạnh.
491 \end{itemize}
493 Nguyên âm và phụ âm có chức năng khác nhau trong cấu tạo âm tiết. Các
494 nguyên âm thường làm hạt nhân hay đỉnh của âm tiết, còn phụ âm thường
495 là yếu tố đi kèm, không tạo thành âm tiết~(trừ các âm phụ vang).
497 Những âm tố có đặc tính giống nguyên âm nhưng thường chỉ đi kèm, bản
498 thân không tạo thành âm tiết được gọi là {\em bán nguyên âm}. Ví dụ,
499 các âm tố viết là u, i trong các âm ``sau'', ``mai'' trong tiếng Việt.
502 \subsection{Âm vị}
504 Âm vị là đơn vị nhỏ nhất của cơ cấu âm thanh ngôn ngữ, dùng để cấu tạo
505 và phân biệt hình thức ngữ âm của những đơn vị có nghĩa của ngôn ngữ
506 --- từ và hình vị. Ví dụ, các từ ``tôi'' và ``đôi'', ``ta'' và ``đa''
507 được phân biệt bởi các âm vị \textipa{/t/}\textipa{/d/}.
509 Âm vị là đơn vị nhỏ nhất, vì về mặt tuyến tính nó không thể phân chia
510 nhỏ hơn nữa. Nếu thay âm vị này bằng âm vị khác trong cùng một bối
511 cảnh ngữ âm sẽ làm cho từ thay đổi nghĩa hoặc mất nghĩa. Ví dụ, thay
512 âm \textipa{/t/} trong từ ``toàn'' bằng âm \textipa{/h/} sẽ được
513 ``hoàn'' có nghĩa khác, hoặc nếu thay bằng âm \textipa{/n/} sẽ được
514 ``noàn'' hoàn toàn vô nghĩa.
516 Âm vị có thể được so sánh như những viên gạch trong việc xây dựng mỗi
517 ngôn ngữ. Các viên gạch thường giống nhau, nhưng các âm vị về nguyên
518 tắc phải khác nhau, ít nhất ở một đặc trưng nào đó. Sự khác biệt này
519 tạo ra khác biệt về hình thức âm thanh của hình vị và từ, tạo ra tín
520 hiệu khác biệt đối với sự thụ cảm của con người. Vậy âm vị có hai chức
521 năng cơ bản là {\em chức năng khu biệt}~(vỏ âm thanh của hình vị và
522 từ) và {\em chức năng cấu tạo}~(chất liệu để cấu tạo nên
523 những thành tố của những đơn vị có nghĩa).
526 \subsection{Âm tiết}
528 Chuỗi lời nói của con người được chia ra làm những khúc đoạn khác
529 nhau, từ lớn đến nhỏ. Âm tiết là đơn vị phát âm nhỏ nhất, được phân
530 định tự nhiên trong lời nói con người.
532 Về phương diện phát âm, dù lời nói chậm đến đâu cũng chỉ phân chia đến
533 giới hạn của âm tiết mà thôi. Nhưng về phương diện thính giác thì âm
534 tiết là một tổ hợp âm thanh, có thể gồm nhiều âm tố hoặc đôi khi chỉ
535 có một âm tố. Mỗi âm tiết chỉ có một âm tố âm tiết tính~(có khả năng
536 tạo thành âm tiết), còn lại là những yếu tố đi kèm, không tự mình tạo
537 thành âm tiết. Âm tố âm tiết tính thường được phân bố ở đỉnh hay ở
538 trung tâm, làm hạt nhân âm tiết, thường là các nguyên âm. Các phụ âm
539 thường là các yếu tố đi kèm, đứng ngoài biên, hay ở ranh giới của âm
540 tiết. Đôi khi âm tiết chỉ gồm một nguyên âm.
542 Trong một số trường hợp, âm tiết có thể có hai hoặc ba nguyên âm. Tuy
543 nhiên trong số đó chỉ có một nguyên âm tạo đỉnh, các âm tố khác không
544 tạo thành âm tiết, gọi là bán nguyên âm.
546 Âm tiết có một số chức năng sau:
547 \begin{itemize}
548 \item Âm tiết có chức năng tổ chức chất liệu âm thanh của ngôn ngữ
549 bằng cách hợp nhất các âm tố trong một đơn vị phát âm nhỏ nhất.
550 \item Âm tiết là môi trường để hiện thực hoá các hiện tượng ngôn điệu
551 như trọng âm, âm điệu.
552 \item Âm tiết có chức năng cấu thành tiết điệu của lời nói~\ldots{} Chức
553 năng này thể hiện rõ trong ngôn ngữ thơ.
554 \end{itemize}
556 Trong các ngôn ngữ âm tiết tính như tiếng Trung Quốc, tiếng Miến Điện,
557 tiếng Việt~\ldots{} nói chung âm tiết trùng với hình vị --- đơn vị cơ
558 bản của ngữ pháp. Âm tiết có chức năng là vỏ ngữ âm của hình vị, tạo
559 nên một đơn vị đặc biệt, gọi là {\em hình tiết}.
561 Tính chất âm tiết của tiếng Việt đưa đến nhiều hệ quả quan trọng về
562 ngữ âm cũng như về ngữ pháp. Về mặt ngữ âm, do mỗi âm tiết là vỏ ngữ
563 âm của một hình vị, và cũng thường là vỏ ngữ âm của từ đơn, nên số
564 lượng các âm tiết là hữu hạn\footnote{Theo Nguyễn Phan Cảnh, ``tiếng
565 Việt đưa ra hơn 17.000 âm tiết --- tín hiệu với tư cách là vỏ ngữ âm
566 khả năng, và chỉ sử dụng hơn 6.900 với tư cách là các âm tiết tồn tại
567 thực'' (Nguyễn Phan Cảnh, ``Bản chất cấu trúc âm tiết tính của ngôn
568 ngữ: Dẫn luận vào một miêu tả không phân lập đối với âm vị học Việt
569 Nam, tạp chí ngôn ngữ, H. 1978, số 2)}.
571 Là vỏ ngữ âm của một hình vị hay một từ đơn, mỗi âm tiết tiếng Việt
572 bao giờ cũng tương ứng với một ý nghĩa nhất định, nên việc phá vỡ cấu
573 trúc âm tiết trong ngữ lưu, tức xê dịch vị trí các âm tố (âm vị) của
574 cùng một hình vị từ âm tiết này sang âm tiết khác, là điều ít xảy
575 ra. Kết quả là trong tiếng Việt, âm tiết có một cấu trúc chặt chẽ, mỗi
576 âm tố (âm vị) có một vị trí nhất định trong âm tiết. Đứng đầu âm tiết
577 bao giờ cũng là một phụ âm, cuối âm tiết là một phụ âm hoặc một bán
578 nguyên âm. Phụ âm cuối luôn luôn ở cuối âm tiết, không thể trở thành
579 âm đầu được. Do đó, phụ âm cuối và âm đầu làm thành hai đối hệ khác
580 nhau, có vị trí và chức năng khác nhau trong cấu trúc âm tiết.
582 Một đặc điểm khác của âm tiết tiếng Việt là mỗi âm tiết đều mang
583 một thanh điệu nhất định. Việc thể hiện thanh điệu đòi hỏi âm tiết
584 phải có một trường độ cố định. Tính chất này làm cho các yếu tố bên
585 trong âm tiết, trừ phụ âm đầu, không có một trường độ cố định, mà đắp
586 đổi lẫn nhau, liên quan với nhau rất chặt chẽ.
589 \subsubsection{Cấu trúc âm tiết tiếng Việt}
591 Trên bình diện ngữ âm học, các cứ liệu thực nghiệm cho thấy âm tiết
592 tiếng Việt được cấu tạo bởi ba thành tố độc lập là thanh điệu, phụ âm
593 đầu và phần còn lại.
595 Thanh điệu là yếu tố luôn có mặt trong mọi âm tiết tiếng Việt. Tính
596 chất độc lập về mặt ngữ âm của thanh điệu thể hiện ở chỗ nó có đường
597 nét và trường độ tương đối ổn định tùy thuộc vào các loại hình âm
598 tiết.
600 Phụ âm đầu là yếu tố mở đầu của âm tiết. Tính chất độc lập của phụ âm
601 đầu thể hiện ở chỗ nó không tham gia vào việc đắp đổi về trường độ
602 giữa các yếu tố bên trong âm tiết.
604 Phần còn lại của âm tiết có từ một đến ba yếu tố, gồm một bán nguyên
605 âm chiếm vị trí trung gian giữa phụ âm đầu và phần còn lại, một nguyên
606 âm âm tiết tính và một phụ âm hoặc bán nguyên âm cuối, có vai trò kết
607 thúc âm tiết. Trừ bán nguyên âm trước nguyên âm tiết tính, các yếu tố
608 của phần còn lại liên kết với nhau rất chặt chẽ, làm thành một
609 khối. Để đảm bảo cho tính chất cố định về trường độ của âm tiết, các
610 yếu tố của phần còn lại có sự đắp đổi nhau về trường độ: nếu nguyên âm
611 dài thì phụ âm hay bán âm cuối ngắn, ngược lại nếu nguyên âm ngắn thì
612 âm cuối dài. Các yếu tố của phần còn lại không có một trường độ cố
613 định, và do đó mức độ độc lập về mặt ngữ âm của chúng thấp hơn so với
614 phụ âm mở đầu âm tiết. Phần còn lại của âm tiết được gọi là phần vần,
615 vì đây là bộ phận đoạn tính kết hợp với thanh điệu tạo nên vần thơ.
617 Tóm lại, các yếu tố của âm tiết tiếng Việt có mức độ độc lập khác
618 nhau, chia làm hai bậc:
620 \begin{itemize}
621 \item Bậc một là những yếu tố độc lập về mặt ngữ âm và có thể được
622 tách rời về mặt hình thái học. Đó là thanh điệu, âm đầu và vần.
623 \item Bậc hai là các yếu tố của phần vần, gồm bán nguyên âm trước
624 nguyên âm âm tiết tính (được gọi là âm đệm), nguyên âm âm tiết tính
625 (được gọi là âm chính), phụ âm hoặc bán nguyên âm cuối (được gọi là
626 âm cuối). Các yếu tố này gắn liền với nhau về mặt ngữ âm do tính
627 chất cố định về trường độ của âm tiết và chỉ được tách ra bằng những
628 ranh giới thuần túy ngữ âm học.
629 \end{itemize}
631 Các thành tố của âm tiết tiếng Việt và quan hệ hai bậc giữa các thành
632 tố được trình bày trong hình~\vref{fig:cautrucamtiet}.
634 \begin{figure}[htbp]
635 \centering
636 \begin{tabular}{|c|c|c|c|}
637 \hline
638 \multicolumn{4}{|c|}{Thanh điệu}\\\hline
639 Âm đầu&\multicolumn{3}{c|}{Vần}\\\cline{2-4}
640 &Âm đệm&Âm chính&Âm cuối\\\hline
641 \end{tabular}
642 \caption{Cấu trúc âm tiết}
643 \label{fig:cautrucamtiet}
644 \end{figure}
646 %\subsection{Các hiện tượng liên quan đến âm tiết}
649 %\subsubsection{Nguyên âm đôi}
652 % Sự biến hoá ngữ âm
654 Khái niệm âm tiết liên quan mật thiết đến sự biến hoá ngữ âm. Vì các
655 âm tố lời nói không phát âm đơn lập mà được phát âm trong dòng lời nói
656 liên tục, cho nên các âm tố có thể ảnh hưởng lẫn nhau, đặc biệt là
657 những âm tố lân cận được phát âm trong cùng một âm tiết, hoặc ở những
658 âm tiết đi liền nhau. Một số hiện tượng biến hoá ngữ âm thường gặp
659 trong tiếng Việt:
660 \begin{itemize}
661 \item Sự thích nghi. Xuất hiện giữa phụ âm và nguyên âm đứng cạnh
662 nhau. Nếu âm tố sau biến đổi cho giống âm tố đi trước, đó là thích
663 nghi xuôi. Nếu âm tố trước biến đổi cho hợp với âm tố sau là thích
664 nghi ngược. Trong tiếng Việt, nguyên âm và phụ âm cuối kết hợp với
665 nhau rất chặt chẽ, tạo thành vần của âm tiết. Hiện tượng thích nghi
666 biểu hiện rõ rệt trong những vần có nguyên âm dòng trước và dòng sau
667 tròn môi kết hợp với phụ âm cuối ``ng'' và ``c''.
668 \item Sự đồng hoá (một yếu tố thay đổi để giống yếu tố kia). Ví dụ,
669 ``vỏn vẹn'' và ``vẻn vẹn''.
670 \item Sự dị hoá (hiện tượng rút gọn cho dễ phát âm). Ví dụ, ``ba mươi
671 mốt'' và ``băm mốt''.
672 \end{itemize}
674 \subsection{Phụ âm đầu}
676 Phụ âm đầu luôn gắn liền với vị trí và chức năng mở đầu âm tiết. Đi
677 sau âm đầu trong âm tiết là bán nguyên âm không thành âm tiết (hay còn
678 gọi là âm đệm).
680 Hệ thống phụ âm đầu tiếng Việt với số lưỡng đối lập âm vị học tối đa
681 được thể hiện trên chữ viết. Riêng những âm tiết như ``ăn'',
682 ``uống''~\ldots{} tuy không ghi phụ âm đầu, nhưng thực tế vẫn tồn tại
683 phụ âm đầu (âm tắt thanh hầu \textipa{/P/}). Trong từng phương ngữ,
684 một số đối lập có trên chữ viết có thể bị mất đi hoặc bị thay thế. Ví
685 dụ, trong tiếng Hà Nội không còn đối lập các phụ âm đầu giữa
686 ch--tr,x--s và gi,d với r. Trong tiếng miền Nam, \textipa{/v/}
687 \textipa{/z/} được thay bằng \textipa{/j/}.
689 Hiện nay, hệ thống phụ âm đầu được sử dụng thực tế trong nhà trường và
690 trên các văn bản, chung cho các phương ngữ, là hệ thống phụ âm đầu
691 hình thành trên cơ sở phát âm Hà Nội với sự phân biệt các phụ âm
692 ch--tr, x--s, g,gi--r gồm 22 phụ âm sau: \textipa{/b, m, f, v, t,
693 t\super{h}, d, n, s, z, l, \:t, \:s, \:z, c, \textltailn, k, N, x,
694 G, P, h/}\footnote{Phụ âm \textipa{/p/} gặp trong từ vay mượn hoặc
695 phiên âm tiếng nước ngoài, không được đưa vào hệ thống này}
697 Hệ thống phụ âm đầu của tiếng địa phương miền Bắc, mà cở sở là phát âm
698 Hà Nội có 19 phụ âm (kể cả âm tắc thanh hầu \textipa{/P/}). Trong phát
699 âm Hà Nội không có loạt phụ âm uốn lưỡi \textipa{/\:t, \:s, \:z/}. Các
700 phụ âm này đều được chuyển thành các âm đầu lưỡi hoặc mặt lưỡi tương
701 ứng \textipa{/c, s, z/}. Ví dụ,
702 \begin{itemize}
703 \item ``cha'' và ``tra'' đều phát âm thành ``cha'' \textipa{/ca/}
704 \item ``sa'' và ``xa'' đều phát âm thành ``xa'' \textipa{/sa/}
705 \item ``da'', ``gia'' và ``ra'' đều được phát âm thành ``da'' \textipa{/da/}
706 \end{itemize}
708 Trong các thổ ngữ vùng Bắc Trung Bộ (Nghệ Tĩnh --- Bình Trị Thiên) còn
709 giữ loạt các phụ âm cong lưỡi \textipa{/\:t, \:s, \:z/}. Ở một số nơi
710 thuộc Nghệ Tĩnh, phụ âm ``ph'' được phát âm như âm mặt lưỡi sau bật
711 hơi \textipa{/k\super{h}/}. Vì vậy hệ thống phụ âm đầu những nơi này
712 có thêm dãy âm bật hơi \textipa{/p\super{j}, \:t\super{h},
713 k\super{h}/}. Trong khi đó các thổ ngữ miền Bắc và miền Nam chỉ còn
714 lại một âm bật hơi \textipa{/t\super{h}/} mà thôi. Vùng Bình Trị Thiên
715 không có phụ âm ``nh''. Phụ âm này thường được phát âm thành
716 \textipa{/j/}. Ví dụ, ``nhà'' được phát âm thành ``dà''. Nếu coi hệ
717 thống phụ âm đầu vùng Vinh là đại diện cho phương ngự Bắc Trung Bộ thì
718 hệ thống này có 22 phụ âm đầu.
720 Hệ thống phụ âm đầu miền Nam (từ đèo Hải Vân trở vào) không có các phụ
721 âm xát hữu thanh \textipa{/v, z/}. Tương ứng với \textipa{/v, z/}
722 trong phát âm Hà Nội, phát âm miền Nam có phụ âm mặt lưỡi giữa
723 \textipa{/j/}. Đôi khi âm \textipa{/v/} được phát âm thành âm môi-môi,
724 xát, vang ngạc hoá \textipa{/Bj/}. Hiện nay các âm cong lưỡi đang
725 trong quá trình biến đổi trong tiếng miền Nam. Phụ âm \textipa{/\:s/}
726 là phụ âm ít bền vững nhất thường được phát âm thành
727 \textipa{/s/}. Các phụ âm cong lưỡi khác như \textipa{/\:t/}
728 \textipa{/\:z/} vẫn còn giữ lại, phân biệt với \textipa{/c/}
729 \textipa{/j/} nhưng không đều đặn ở các thổ ngữ. Trong phát âm miền
730 Nam có phụ âm đầu \textipa{/w/}\footnote{Giá trị âm vị học của
731 \textipa{/w/} là vấn đề còn đang bàn cãi} xát, môi-môi, tương ứng
732 với các phụ âm tắc, lưỡi sau và thanh hầu tiếng Bắc khi kết hợp với âm
733 đệm \textipa{/-u-/}. Ví dụ, ``qua'' \textipa{/wa/}, ``ngoại''
734 \textipa{/wai/}, hoa \textipa{/wa/}. Nếu lấy hệ thống phụ âm đầu của
735 tiếng thành phố Hồ Chí Minh làm cơ sở cho phương ngữ miền Nam thì hệ
736 thống này có 21 phụ âm đầu.
739 \subsubsection{Quan hệ phân bố giữa phụ âm đầu và âm đệm}
741 Âm đệm là thành tố đi sau phụ âm đầu trong âm tiết. Trong tiếng Việt
742 chỉ có một âm đệm là \textipa{/-u-/}, thể hiện trên chữ viết bằng hai
743 chữ ``u'' và ``o''. Ví dụ, ``hoa'', ``quế''. Trong phát âm, âm đệm chỉ
744 được thể hiện ở tiếng địa phương miền Bắc và Bắc Trung Bộ, còn trong
745 tiếng địa phương miền Nam thường không có âm đệm \textipa{/-u-/}.
747 Trong phát âm Hà Nội, hầu hết loạt phụ âm lưỡi và thanh hầu có thể
748 phân bố trước âm đệm. Ví dụ, ``toa'', ``đoán'', ``nhoà''~\ldots{} Riêng
749 loạt âm môi \textipa{/b, m, v, f/} không phân bố trước âm đệm
750 \textipa{/-u-/} vì chúng có cấu âm môi giống nhau. Trong tiếng Việt,
751 hễ những âm có cấu âm giống nhau hay tương tự nhau thì không phân bố
752 cạnh nhau.
754 Ngoài các âm môi, một vài phụ âm lưỡi như \textipa{/n, \:z, G/} cũng
755 rất ít xuất hiện trước âm đệm.
757 \subsection{Vần}
760 \subsubsection{Âm đệm}
762 Trong âm tiết, âm đệm \textipa{/-u-/} đứng sau phụ âm đầu và đứng
763 trước âm chính. Nó đóng vai trò một âm lướt trong kết cấu âm tiết. Về
764 mặt cấu âm, âm đệm \textipa{/-u-/} được phát âm giống như nguyên âm
765 \textipa{[u]} nhưng không làm đỉnh âm tiết. Đó là một bán nguyên âm
766 môi-ngạc mềm, được phiên âm là \textipa{[-u-]} hay
767 \textipa{[-w-]}. Động tác cấu âm này diễn ra đồng thời với các giai
768 đoạn phát âm của phụ âm đầu và phần vần đầu của nguyên âm làm âm
769 chính. Về mặt âm học, âm đệm \textipa{/-u-/} có tác dụng làm biến đổi
770 âm sắc của âm tiết, làm trầm hoá âm sắc của âm tiết.
772 Âm đệm \textipa{/-u-/}, với tính chất là một bán nguyên âm môi-ngạc
773 mềm, có độ mở rộng hay hẹp tương ứng với độ mở của nguyên âm đi sau
774 nó. Trước nguyên âm hẹp \textbf{i}, âm đệm \textipa{/-u-/} được thể
775 hiện bằng một bán âm hẹp tương ứng là \textipa{[u]}, ví dụ
776 ``tuy''. Trước các nguyên âm có độ mở trung bình \textbf{ê, ơ, â}, âm
777 đệm \textipa{/-u-/} được thể hiện bằng một bán âm độ mở vừa
778 \textipa{[o]}, ví dụ ``khuê'', ``huơ'', ``huân''. Trước các nguyên âm
779 có độ mở rộng \textbf{e, a, ă}, âm đệm \textipa{/-u-/} được thể hiện
780 bằng một bán âm có độ mở tương ứng là \textipa{[O]}, ví dụ ``khỏe'',
781 ``khoắn'', ``khoan''.
783 Âm đệm \textipa{/-u-/} xuất hiện phần lớn ở các từ gốc Hán như
784 ``thuyền'', ``loan'', ``uyên''. Về mặt phân bố, như đã nói, âm đệm có
785 thể xuất hiện sau hầu hết các phụ âm đầu, trừ các phụ âm môi
786 \textipa{/b, m, f, v/}. Sau các phụ âm môi, âm đệm chỉ có mặt trong
787 một ít từ phiên âm tiếng nước ngoài như ``buýt'', ``phuy'',
788 ``voan''. Ngoài ra, sau các phụ âm \textipa{/n, \:z, G/}, âm đệm
789 \textipa{/-u-/} cũng chỉ xuất hiện trong một vài từ như ``noãn'',
790 ``roa'', ``goá''.
792 Âm đệm \textipa{/-u-/} cũng không xuất hiện trước các nguyên âm tròn
793 môi \textbf{u, uô, ô, o}. Sự phân bố của âm đệm sau phụ âm đầu và
794 trước các nguyên âm thể hiện một quy luật của ngữ âm tiếng Việt: các
795 âm có cấu âm giống nhau hoặc gần gũi nhau không được phân bố cạnh
796 nhau.
798 Về mặt chữ viết, âm đệm \textipa{/-u-/} được ghi bằng con chữ ``o''
799 trước ba nguyên âm rộng \textbf{e, a, ă} và được ghi bằng con chữ
800 ``u'' trước các nguyên âm còn lại. Ví dụ, ``thuý'', ``thuê'', ``loe'',
801 ``loa''. Riêng trường hợp sau phụ âm đầu \textipa{/k-/}, âm đệm
802 \textipa{/-u-/} luôn được ghi bằng con chữ ``u'' dù sau nó là nguyên
803 âm rộng. Ví dụ: ``quạ'', ``quý'' (trong những trường hợp này âm
804 \textipa{/k-/} được ghi bằng con chữ ``q'')\footnote{Do đó về mặt chữ
805 viết, sau con chữ ``q'', con chữ ``u'' luôn luôn có giá trị là một
806 âm đệm. Điều này giúp ta phân biệt ``ua'' là một nguyên âm đôi trong
807 từ ``của'' với ``ua'' trong tổ hợp âm đệm+nguyên âm trong
808 ``quả''. Riêng trường hợp ``quốc'' thì ``uô'' là nguyên âm đôi nhưng
809 \textipa{/k-/} vẫn được ghi bằng ``q''. Sự phân biệt về mặt con chữ ở
810 đây có giá trị phân biệt nghĩa hai từ đồng âm ``cuốc'' và ``quốc'' đều
811 được phát âm là \textipa{/kuok/}.}.
813 Âm đệm \textipa{/-u-/}, vốn là yếu tố có mặt trong phương ngữ Bắc và
814 Bắc Trung Bộ, lại hoàn toàn vắng mặt trong phương ngữ Nam Bộ. Do đó,
815 cấu trúc âm tiết của phương ngữ Nam Bộ chỉ có ba thành phần đoạn tính:
816 âm đầu, âm chính, âm cuối.
818 Sự vắng mặt của âm đệm trong phương ngữ Nam Bộ có thể đưa đến một số
819 biến đổi ở âm đầu và âm chính. Đáng chú ý là sự biến đổi của các phụ
820 âm mặt lưỡi sau và thanh hầu, thành các phụ âm môi. Ví dụ, ``hoa''
821 thành ``wa'', khuya thành ``phia''.
823 Hiện nay dưới sự ảnh hưởng của ngôn ngữ văn học, đã thấy xuất hiện âm
824 đệm sau các phụ âm đầu lưỡi, mặt lưỡi giữa và mặt lưỡi sau trong cách
825 phát âm của tầng lớp trí thức, của giới trẻ, trừ trường hợp hai phụ âm
826 thanh hầu \textipa{/h-,P-/} và phụ âm mặt lưỡi sau \textipa{/k-/}, vẫn
827 được phát âm thành \textipa{[w-]} trong các từ ``hoa'', ``oa'',
828 ``qua'' (đều phát âm là \textipa{[wa]}).
830 \subsubsection{Âm chính}
832 Âm chính trong âm tiết tiếng Việt có thể là một nguyên âm đơn hoặc một
833 nguyên âm đôi.
836 \paragraph{Nguyên âm đơn}
838 Tiếng Việt có 11 nguyên âm đơn làm âm chính. Căn cứ vào vị trí lưỡi,
839 hình dáng môi, các nguyên âm đơn được chia ra:
840 \begin{itemize}
841 \item Các nguyên âm giòng trước không tròn môi: \textipa{/i, e, E/}.
842 \item Các nguyên âm giòng sau không tròn môi: \textipa{/W, 7, \v{7},
843 a, \v{a}/}.
844 \item Các nguyên âm giòng sau tròn môi: \textipa{/u, o, O/}.
845 \end{itemize}
847 Căn cứ vào độ mở miệng, có thể chia thành:
848 \begin{itemize}
849 \item Các nguyên âm có độ mở miệng hẹp: \textipa{/i, W, u/}.
850 \item Các nguyên âm có độ mở trung bình: \textipa{/e, 7, \v{7}, o/}.
851 \item Các nguyên âm có độ mở rộng: \textipa{/E, a, \v{a}, O/}.
852 \end{itemize}
854 Căn cứ vào âm sắc, có thể chia ra:
855 \begin{itemize}
856 \item Các nguyên âm bổng: \textipa{/i, e, E/}.
857 \item Các nguyên âm trung bình: \textipa{/W, 7, \v{7}, a, \v{a}/}.
858 \item Các nguyên âm trầm: \textipa{/u, o, O/}.
859 \end{itemize}
861 Căn cứ vào trường độ, có thể chia ra:
862 \begin{itemize}
863 \item Các nguyên âm dài: \textipa{/i, e, E, W, 7, a, u, o, O/}.
864 \item Các nguyên âm ngắn: \textipa{/\v{7}, \v{a}/}.
865 \end{itemize}
868 \paragraph{Nguyên âm đôi}
870 Ngoài 11 nguyên âm đơn, còn có 3 nguyên âm đôi âm vị tính là
871 \textipa{/ie, W7, uo/}.
873 \subsubsection{Âm cuối}
875 Âm cuối là yếu tố kết thúc âm tiết. Các âm tiết trong tiếng Việt có
876 thể kết thúc bằng cách biến đổi âm sắc của âm chính do động tác khép
877 lại của bộ máy phát âm, làm cho nó bổng hơn hoặc trầm hơn. Âm cuối
878 trong trường hợp này là hai bán nguyên âm \textipa{/-u/}
879 \textipa{/-i/}. Âm tiết tiếng Việt còn có thể kết thúc bằng động tác
880 khép của bộ máy phát âm với một phụ âm tắc (mũi hoặc miệng).
882 Hệ thống âm cuối trong tiếng Việt gồm có 2 bán nguyên âm và 6 phụ
883 âm. Sau phụ âm bao gồm: \textipa{/m, p, n, t, N, k/}.
886 \subsubsection{Quy luật phân bố của các âm cuối sau âm chính}
888 Về mặt phân bố, các bán nguyên âm cuối \textipa{/-u/}
889 \textipa{/-i/} chỉ xuất hiện sau các nguyên âm không cùng âm sắc với
890 nó. Bán nguyên âm cuối \textipa{/-i/} chỉ xuất hiện sau các bán nguyên
891 âm không phải giòng trước. Bán nguyên âm cuối \textipa{/-u/} chỉ xuất
892 hiện sau các bán nguyên âm không tròn môi. Sự kết hợp giữa nguyên âm
893 và bán nguyên âm cuối, giống như sự kết hợp giữa âm đệm và nguyên âm
894 làm âm chính, tuân theo quy luật dị hoá. Theo đó, các âm có cấu âm
895 giống nhau hoặc gần nhau không bao giờ được phân bố cạnh nhau.
897 Có thể hình dung khả năng kết hợp giữa nguyên âm làm âm chính với hai
898 bán nguyên âm cuối \textipa{/-i/}\textipa{/-u/} như sau:
899 \begin{itemize}
900 \item Các nguyên âm có thể đứng trước bán nguyên âm \textipa{/-i/} bao
901 gồm các âm biểu hiện bởi các chữ: ư, ươ, ơ, â, a, ă, u, uô, ô, o.
902 \item Các nguyên âm có thể đứng trước bán nguyên âm \textipa{/-u/} bao
903 gồm các âm biểu hiện bởi các chữ: i, iê, ê, e, ư, ươ, ơ, â, a, ă.
904 \end{itemize}
906 Các phụ âm cuối khác, nói chung được phân bố đều đặn sau các nguyên
907 âm, trừ hai âm cuối mũi \textipa{/-m, -p/} không xuất hiện sau
908 \textipa{/W/}.
911 \subsubsection{Sự thể hiện của nguyên âm và phụ âm trong các tiếng địa
912 phương}
914 Trong phương ngữ Nam Bộ, các nguyên âm đôi \textipa{/ie, W7, uo/} khi
915 kết hợp với các âm cuối \textipa{/-i, -u, -m, -p/} được thể hiện thành
916 các nguyên âm đơn \textipa{/i, W, u/}. Ví dụ, ``chuối'' --- ``chúi'',
917 ``bưởi'' --- ``bửi'', ``tiếp'' --- ``típ''.
919 Ở một vài địa phương thuộc phương ngữ Trung Bộ, các nguyên âm đôi được
920 thể hiện bằng các nguyên âm cùng dòng, độ mở rộng. Ví dụ, ``người''
921 --- ``ngài'', ``ruột'' --- ``rọt'', ``miếng'' --- ``méng''.
923 Hai phụ âm cuối \textipa{/-n, -t/} được thể hiện thành \textipa{/-N,
924 -k/} trong phương ngữ Nam Bộ, khi chúng đi sau các nguyên âm đơn và
925 đôi, trừ \textipa{/i, e/} là hai nguyên âm giòng trước, độ mở hẹp và
926 trung bình. Ví dụ, ``đen'' -- ``đeng'', ``đét'' --- ``đéc''.
928 Sau ba nguyên âm giòng trước \textipa{/i, e, E/}, hai phụ âm
929 \textipa{/-N, -k/} được thể hiện trong các phương ngữ Nam Bộ thành
930 \textipa{/-n, -t/}, đồng thời các nguyên âm này có cấu âm lui về phía
931 sau nhiều hơn so với các nguyên âm trong phương ngữ Bắc Bộ, trở thành
932 các nguyên âm giòng giữa nghe gần giống như ư, ơ (hoặc â) và ă.
934 Điểm đáng lưu ý là trong phương ngữ Nam Bộ, sau \textipa{/i, e/} hai
935 âm cuối \textipa{/-n, -t/} vẫn được phát âm không đổi. Sự khác biệt
936 trong các vần này giữa phương ngữ Bắc Bộ và Nam Bộ xảy ra ở nguyên âm.
938 Trong phương ngữ Nam Bộ không có các âm cuối \textipa{/-\textltailn,
939 -c/}. Âm cuối này được phát âm thành \textipa{/-n, -t/}.
941 \subsection{Thanh điệu}
943 Thanh điệu là đặc trưng ngôn điệu của âm tiết. Người ta gọi thanh điệu
944 là âm vị siêu đoạn tính. Số lượng thanh điệu trong tiếng Việt khác
945 nhau giữa các tiếng địa phương. Số lượng nhiều nhất là 6 thanh trong
946 phát âm Hà Nội, hay trong các tiếng Bắc nói chung, và được phản ánh
947 trên chữ viết. Đó là các thanh: sắc, huyền, ngã, hỏi, nặng, và thanh
948 không dấu.
950 Trong các tiếng địa phương từ Thanh Hoá trở vào Nam thường chỉ có năm
951 thanh, thanh ngã trùng với thanh hỏi (trong một số vùng Thanh Hoá,
952 tiếng Bình Trị Thiên, Nam Trung Bộ và Nam Bộ), hoặc thanh ngã trùng
953 với thanh nặng (trong tiếng vùng Nghệ An, Hà Tĩnh). Ngoài ra trong một
954 vài thổ ngữ lẻ tẻ ở Nghệ An và Quảng Bình chỉ có 4 thanh điệu.
957 \subsubsection{Sự phân bố của thanh điệu}
959 Như đã biết, thanh điệu là đặc tính siêu đoạn của âm tiết. Các đặc
960 trưng của thanh điệu được thể hiện đồng thời với các thành phần cấu
961 trúc khác của âm tiết. Vì vậy, trong chừng mực nào đó nó bị chế định
962 bởi các thành phần này.
964 Về mặt âm vị học, âm tiết tiếng Việt trước hết được chia thành hai đơn
965 vị là phụ âm đầu và vần. Phần vần, trong đó có nguyên âm, là phân luôn
966 luôn mang thanh tính của âm tiết. Các đặc điểm về âm vực và âm điệu
967 của thanh điệu chỉ được biểu hiện trong phần mang thanh tính mà
968 thôi. Vì vậy, trong sự đối lập và thống nhất các thanh điệu, phần vần
969 đóng vai trò quan trọng. Phụ âm đầu hầu như không đóng vai trò gì
970 trong sự đối lập các thanh. Về mặt ngữ âm, đặc tính của thanh điệu
971 cũng hầu như không lan truyền lên phụ âm đầu, hoặc có chăng (trong
972 trường hợp phụ âm đầu hữu thanh) thì trong đoạn đầu của âm tiết, các
973 đặc trưng khu biệt của thanh điệu cũng chưa thể hiện rõ.
975 Phần vần có thể bao gồm âm đệm, một âm chính và có thể có bán nguyên
976 âm hoặc phụ âm cuối. Sự khác nhau của thanh điệu biểu hiện tập trung ở
977 giữa và cuối vần (tức phần nguyên âm và phụ âm cuối).
980 Trong các vần không có âm cuối, có âm cuối là bán nguyên âm hoặc phụ
981 âm vang, các đặc trưng của thanh điệu được thể hiện dễ dàng.
982 Với các vần kết thúc bằng các phụ âm cuối vô thanh, khép, các đặc
983 trưng của thanh được biểu hiện rất hạn chế.
984 Có thể nói rằng, trong mối quan hệ với các thành phần chiết đoạn của
985 âm tiết, thanh điệu bị sự chế định rõ ràng nhất của âm cuối. Vì vậy sự
986 phân bố của thanh điệu trong âm tiết phụ thuộc vào loại hình kết thúc
987 âm tiết.
989 Số lượng các thanh điệu xuất hiện trong những âm tiết kết thúc bằng
990 phụ âm cuối vô thanh rất hạn chế, thường chỉ có thể có thanh sắc hoặc
991 thanh nặng.
993 Thanh sắc và thanh nặng trong những âm tiết có âm cuối vô thanh có
994 những đặc điểm riêng về độ dài và đường nét âm điệu khác với thanh sắc
995 và thanh nặng trong các âm tiết còn lại. Vì vậy trước đây đã từng có
996 quan niệm cho rằng các thanh điệu trong các âm tiết có âm cuối vô
997 thanh là những thanh điệu đặc biệt, tạo thành hệ thống 8 thanh điệu:
998 tan, tàn, tãn, tản, tán, tạn, tát, tạt.
1003 \section{Từ}
1005 Khái niệm từ, mặc dù nghe qua rất thông dụng, dễ hiểu, nhưng định
1006 nghĩa chính xác thế nào là từ không đơn giản. Từ trước đến nay đã có
1007 nhiều định nghĩa về từ được đưa ra. Các định nghĩa đều đúng, tuy nhưng
1008 không hoàn chỉnh. Viện sĩ L. V. Sherba thừa nhận rằng: ``Trong thực
1009 tế, từ là gì? Thiết nghĩ rằng trong các ngôn ngữ khác nhau, từ sẽ khác
1010 nhau. Do đó, tất sẽ không có khái niệm từ nói chung''\footnote{Nguyễn
1011 Kim Thản, {\em Nghiên cứu ngữ pháp tiếng Việt}. NXB GD, 1997. Trang 28}.
1012 Chính vì tính đa dạng và phức tạp của từ mà một số nhà ngôn ngữ học
1013 chối bỏ khái niệm từ, hoặc né tránh định nghĩa từ một cách chính
1014 thức. Nhà ngôn ngữ học Ferdinand de Saussure đã nhận xét: ``\ldots{}
1015 Ngôn ngữ có tính chất kỳ lạ và đáng kinh ngạc là không có những thực
1016 thể thoạt nhìn có thể thấy ngay được, thế nhưng người ta vẫn biết chắc
1017 là nó tồn tại, và chính sự giao lưu giữa những thực thể đó đã làm
1018 thành ngôn ngữ. Trong số những thực thể đó có cái mà ngôn ngữ học vẫn
1019 gọi là từ.''. Theo ông thì ``\ldots{} Từ là một đơn vị luôn luôn ám ảnh
1020 toàn bộ tư tưởng chúng ta như một cái gì đó trọng tâm trong toàn bộ cơ
1021 cấu ngôn ngữ, mặc dù khái niệm này khó định nghĩa''.
1024 \subsection{Định nghĩa từ}
1026 Thời Hy Lạp cổ đại, trường phái ngôn ngữ Alexandri đã định nghĩa: ``\textit{Từ
1027 là đơn vị nhỏ nhất trong chuỗi lời nói}''. Ngoài ra A. Meillet trong
1028 \textit{Ngôn ngữ học lịch sử và ngôn ngữ học đại cương} đã định nghĩa: ``\textit{Từ
1029 là kết quả của sự kết hợp một ý nghĩa nhất định với một tổ hợp các âm
1030 tố nhất định, có thể có một công dụng ngữ pháp nhất định}''.
1032 Theo E. Sapir thì ``\textit{Từ là một đoạn nhỏ nhất có ý nghĩa, hoàn toàn có
1033 khả năng độc lập và bản thân có thể làm thành câu tối giản}''.
1035 Theo L. Bloomfield thì từ là ``\textit{một hình thái tự do nhất}''.
1037 Theo B. Golovin thì từ là ``\textit{đơn vị nhỏ nhất có ý nghĩa của ngôn ngữ,
1038 được vận dụng độc lập, tái hiện tự do trong lời nói để xây dựng nên
1039 câu}''.
1041 Theo Solncev thì ``\textit{Từ là đơn vị ngôn ngữ có tính hai mặt: âm và
1042 nghĩa. Từ có khả năng độc lập về cú pháp khi sử dụng trong lời}''.
1044 Theo B. Trơ-nơ-ka thì ``\textit{Từ là đơn vị nhỏ nhất có ý nghĩa, được cấu tạo
1045 bằng âm vị và có khả năng thay đổi vị trí và thay thế lẫn nhau trong
1046 câu}''.
1048 Theo Lục Chí Vỹ thì ``\textit{Từ là đơn vị nhỏ nhất có thể vận dụng tự do
1049 trong câu}''.
1050 Theo một số tác giả khác của Trung Quốc thì ``\textit{Từ là đơn vị từ vựng, là
1051 đơn vị vật liệu kiến trúc của ngôn ngữ, và cũng là đơn vị nhỏ nhất có
1052 khả năng vận dụng tư do trong lời nói}''.
1054 Theo V. G. Admoni thì ``\textit{Từ là đơn vị ngữ pháp, do hình vị cấu tạo nên,
1055 dùng để biểu thị đối tượng, quá trình, tính chất và những mối quan hệ
1056 trong hiện thực, có tính đặc thù rõ rệt và có khả năng kiến lập nhiều
1057 mối quan hệ đa dạng với nhau}''.
1059 Theo R. A. Bunđagôp thì ``\textit{Từ là đơn vị nhỏ nhất và độc lập, có hình
1060 thức vật chất (vỏ âm thanh và hình thức) và có nghĩa, có tính chất
1061 biện chứng và lịch sử}''.
1063 Đối với tiếng Việt, cũng có một số định nghĩa từ được đưa ra. Theo
1064 M. B. Émeneau thì ``\textit{Từ bao giờ cũng tự do về mặt âm vị học, nghĩa là
1065 có thể miêu tả bằng những danh từ của sự phân phối các âm vị và bằng
1066 những thanh điệu}''\footnote{Nguyễn Thiện Giáp. {\em Từ và nhận diện từ
1067 tiếng Việt}. NXB GD, Hà Nội 1996. Trang 17}. Émeneau đã dựa trên mặt
1068 ngữ âm để định nghĩa từ, xem mỗi từ trước hết là những âm tiết. Với
1069 quan niệm như vậy chủ yếu dựa vào tính hoàn chỉnh về mặt âm thanh và
1070 trong thực tế thì người Việt luôn có khuynh hướng mong đợi mỗi tiếng
1071 như vậy sẽ mang một nghĩa nào đó và coi đó như ``từ''.
1073 Theo Trương Văn Trình và Nguyễn Hiến Lê thì ``\textit{Từ là âm có nghĩa, dùng
1074 trong ngôn ngữ để diễn tả một ý đơn giản nhất, nghĩa là ý không thể
1075 phân tích ra được}''. Định nghĩa này chủ yếu dựa vào tính nhất thể của
1076 nghĩa, nghĩa là mỗi từ có một nghĩa tối giản nào đó, và nghĩa của từ
1077 có tính võ đoán và tính thành ngữ.
1079 Lê Văn Lý cho rằng từ tiếng Việt ``\textit{là một tín hiệu ngữ âm có thể cấu
1080 tạo bằng một âm vị hay sự kết hợp với âm vị, mà sự phát âm chỉ tiến
1081 hành trong một lần, hoặc là một âm tiết mà chữ viết biểu thị bằng một
1082 đơn vị tách rời và có một ý nghĩa hiểu được}''\footnote{Nguyễn
1083 Kim Thản, {\em Nghiên cứu ngữ pháp tiếng Việt}. NXB GD, 1997. Trang
1084 30}. Định nghĩa này dựa vào cả ba mặt: ngữ âm, chữ viết và ý
1085 nghĩa. Tuy nhiên định nghĩa này mâu thuẫn với định nghĩa từ ghép của
1086 chính tác giả, vì tác giả định nghĩa từ ghép dựa trên chức năng ngữ
1087 pháp và gồm nhiều âm tiết.
1089 Theo Phan Khôi thì ``\textit{Từ là một lời để tỏ ra một khái niệm trong khi
1090 nói}''. Theo Nguyễn Lân thì ``\textit{Từ là những tiếng có nghĩa, tức là mỗi khi
1091 nghe thấy, trong óc chúng ta đều có một khái niệm}''. Nếu xem từ tương
1092 đương với khái niệm thì những từ hình thái như à, ư, nhỉ, nhé~\ldots{}
1093 hay những hư từ như cũng, với, bởi~\ldots{} sẽ mang khái niệm gì? Trên
1094 thực tế, từ và khái niệm không tương ứng 1-1 với nhau. Có những khái
1095 niệm có thể biểu thị bằng nhiều từ.
1097 Theo Nguyễn Kim Thản thì ``\textit{Từ là đơn vị cơ bản của ngôn ngữ, có thể
1098 tách khỏi các đơn vị khác của lời nói để vận dụng một cách độc lập và
1099 là một khối hoàn chỉnh về mặt ý nghĩa (từ vựng hay ngữ pháp) và cấu
1100 tạo}''. Quan niệm của ông về ``đơn vị cơ bản'' là những đơn vị có số
1101 lượng hữu hạn để thông báo, trao đổi tư tưởng cho nhau. Đơn vị này
1102 phải có nghĩa, và khi sử dụng, người sử dụng phải có ý thức về
1103 nó. Chính vì vậy mà đơn vị cơ bản này không thể là câu (vì số lượng
1104 câu là vô hạn) và cũng không thể là âm tiết (vì nhiều âm tiết không có
1105 nghĩa và khi sử dụng, người sử dụng không ý thức về nó). Vậy đơn vị cơ
1106 bản là cái gì đó nhỏ hơn câu và lớn hơn âm tiết.
1108 Theo Hồ Lê thì ``\textit{Từ là đơn vị ngữ ngôn có chức năng định danh phi liên
1109 kết hiện thực, hoặc chức năng mô phỏng tiếng động, có khả năng kết hợp
1110 tự do, có tính vững chắc về cấu tạo và tính nhất thể về ý
1111 nghĩa}''. Theo ông, từ khác với âm tiết chủ yếu về mặt ý nghĩa. Từ có
1112 ý nghĩa ngữ ngôn, còn âm tiết thì chỉ có ý nghĩa tiền ngữ ngôn. Từ
1113 khác từ tố ở khả năng kết hợp. Từ có khả năng kết hợp tự do trong lời
1114 nói, còn từ tố thì chỉ có khả năng kết hợp hạn chế. Từ khác với cụm từ
1115 tự do bởi tính vững chắc về cấu tạo, tính nhất thể về ý nghĩa và bởi
1116 chức năng định danh phi liên kết hiện thực. Từ khác cụm từ cố định
1117 (thành ngữ, ngạn ngữ) chủ yếu bởi chức năng định danh phi liên kết
1118 hiện thực của nó.
1120 Đái Xuân Ninh chủ trương không định nghĩa từ, vì ``từ trước đến nay,
1121 trong ngôn ngữ học đại cương cũng như trong tiếng nói cụ thể như tiếng
1122 Việt, chưa có một định nghĩa nào thỏa đáng cả''. Theo ông thì ``đứng
1123 về mặt chức năng và cấu trúc của ngôn ngữ, chỉ cần xác định đơn vị từ
1124 và mối quan hệ của nó với các đơn vị khác trong tiếng nói''. Ông cho
1125 rằng ta có thể nhận diện từ một cách khái quát như sau: ``\textit{Từ
1126 là đơn vị cơ bản của cấu trúc ngôn ngữ ở giữa hình vị và cụm từ. Nó
1127 được cấu tạo bằng một hay nhiều đơn vị ở hàng ngay sau nó tức là
1128 hình vị và lập thành một khối hoàn chỉnh}''.
1131 Nguyễn Tài Cẩn, tuy không định nghĩa trực tiếp từ tiếng Việt, nhưng
1132 ông đã chứng minh những tính chất đặc biệt của ``tiếng'', một đơn vị
1133 mà ông coi chính là hình vị và có tính năng rất gần với ``từ'', nó
1134 cũng chính là ``từ đơn'' và là thành tố trực tiếp để tạo nên ``từ
1135 ghép''. Theo ông, mọi đặc thù về từ pháp của tiếng Việt bắt nguồn từ
1136 tính đơn lập của tiếng Việt mà thể hiện rõ nét nhất là qua một đơn vị
1137 đặc biệt, đó chính là tiếng. Quan điểm này cũng được Cao Xuân Hạo đồng
1138 tình.
1140 Kế thừa quan điểm coi tiếng gần trùng với từ. Nguyễn Thiện Giáp đã
1141 phát triển tư tưởng này lên đến mực cực đoan là coi tiếng trong tiếng
1142 Việt chính là từ trong các ngôn ngữ Ấn-Âu. Theo ông ``\textit{Nếu quan
1143 niệm từ không chỉ là đơn vị ngôn ngữ học mà còn là đơn vị tâm
1144 lý-ngôn ngữ học, nếu chú ý đến tính nhiều mặt của từ và đặc điểm của
1145 từ trong từng ngôn ngữ, nếu nhận diện từ căn cứ vào những quan hệ
1146 đối lập trong nội bộ từng ngôn ngữ thì cái đơn vị gọi là ``tiếng''
1147 của Việt ngữ có đủ tư cách để được gọi là ``từ''}''. Như vậy Nguyễn
1148 Thiện Giáp đã không sử dụng đến khái niệm hình vị trong tiếng Việt
1149 (đơn vị dùng để cấu tạo từ trong các ngôn ngữ Ấn-Âu). Trong quan niệm
1150 về từ của ông, ông chủ yếu dựa trên các tiêu chí nhận diện thuộc về
1151 hình thức mà không nhấn mạnh tiêu chí về ngữ nghĩa và khả năng độc lập
1152 về ngữ pháp.
1154 \subsection{Đặc điểm của từ}
1156 Từ các định nghĩa trên, có thể rút ra các đặc điểm chính của từ nói
1157 chung như sau:
1158 \begin{itemize}
1159 \item Về hình thức, từ phải là một khối về cấu tạo (chính tả, ngữ
1160 âm~\ldots{}).
1161 \item Về nội dung, từ phải có ý nghĩa hoàn chỉnh.
1162 \item Về khả năng, từ có khả năng hoạt động tự do và độc lập về cú
1163 pháp.
1164 \end{itemize}
1166 Đối với từ tiếng Việt, ta có thể rút ra những đặc điểm của từ tiếng
1167 Việt so với các ngôn ngữ thuộc loại hình khác.
1168 Tiếng Việt là một ngôn ngữ đơn lập với các đặc điểm chính như sau:
1169 \begin{itemize}
1170 \item Trong hoạt động ngôn ngữ, từ không biến đổi hình thái. Ý nghĩa
1171 ngữ pháp nằm ở ngoài từ.
1172 \item Phương thức ngữ pháp chủ yếu là trật tự từ và từ hư.
1173 \item Tồn tại một đơn vị đặc biệt là hình tiết mà vỏ ngữ âm của nó
1174 trùng khít với âm tiết. Đơn vị đó còn được gọi là tiếng.
1175 \item Không có hiện tượng cấu tạo từ bằng cách ghép thêm phụ tố vào
1176 gốc từ.
1177 \end{itemize}
1179 %% Khái niệm ``đơn vị cơ bản'' trong ngôn ngữ phải giống như trong các
1180 %% ngành khác. Đó là những đơn vị mang đầy đủ các đòi hỏi về những tính
1181 %% chất phải có trong khái niệm ``cơ bản''. Chính vì vậy, trong ngôn ngữ
1182 %% học, khi nói đến ``đơn vị cơ bản'' thì số lượng đơn vị ấy phải không
1183 %% được quá nhiều mà của không được quá ít. Chiều dài của ``đơn vị cơ
1184 %% bản'' cũng không thể quá dài hoặc quá ngắn. Tuy nhiên đây chỉ là điều
1185 %% kiện ban đầu để xem xét đơn vị cơ bản. Đơn vị cơ bản cần phải thoả mãn
1186 %% nhiều điều kiện khác như kết cấu, nội dung~\ldots{}
1188 %% Xét về hình thức đơn vị ``tiếng'' trong tiếng Việt, ta thấy đơn vị này
1189 %% thoả mãn các điều kiện ban đầu của một đơn vị cơ bản về số lượng cũng
1190 %% như chiều dài. Số lượng tiếng thường dùng khoảng 8.200 tiếng, tối đa
1191 %% khoảng 40.000 tiếng. Chiều dài trung bình của một tiếng vào khoảng 4-5
1192 %% chữ cái, tối đa khoảng 7 chữ cái.
1194 \subsection{Các quan niệm về hình vị và từ trong tiếng Việt}
1196 Đối với từ trong tiếng Việt, đến nay có một số quan điểm như sau:
1197 \begin{itemize}
1198 \item Coi mọi tiếng đều là từ (Nguyễn Thiện Giáp). Điều này thuận tiện
1199 trong xử lý nhưng không đúng với tiêu chí ngôn ngữ học đại cương vì
1200 có nhiều tiếng không có nghĩa, như ``phê'' trong ``cà phê'', ``bù''
1201 trong ``bù nhìn''~\ldots{}
1202 \item Coi tiếng chưa hẳn là từ (đa số các nhà Việt ngữ học). Trong số
1203 này chia thành ba nhóm sau:
1204 \begin{itemize}
1205 \item Xem tiếng là hình vị. Quan niệm có thể chấp nhận được nếu coi
1206 hình vị là hình vị tiếng Việt (gồm tha hình vị và á hình vị)
1207 \item Xem tiếng lớn hơn hình vị (Trần Ngọc Thêm, Lưu Văn
1208 Lang~\ldots{}) cho là tiếng có những hình vị (khuôn vần).
1209 \item Xem tiếng nhỏ hơn hoặc bằng hình vị. Đa số các tiếng đều là
1210 hình vị, ngoại trừ ``hấu'' trong ``dưa hấu'', ``bù'' trong ``bù
1211 nhìn''~\ldots{} vì những tiếng này không có nghĩa. Quan điểm này được
1212 nhiều người chấp nhận.
1213 \end{itemize}
1214 \item Xem tiếng châu Âu (Anh, Pháp~\ldots{}) cái nào là từ thì trong
1215 tiếng Việt cái đó là từ. Quan điểm này chưa xét đến sự khác biệt về
1216 sự từ vựng hoá giữa hai ngôn ngữ do khác biệt về văn hoá.
1217 \end{itemize}
1219 Theo quan điểm ngôn ngữ học đại cương, từ được cấu tạo bởi các hình
1220 vị, và hình vị chính là các đơn vị có nghĩa nhỏ nhất. Vì vậy, từ trong
1221 tiếng Việt cũng phải được cấu tạo bởi các hình vị nêu trên, nhưng có
1222 điều khác là các hình vị thành phần ở đây không hoàn toàn giống khái
1223 niệm hình vị của ngôn ngữ học đại cương, mà là ``hình vị tiếng Việt''
1224 hay còn gọi là ``hình tiết'' (hình vị + âm tiết) hay ``tiếng'' (vì chỉ
1225 tiếng Việt mới có đơn vị tiếng đặc biệt như vậy).
1229 \section{Từ láy}
1231 Từ láy là từ mà các thành tố kết hợp với nhau chủ yếu là theo quan hệ
1232 ngữ âm. Số lượng từ láy trong tiếng Việt rất lớn, khoảng 4000 từ. Quan
1233 hệ ngữ âm trong từ láy thể hiện ở hai mặt:
1234 \begin{itemize}
1235 \item Tương ứng về yếu tố siêu đoạn tính (thanh điệu)
1236 \item Tương ứng về yếu tố âm đoạn tính (phụ âm đầu, vần và các yếu tố
1237 trong vần)
1238 \end{itemize}
1242 Các thành tố của từ láy thường phải có thanh thuộc cùng một âm vực:
1243 hoặc thuộc âm vực cao (ngang, hỏi, sắc), hoặc thuộc âm vực thấp
1244 (huyền, ngã, nặng)\footnote{Trong tiếng Việt hiện đại, thanh ngã thuộc
1245 âm vực cao, thanh hỏi thuộc âm vực thấp. Tuy nhiên về mặt lịch sử,
1246 thanh hỏi trước kia thuộc âm vực cao còn thanh ngã lại thuộc âm vực
1247 thấp (A.G. Haudricourt, 1954)}
1249 Các từ láy có nhiều kiểu, bao gồm láy toàn bộ và láy bộ phận (láy vần,
1250 láy phụ âm đầu). Luật hài thanh của mỗi kiểu láy có đặc điểm riêng:
1251 \begin{itemize}
1252 \item Trong các từ láy toàn bộ, âm tiết đầu thường là một trong các
1253 thanh bằng (1, 2) còn âm tiết thứ hai thường là một trong các thanh
1254 trắc (3, 4, 5, 6) cùng âm vực với nó.
1255 \item Trong các từ điệp vận, thường có xu hướng thống nhất các thanh
1256 điệu ở cả hai âm tiết. Theo thống kê của Nguyễn Thiện Giáp, có 81\%
1257 số từ láy vần có thanh điệu hai âm tiết giống nhau hoàn toàn. Trong
1258 một số trường hợp, sự kết hợp của thanh điệu trong từ láy không theo
1259 đúng luật hài thanh (như \textit{khe khẽ, se sẽ, xốp xộp~\ldots}) có
1260 thể giải thích bằng sự thay đổi lịch sử của thanh ngã từ âm vực thấp
1261 lên âm vực cao, kéo theo sự thay đổi của các thanh điệu khác kết hợp
1262 với nó, hoặc do quan hệ với cơ chế láy ba.
1263 \item Trong các từ láy phụ âm đầu, thanh điệu của hai âm tiết không
1264 bắt buộc phải giống nhau, chỉ cần hai thanh điệu ở hai âm tiết cùng
1265 âm vực là được.
1266 \end{itemize}
1268 Sự phân bố thanh điệu trong các từ láy tiếng Việt tuân theo luật
1269 phù-trầm. Luật hài hoà thanh điệu này bị chế định rõ rệt trong kiểu
1270 láy vần do mối quan hệ chặt chẽ giữa vần và thanh điệu.
1272 %% \section{Từ ghép}
1274 %% XXX
1276 \section{Chính tả tiếng Việt}
1279 \subsection{Tổng quan về chữ viết tiếng Việt}
1282 % Nổ một tí về chữ quốc ngữ
1284 Chữ viết là một trong những phương tiện giao tiếp hiệu quả. Chữ viết
1285 cho phép vượt qua những giới hạn về không gian và thời gian của tiếng
1286 nói. Nhờ đặc điểm này, chữ viết được sử dụng rộng rãi trong nhiều lĩnh
1287 vực khác nhau của đời sống.
1289 Có nhiều hệ thống chữ viết khác nhau được sử dụng trên thế giới, nhưng
1290 nhìn chung có thể phân thành hai loại chữ viết sau:
1291 \begin{description}
1292 \item[Chữ viết ghi ý] Đây là loại chữ viết biểu hiện từ bằng một ký
1293 hiệu duy nhất, không liên quan gì đến những âm thanh cấu tạo nên
1294 từ. Ký hiệu này liên quan với cả từ và do đó cũng gián tiếp có quan
1295 hệ với ý niệm mà từ đó biểu hiện. Loại này bao gồm chữ Trung Quốc, chữ Ai
1296 Cập~\ldots{}
1298 Vì các ký hiệu chữ viết không phản ánh mặt âm thanh và hình thức ngữ
1299 pháp của từ mà phản ánh mặt ý nghĩa, nên trong tiếng Trung Quốc
1300 những từ đồng âm được biểu hiện bằng những chữ hoàn toàn khác nhau.
1302 \item[Chữ viết ghi âm] Đây là loại chữ viết nhằm tái hiện chuỗi âm
1303 thanh nối tiếp nhau trong từ. Các hệ thống chữ viết ngữ âm học có
1304 thể ghi âm tiết hay âm tố.
1305 \begin{description}
1306 \item[Chữ ghi âm tiết] Mỗi ký hiệu ghi một âm tiết. Dẫn chứng cho
1307 loại chữ viết này là hệ thống chữ Nhật Hiragana và Katakana.
1309 \item[Chữ ghi âm tố] Mỗi ký hiệu ghi một âm tố (hay âm vị). Ví dụ
1310 như chữ Anh, chữ Pháp, chữ Nga~\ldots{}
1312 \end{description}
1313 \end{description}
1315 Hệ thống chữ viết được sử dụng hiện nay của nước ta là chữ quốc
1316 ngữ. Nước ta trước đây vẫn dùng chữ Hán và chữ Nôm. Chữ quốc ngữ được
1317 hình thành từ thời Pháp đô hộ nước ta, được người Pháp sử dụng
1318 trong các văn tự chính thức và càng ngày càng được sử dụng rộng rãi.
1320 Chữ quốc ngữ ra đời cách nay khoảng ba thế kỷ. Đó là công trình của
1321 một nhóm các cố đạo người châu Âu cộng tác cùng một số người
1322 Việt. Người để lại nhiều tác phẩm có giá trị trong giai đoạn đầu của
1323 chữ quốc ngữ là Alexandre de Rhodes.
1325 % Đặc điểm chữ quốc ngữ
1327 Chữ quốc ngữ là một lối chữ ghi âm, dùng chữ cái Latin. Nó dùng những
1328 ký hiệu (tức là những con chữ, mượn từ chữ cái Latin, có thêm các dấu
1329 phụ) để ghi lại những âm vị, âm tố và các thanh điệu tiếng Việt. Chữ
1330 quốc ngữ về căn bản khác với chữ Hán và chữ Nôm. Chữ Hán là lối chữ
1331 ghi ý. Chữ Nôm của chúng ta ngày xưa về căn bản cũng là lối chữ ghi ý,
1332 tuy có nhiều thành phần ghi âm.
1334 So với chữ Nôm, chữ quốc ngữ có tiến bộ rất lớn vì nó là chữ ghi âm
1335 rất giản tiện, sử dụng vài chục ký hiệu giản tiện là có thể biểu diễn
1336 được hệ thống âm thanh tiếng Việt.
1338 So với các hệ thống chữ ghi âm khác như chữ Anh, chữ Pháp thì chữ quốc
1339 ngữ là một hệ thống ``chữ viết trẻ'', mới được dùng phổ biến hơn
1340 một thế kỷ nay, nên giữa chữ và âm tương đối có sự phù hợp.
1342 Nguyên tắc chính tả cơ bản của chữ quốc ngữ là nguyên tắc ngữ âm học,
1343 có nghĩa là ``phát âm thế nào thì viết thế ấy'', nên có sự tương ứng
1344 khá lớn giữa chữ viết và phát âm.
1349 \subsection{Chính tả tiếng Việt}
1352 Nói ngắn gọn, chính tả là toàn bộ những tiêu chuẩn và những qui luật
1353 thực hành chữ viết, bao gồm:
1354 \begin{enumerate}
1355 \item Những luật dùng các con chữ của bảng chữ cái để viết các từ.
1356 \item Luật viết các từ độc lập với những chữ cái khi viết chúng.
1358 Ví dụ: Cách dùng các dấu câu, cách viết hoa, tên người, tên đất~\ldots{}
1359 \end{enumerate}
1361 Chuẩn mực của cách viết thường tuân theo những nguyên tắc khác nhau.
1363 Đối với những luật chính tả liên quan đến việc sử dụng các con
1364 chữ của bảng chữ cái ghi âm, có thể kể đến các nguyên tắc cơ bản sau
1365 đây:
1367 \begin{description}
1368 \item[Nguyên tắc âm vị học] Mỗi âm vị được thể hiện bằng một
1369 chữ cái, không phụ thuộc vào vị trí của nó trong các từ và tổ hợp
1370 từ.
1371 \item[Nguyên tắc ngữ âm học] Chữ cái phản ánh phát âm của âm vị ở
1372 những vị trí hay bối cảnh khác nhau.
1373 \item[Nguyên tắc từ nguyên] Nguyên tắc viết theo lịch sử, truyền
1374 thống. Phản ánh trên chữ viết không phải là trạng thái hiện tại mà
1375 là trạng thái quá khứ của hệ thống âm thanh.
1376 \end{description}
1378 Trong bất kỳ một hệ thống chữ viết nào cũng có thể thấy sự kết hợp các
1379 nguyên tắc khác nhau. Nhưng mỗi hệ thống chữ viết có những nguyên tắc
1380 chủ yếu. Chữ quốc ngữ được xây dựng chủ yếu trên nguyên tắc âm vị học
1381 và ngữ âm học. Ngược lại, chữ Pháp và chữ Anh chủ yếu dùng nguyên tắc
1382 từ nguyên, viết theo truyền thống lịch sử.
1384 % Cấu trúc âm tiết:
1385 Âm tiết trong tiếng Việt có 5 thành phần, đó là thanh điệu, âm đầu, âm
1386 đệm, âm chính và âm cuối.
1388 Âm đầu các âm vị phụ âm đảm nhiệm. Các âm tiết mà có chữ trên chữ viết
1389 không ghi phụ âm đầu có thể có âm đầu là âm tắt thanh hầu \textipa{/P/}.
1391 Âm đệm do các âm vị bán nguyên âm \textipa{/-u-/} đảm nhiệm.
1393 Âm chính do các âm vị nguyêm âm đảm nhiệm như trong bảng~\vref{tab:nguyenam}.
1395 %\begin{savenotes}
1396 \begin{table}[htbp]
1397 \centering
1399 \begin{tabular}{cc|cc}
1400 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1401 \textipa{/i/}&i,y&\textipa{/o/}&ô,ôô\\
1402 \textipa{/e/}&ê&\textipa{/O/}&o,oo\\
1403 \textipa{/E/}&e,a&\textipa{/\v{7}/}&â\\
1404 \textipa{/W/}&ư&\textipa{/\v{a}/}&a,ă\\
1405 \textipa{/7/}&ơ&\textipa{/ie/}&iê,ia,yê,ya\\
1406 \textipa{/a/}&a&\textipa{/uo/}&uô,ua\\
1407 \textipa{/u/}&u&\textipa{/W7/}&ươ,ưa\\
1408 \end{tabular}
1410 \caption{Bảng nguyên âm}
1411 \label{tab:nguyenam}
1412 \end{table}
1413 %\end{savenotes}
1415 Âm cuối do các âm vị phụ âm bán nguyên âm đảm nhiệm như trong
1416 bảng~\vref{tab:amcuoi}.
1418 \begin{table}[htbp]
1419 \centering
1421 \begin{tabular}{cc|cc}
1422 \multicolumn{2}{c|}{Phụ âm cuối}&\multicolumn{2}{c}{Bán nguyên âm cuối}\\
1423 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1424 \textipa{/-p/}&p&\textipa{/-u/}&u,o\\
1425 \textipa{/-t/}&t&\textipa{/-i/}&i,y\\
1426 \textipa{/-k/}&c,ch\\
1427 \textipa{/-m/}&m\\
1428 \textipa{/-n/}&n\\
1429 \textipa{/-N/}&ng,nh\\
1430 \end{tabular}
1432 \caption{Bảng phụ âm và bán nguyên âm cuối}
1433 \label{tab:amcuoi}
1434 \end{table}
1436 Trên chữ viết, các âm vị âm đầu được thể hiện như trong bảng~\vref{tab:phuamdau}.
1438 %\begin{savenotes}
1439 \begin{table}[htbp]
1440 \centering
1441 \begin{minipage}[htbp]{0.6\textwidth}
1442 \def\thefootnote{\alph{mpfootnote}}
1443 \centering
1445 \begin{tabular}{cc|cc}
1446 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1447 \textipa{/b/}&b&\textipa{/m/}&m\\
1448 \textipa{/f/}&ph&\textipa{/v/}&v\\
1449 \textipa{/t\super{h}/}&th&\textipa{/t/}&t\\
1450 \textipa{/d/}&đ&\textipa{/n/}&n\\
1451 \textipa{/s/}&x&\textipa{/z/}&d,gi\footnote{Dựa vào nguyên tắc từ nguyên để phân biệt}\\
1452 \textipa{/l/}&l&\textipa{/\:t/}&tr\\
1453 \textipa{/\:s/}&s&\textipa{/\:z/}&r\\
1454 \textipa{/c/}&ch&\textipa{/\textltailn/}&nh\\
1455 \textipa{/k/}&
1456 q\footnote{Dùng khi đứng trước bán nguyên âm \textipa{/-u-/}},
1457 k\footnote{Dùng khi đứng trước các nguyên âm \textipa{/i,e,E,ie/}},
1459 \textipa{/N/}&ngh\footnotemark, ng\\
1460 \textipa{/x/}&kh&\textipa{/G/}&gh\footnotemark, g\\
1461 \textipa{/h/}&h&\textipa{/P/}&khuyết\\
1462 \end{tabular}
1464 \caption{Bảng phụ âm đầu}
1465 \label{tab:phuamdau}
1467 \end{minipage}
1468 \end{table}
1469 %\end{savenotes}
1471 Một số âm như k và q, gh và g, ngh và ng là cùng âm vị. Tuy nhiên, do
1472 khi hình thành chữ quốc ngữ, ngữ âm tiếng Việt chưa được nghiên cứu
1473 đầy đủ, nên các giáo sĩ đã phải mượn nhiều con chữ ghép trong chữ Bồ
1474 Đào Nha, Hi Lạp, Pháp, Ý~\ldots{} dẫn đến sự không đồng nhất khi biểu
1475 diễn âm vị.
1477 Hệ thống âm chính tiếng Việt dựa trên cách phát âm Hà Nội bao gồm 9
1478 nguyên âm dài, 2 nguyên âm ngắn, 3 nguyên âm đôi. Tóm gọn các cách
1479 biểu diễn nguyên âm chính gồm: i, y, ê, e, a, ư, ơ, a, u, ô, o, â, ă,
1480 iê, ia, yê, y, uô, y, uô, ươ, ưa.
1482 Các phụ âm cuối được ghi bằng ``nh'' khi đứng sau các nguyên âm i, y,
1483 ê, e, a. Ví dụ: {\em minh, mênh, manh}. Trong các trường hợp khác lại
1484 được ghi bằng ``ng''. Ví dụ: {\em mang, vâng, hồng, xuống}.
1486 Các bán nguyên âm cuối /-u/ ghi bằng ``o'' khi đứng sau các nguyên âm đơn
1487 dài, ở bậc thanh lượng lớn như e, a. Các viết này biểu diễn sự biến
1488 dạng của các bán âm sau các mở rộng. Trong các trường hợp còn lại, bán
1489 nguyên âm này được ghi bằng ``u''.
1491 Các bán nguyên âm cuối /-i/ được ghi bằng ``y'' khi đứng sau các
1492 nguyên âm ngắn ă, a, â. Trong các trường hợp khác nó được ghi bằng
1493 ``i''.
1495 Tóm lại, các âm vị cuối được thể hiện bằng những chữ cái: p, t, c, ch,
1496 m, n, ng, nh, u, o, i, y.
1498 Tiếng Việt có sáu thanh điệu: sắc, huyền, ngã, hỏi, nặng và thanh không dấu.
1500 Về việc bỏ dấu, có ba nguyên tắc bỏ dấu sau:
1501 \begin{description}
1502 \item[Nguyên tắc bỏ dấu khoa học] Dấu thanh được đặt ở âm chính của
1503 vần, tức là đặt trên hoặc dưới nguyên âm có vai trò quyết định âm
1504 sắc chủ yếu của âm tiết.
1505 \item[Nguyên tắc thẩm mỹ] (nguyên tắc thứ yếu) Dấu thanh được đặt ở vị
1506 tri cân đối trong âm tiết. Nguyên tắc này trước đây hay dùng nhưng
1507 nay trong một số trường hợp nếu đặt dấu thanh sai sẽ làm cho phát âm
1508 không đúng và hiểu sai nghĩa từ.
1509 \item[Nguyên tắc thực dụng] Dấu thanh thường được đặt vào một con chữ
1510 nguyên âm chứ không đặt ở giữa hai con chữ, để tiện việc in ấn.
1511 \begin{itemize}
1512 \item Nếu âm chính là một nguyên âm đơn thì dấu thanh luôn luôn được
1513 ghi ở trên hoặc ở dưới âm chính.
1514 \item Nếu âm chính là một nguyên âm đôi thì tùy trường hợp có thể bỏ
1515 đấu thanh ở yếu tố thứ nhất hoặc yếu tố thứ hai của âm chính.
1516 \end{itemize}
1517 \end{description}
1519 %XXX \subsection{Những qui định về chính tả tiếng Việt}
1522 \subsection{Lỗi chính tả}
1524 % Lỗi chính tả là gì?
1526 Theo~\cite{LoiChinhTa} thì:
1527 \begin{verse}
1528 Chữ viết là hệ thống ký hiệu bằng đường nét đặt ra để ghi tiếng nói
1529 và có những qui tắc, qui định riêng. Muốn viết đúng chính tả tiếng
1530 Việt, ta phải tuân theo những qui định, qui tắc đã được xác lập.
1532 Chính tả là cách viết chữ được xem là chuẩn, tức là viết đúng âm
1533 đầu, đúng vần, đúng dấu (thanh), đúng quy định về viết hoa, viết
1534 tắt, viết thuật ngữ.
1535 \end{verse}
1537 Các lỗi chính tả thường rơi vào loại lỗi do phát âm sai dẫn đến viết
1538 sai (lỗi hỏi-ngã, lỗi sai âm đầu, sai âm chính, sai âm cuối). Ngoài ra
1539 còn các loại lỗi khác như viết hoa không đúng qui cách, viết tên
1540 riêng, thuật ngữ, tên tiếng nước ngoài không đúng qui cách.
1542 %% Tiếng Việt có sáu thanh điệu, nhưng hầu hết mọi người không phân biệt
1543 %% hai thanh hỏi và ngã. Loại lỗi này rất phổ biến, kể cả ở những người
1544 %% có trình độ văn hoá cao. Nguyên nhân là do các phương ngữ Trung và Nam
1545 %% Bộ không có thanh ngã. Ngoài ra số tiếng mang hai thanh này khá lớn
1546 %% (khoảng 1900 tiếng mang thanh hỏi và 900 tiếng mang thanh ngã)
1548 %% Về âm đầu, các âm sau thường bị lẫn lộn: C/K, G/Gh, Ng/Ngh,
1549 %% Ch/Tr, S/X, V/D/Gi/R, W/Hw/Ngw/Qu.
1551 %% Về âm chính thường lẫn lộn các âm sau: ai/ay/ây,
1552 %% ao/au/âu, ăm/âm, ăp/âp, iu/iêu/êu, im/iêm/em, ip/iêp/êp/ep,
1553 %% oi/ôi/ơi, om/ôm/ơm, op/ôp/ơp, ong/ông, oc/ôc, ui/uôi, um/uôm, up/(uôp),
1554 %% ưi/ươi, ưu/ươu, ưm/ươm, (ưp)/ươp.
1556 %% Về âm cuối thường lẫn lộn chữ ghi các âm cuối trong các vần sau:
1557 %% an/ang, at/ac, ăn/ăng, ăt/ăc, ân/âng, ât/âc, en/eng, et/ec, ên/ênh,
1558 %% êt/êch, in/inh, it/ich, iên/iêng, iêt/iêc, ơn/(ơng), ơt/(ơc),
1559 %% un/ung, ut/uc, uôn/uông, uôt/uôc, ưn/ưng, ưt/ưc, ươn/ương, ươt/ươc.
1561 %% Sai quy cách viết hoa do chưa thống nhất quy cách viết hoa (hoặc thống
1562 %% nhất quá trễ)
1565 %% XXX
1567 \chapter{Cơ sở tin học}
1568 \label{cha:math}
1569 %TOC
1570 \minitoc
1572 % typographic errors
1574 %% Lỗi gõ sai được xử lý bằng thuật toán soundex~\cite{soundex}. Ý tưởng
1575 %% của thuật toán này dựa trên các nghiên cứu về nguyên nhân gây ra
1576 %% lỗi. Theo~\cite{soundex}, có bốn nguyên nhân gây ra lỗi loại này:
1577 %% \begin{itemize}
1578 %% \item Chèn một ký tự đơn.
1579 %% \item Xoá một ký tự đơn.
1580 %% \item Thay một ký tự bằng một ký tự khác.
1581 %% \item Hoán đổi vị trí hay ký tự kề nhau.
1582 %% \end{itemize}
1583 %% Thuật toán này
1585 \section{Bắt lỗi chính tả}
1587 Trình bắt lỗi chính tả có thể được đánh giá theo nhiều cách khác
1588 nhau. Nhưng chủ yếu vẫn được phân loại từ quan điểm người dùng: khả
1589 năng phát hiện lỗi sai, và khả năng đề nghị những từ thay thế cho lỗi
1590 sai đó.
1592 \subsection{Phân loại lỗi chính tả}
1594 Có nhiều cách phân loại lỗi khác nhau. Tuy nhiên, xét theo quan điểm của
1595 chương trình bắt lỗi chính tả thì lỗi chính tả có thể phân làm hai
1596 loại là lỗi non-word và lỗi real-word (được sử dụng trong~\cite{Tuoi}):
1597 \begin{itemize}
1598 \item Lỗi non-word là lỗi tạo ra từ sai, hoàn toàn không có trong từ
1599 điển. Đây là loại lỗi dễ phát hiện. (Ví dụ, ``hoa2'',
1600 ``nhưg''~\ldots)
1601 \item Lỗi real-word là lỗi chính tả mà từ/tiếng đó có trong từ điển. Nếu
1602 không dựa vào ngữ cảnh chung quanh thì không thể xác định đó có phải
1603 là lỗi chính tả hay không. (Ví dụ, ``Anh ta là một người bàng
1604 quang'' --- từ ``bàng quang'' không đúng, nhưng vẫn có trong từ
1605 điển). Đây là loại lỗi rất khó nhận ra và xử lý.
1606 \end{itemize}
1608 Ngoài ra có thể phân loại lỗi theo nguồn gốc phát sinh lỗi. Theo cách
1609 phân loại này, có hai loại lỗi chiếm đa số là lỗi phát âm sai và lỗi
1610 nhập sai.
1611 \begin{itemize}
1612 \item Lỗi phát âm sai.
1613 Lỗi này do sự nhầm lẫn giữa cách đọc và cách
1614 viết giữa những từ đồng âm hoặc gần với nhau. Với tiếng Việt, do có
1615 nhiều khác biệt cách phát âm giữa các vùng trong khi hệ thống chữ
1616 viết dựa trên hệ thống phát âm tiếng Hà Nội, nên dễ dẫn đến các lỗi
1617 sai loại này.
1619 \item Lỗi nhập sai.
1620 Lỗi gây ra do gõ sai phím, gõ sót phím hoặc dư phím.
1622 \item Các lỗi khác.
1623 Ngoài hai loại lỗi trên, còn có nhiều nguyên nhân khác dẫn đến lỗi
1624 chính tả. Một trong những nguyên nhân đó là lỗi dùng từ sai (do hiểu
1625 sai, hoặc không hiểu rõ cách dùng từ). Đây thực chất thuộc về lỗi từ
1626 vựng, nhưng đôi khi người dùng lại đòi hỏi trình bắt lỗi chính tả phải
1627 tìm ra những lỗi này.
1629 Ngoài lỗi dùng từ sai, còn có những lỗi phát sinh do máy móc. Hai công
1630 cụ liên quan đến xử lý văn bản và dễ gây ra lỗi chính tả là nhận dạng
1631 tiếng nói và nhận dạng chữ viết. Đối với nhận dạng tiếng nói, lỗi
1632 thường gặp giống với dạng lỗi phát âm sai. Tuy nhiên, đối với một số
1633 ngôn ngữ như tiếng Anh --- mỗi từ gồm nhiều âm tiết --- thì có thể gây
1634 ra lỗi tách từ sai. Đối với nhận dạng văn bản, lỗi chủ yếu do sự giống
1635 nhau giữa các chữ cái khi viết. Thông thường, bản thân các công cụ này
1636 cũng được cài đặt một trình bắt lỗi chính tả tự động (dạng đơn giản
1637 hoặc phức tạp) nhằm giảm thiểu các lỗi chính tả.
1638 \end{itemize}
1640 %\subsection{Phân loại lỗi}
1642 \noindent Theo \cite{Chang} thì lỗi bao gồm:
1643 \begin{itemize}
1644 \item Giống phiên âm
1645 \item Giống hình dạng chữ viết
1646 \item Giống nghĩa
1647 \item Giống cách gõ
1648 \end{itemize}
1650 \subsection{Phát hiện lỗi chính tả}
1652 Giải pháp đơn giản để phát hiện lỗi chính tả là dùng một cấu trúc dữ
1653 liệu để lưu tất cả các từ đã biết (được lưu trong từ điển). Nếu từ
1654 không có trong từ điển nghĩa là từ đó bị sai. Giải pháp này cần thêm
1655 một số heuristic để tránh không xem các con số, ngày tháng~\ldots{}
1656 lỗi sai.
1658 Đối với trình bắt lỗi chính tả truyền thống thì từ điển là một phần
1659 rất quan trọng. Từ điển có thể được lưu theo các dạng
1660 cấu trúc dữ liệu như bảng băm hoặc cấu trúc dữ liệu dạng cây có thể
1661 được sử dụng~\cite{McIlroy,Peterson}
1663 Với những lỗi sai dạng lỗi từ vựng, ta phải dùng một số phương pháp
1664 khác phức tạp hơn để phát hiện (chi tiết trong
1665 phần~\vref{sec:context-spelling}).
1667 \subsection{Các sai lầm của trình bắt lỗi chính tả}
1669 Khi bắt lỗi chính tả, trình bắt lỗi không tránh khỏi các sai lầm. Có
1670 thể phân ra làm hai loại sai lầm: sai lầm tích cực\footnote{false
1671 positive} và sai lầm tiêu cực\footnote{false negative}.
1673 Sai lầm tích cực xảy ra khi trình bắt lỗi báo lỗi ở những từ hoàn toàn
1674 không sai chính tả. Sai lầm tiêu cực xảy ra khi trình bắt lỗi bỏ qua
1675 những từ bị sai chính tả. Nói cách khác, trình bắt lỗi cho rằng những
1676 từ sai chính tả này không sai. Sai lầm tích cực có thể tránh được nhờ
1677 tăng kích thước từ điển. Tuy nhiên đây không phải là giải pháp hoàn
1678 hảo. Việc tăng kích thước từ điển sẽ tốn kém (về bộ nhớ, CPU, cũng như
1679 công sức bỏ ra để xây dựng từ điển). Hơn nữa, càng có nhiều
1680 từ thì việc đề nghị các từ thay thế càng trở nên kém hiệu quả do bị
1681 phân tán bởi những từ rất ít gặp, không thể tập trung vào những lỗi
1682 phổ biến.
1684 Sai lầm tiêu cực có thể xem là lỗi không phát hiện được. Phần nhiều
1685 những lỗi này thường đòi hỏi phải hiểu văn bản (ít nhất là một phần
1686 văn bản) để có thể phát hiện lỗi. Những dạng lỗi từ vựng, lỗi cú pháp
1687 thường rơi vào dạng này. Tuy nhiên vẫn có một số lỗi chính tả rơi vào
1688 loại này. Những loại lỗi này được phát hiện nhờ những chương trình bắt
1689 lỗi chính tả cảm ngữ cảnh (xem phần~\vref{sec:context-spelling}).
1691 %~\cite{Golding95,Golding96,Golding99}
1693 Trong hai loại sai lầm thì sai lầm tích cực thường gây khó chịu cho
1694 người sử dụng, dễ gây tâm lý không tin tưởng vào trình bắt lỗi chính
1695 tả. Ngược lại, sai lầm tiêu cực phản ánh tính hiệu quả của trình bắt
1696 lỗi chính tả. Sai lầm tiêu cực càng nhiều thì trình bắt lỗi càng kém
1697 hiệu quả.
1699 \subsection{Vấn đề chữ hoa, chữ thường}
1701 Vấn đề chữ hoa/chữ thường gây nhiều khó khăn cho trình bắt lỗi chính
1702 tả. Trong từ điển, hầu hết các từ là chữ thường. Tuy nhiên cũng có chữ
1703 hoa (tên riêng, từ viết tắt~\ldots{}). Các quy tắc chính tả về viết hoa
1704 cũng khá phức tạp. Ngoài ra, đôi khi các chữ được viết hoa hoàn toàn
1705 để nhấn mạnh, để làm tiêu đề~\ldots{}
1707 Thuật toán để xử lý trường hợp chữ hoa, chữ thường có thể được mô tả
1708 như trong thuật toán~\vref{algo:capital}.
1709 \begin{algo}
1710 \caption{Xử lý chữ hoa, chữ thường}
1711 \label{algo:capital}
1712 \begin{enumerate}
1713 \item Đặt $w_t$ là chữ viết thường của $w$.
1714 \item Đặt $c$ là kết quả tìm kiếm $w_t$.
1715 \item Nếu không tìm được $c$, từ bị sai chính tả.
1716 \item Nếu $c$ giống $w$, từ đúng.
1717 \item Đặt $c_c$ là chữ thường, viết hoa chữ cái đầu tiên của $w$. Nếu
1718 $c$ giống $c_c$, từ đúng.
1719 \item Đặt $c_u$ là chữ hoa của $w$. Nếu $c$ giống $c_u$, từ đúng.
1720 \item Ngược lại, từ $w$ sai.
1721 \end{enumerate}
1722 \end{algo}
1726 \section{Lập danh sách từ đề nghị}
1727 \label{sec:candidate-list}
1729 Sau khi phát hiện ra từ bị sai chính tả, ta cần đưa ra một số từ ``gần
1730 giống'' có khả năng thay thế từ bị sai chính tả. Trong trường hợp lý
1731 tưởng, ta nên đưa ra {\em một từ duy nhất}, đó chính là từ đúng
1732 chính tả, lẽ ra cần phải được dùng thay cho từ bị sai chính tả.
1734 Tuy nhiên, việc tìm ra từ đúng của từ bị sai chính tả là một công việc
1735 không dễ dàng, ngay cả với con người. Khi gặp một từ sai chính tả, ta
1736 thường phải suy nghĩ nhiều, chọn ra một số từ có khả năng thay thế,
1737 kiểm nghiệm xem từ nào là từ thích hợp nhất. Quá trình kiểm nghiệm xem
1738 từ nào là thích hợp thường đòi hỏi phải hiểu về nội dung của văn bản
1739 đang xem (đối với con người). Đối với máy tính, việc hiểu văn bản, đến
1740 nay vẫn là một vấn đề khó. Tuy nhiên, máy tính cũng có khả năng tìm ra
1741 kết quả đối với một số trường hợp lỗi thông dụng (chi tiết trong phần
1742 \vref{sec:context-spelling}). Việc tìm ra chỉ một kết quả duy nhất đưa
1743 đến một thuận lợi đáng kể. Bởi vì chỉ có một kết quả, không cần phải lựa
1744 chọn, nên ta có thể tạo ra chương trình bắt lỗi chính tả (và sửa lỗi
1745 chính tả) tự động. Việc tạo ra một chương trình bắt lỗi chính tả tự
1746 động hoàn toàn mở ra một khả năng to lớn khi áp dụng vào thực tế, giúp
1747 giảm đáng kể công sức của con người.
1749 Trong trường hợp không thể đưa ra một đề nghị duy nhất, ta có thể đưa
1750 ra một danh sách các từ ``có khả năng'' để người dùng chọn lựa. Yêu
1751 cầu đặt ra là từ đúng phải nằm trong danh sách từ lựa chọn. Và tốt hơn
1752 nữa là từ đúng nên được đặt trên cùng danh sách để gây sự chú ý của
1753 người dùng (chi tiết trong phần \vref{sec:sort-candidates}). Để đảm
1754 bảo từ đúng nằm trong danh sách, ta cần tìm hiểu nguyên nhân dẫn đến
1755 lỗi, sau đó cố gắng phục hồi lỗi để tạo lại những từ có khả năng. Do
1756 có nhiều nguyên nhân khác nhau dẫn đến lỗi chính tả, nên cũng có nhiều
1757 cách khác nhau để phát sinh danh sách từ đề nghị.
1760 \subsection{Lỗi phát âm sai}
1762 Đối với các ngôn ngữ như tiếng Việt --- vốn ``nói sao viết vậy'', giải
1763 pháp khá đơn giản. Ta có thể phân tích cấu trúc tiếng trong tiếng
1764 Việt, sau đó dựa vào các cách phát âm giống nhau để tạo ra danh sách
1765 các tiếng phát âm giống nhau.
1767 Đối với các ngôn ngữ như tiếng Anh --- cách viết không còn tương ứng
1768 với cách đọc nữa, thì giải pháp sẽ phức tạp hơn. Cơ bản là ta cần một
1769 cách nào đó để chuyển từ được viết thành một dạng phiên âm, sau đó áp
1770 dụng như bình thường. Một số heuristic được đưa ra để giải quyết vấn
1771 đề này. Thuật toán cơ bản là Soundex~\cite{knuth73}. Nhiều thuật toán
1772 khác được đưa ra để cải tiến Soundex như Double
1773 Metaphone\footnote{http://aspell.sourceforge.net/metaphone/},
1774 Phonetex~\cite{phonetex}. Soundex cũng được cải tiến để áp dụng cho
1775 các ngôn ngữ khác, như tiếng Thái~\cite{tsdx}. Nói chung, các kỹ thuật
1776 này biến đổi về cơ bản thay thế các ký tự trong từ bằng như ký tự khác
1777 chung hơn, với mục đích làm cho sau khi biến đổi, các từ có cách đọc
1778 giống nhau sẽ trở nên giống nhau. Ví dụ như trong Soundex:
1779 \begin{itemize}
1780 \item Các ký tự ``aeiouhwy'' được thay bằng ``0''.
1781 \item ``bpfv'' được thay bằng ``1''.
1782 \item ``cgjkqsxz'' được thay bằng ``2''.
1783 \item ``dt'' được thay bằng ``3''.
1784 \item ``l'' được thay bằng ``4''.
1785 \item ``mn'' được thay bằng ``5''.
1786 \item ``r'' được thay bằng ``6''.
1787 \end{itemize}
1788 Cách thay thế khác nhau tùy vào từng thuật giải. Ngoài ra, các
1789 thuật giải có thể giữ lại một số ký tự mà không thay thế.
1791 \subsection{Lỗi nhập sai}
1793 Lỗi nhập liệu xảy ra khi gõ không
1794 đúng phím cần gõ trên bàn phím. Damerau~\cite{Damerau} xác định bốn thao
1795 tác có thể gây ra lỗi như sau:
1796 \begin{itemize}
1797 \item Tráo đổi một cặp ký tự.
1798 \item Xóa một ký tự đã có.
1799 \item Chèn một ký tự lạ.
1800 \item Thay một ký tự bằng một ký tự khác.
1801 \end{itemize}
1803 Damerau cho rằng 80\% các lỗi là do thực hiện thao tác trên một lần
1804 (một trong bốn thao tác trên).
1806 Phân loại lỗi theo các thao tác trên dẫn đến một kỹ thuật sửa lỗi đơn
1807 giản được dùng bởi~\cite{Petersonb}. Nếu phát hiện một từ bị sai
1808 chính tả, ta lần lượt thực hiện lại những thao tác trên để phục hồi từ
1809 bị sai chính tả. Những từ được phát sinh, nếu có trong từ điển, sẽ
1810 được lưu vào danh sách những từ đề nghị. Kỹ thuật này thường được gọi
1811 là Đảo ngược lỗi\footnote{Error reversal}.
1813 \subsection{Các lỗi khác}
1815 Ngoài hai loại lỗi trên, còn có nhiều nguyên nhân khác dẫn đến lỗi
1816 chính tả. Một trong những nguyên nhân đó là lỗi dùng từ sai (do hiểu
1817 sai, hoặc không hiểu rõ cách dùng từ). Đây thực chất thuộc về lỗi từ
1818 vựng, nhưng đôi khi người dùng lại đòi hỏi trình bắt lỗi chính tả phải
1819 tìm ra những lỗi này.
1821 Ngoài lỗi dùng từ sai, còn có những lỗi phát sinh do máy móc. Hai công
1822 cụ liên quan đến xử lý văn bản và dễ gây ra lỗi chính tả là nhận dạng
1823 tiếng nói và nhận dạng chữ viết. Đối với nhận dạng tiếng nói, lỗi
1824 thường gặp giống với dạng lỗi phát âm sai. Tuy nhiên, đối với một số
1825 ngôn ngữ như tiếng Anh --- mỗi từ gồm nhiều âm tiết --- thì có thể gây
1826 ra lỗi tách từ sai. Đối với nhận dạng văn bản, lỗi chủ yếu do sự giống
1827 nhau giữa các chữ cái khi viết. Thông thường, bản thân các công cụ này
1828 cũng được cài đặt một trình bắt lỗi chính tả tự động (dạng đơn giản
1829 hoặc phức tạp) nhằm giảm thiểu các lỗi chính tả.
1831 \section{Sắp xếp danh sách}
1832 \label{sec:sort-candidates}
1835 Việc chọn từ tốt nhất trong danh sách từ đề nghị là một công việc không dễ
1836 dàng. \cite{Agirre} mô tả cách lựa chọn trong trường hợp
1837 này, có thể chia làm các nhóm như sau:
1839 \begin{itemize}
1840 \item Sử dụng phân tích cú pháp để loại bỏ những từ sai từ loại, hoặc
1841 sai các đặc trưng hình thái (số đếm, chữ hoa/chữ thường~\ldots{})
1842 \item Khử nhập nhằng ngữ nghĩa để chọn từ phù hợp với ngữ cảnh nhất.
1843 \item Dùng thống kê để chọn từ thường xuất hiện nhất.
1844 \item Những từ có cách viết hoa/thường khác với từ bị sai sẽ bị loại
1845 (ví dụ, nếu từ viết sai là chữ thường thì các từ đề nghị viết hoa sẽ
1846 bị loại)
1847 \end{itemize}
1850 Một số kỹ thuật để sắp xếp danh sách từ được chọn sẽ được mô tả ngắn
1851 gọn bên dưới.
1852 %%% Giải thích cụ thể hơn.
1854 \subsection{Văn phạm ràng buộc}
1856 %-% Constraint Grammar a Language independent system for parsing
1857 %-% unrestricted text.
1859 Văn phạm ràng buộc\footnote{Constraint Grammar} (CG) được thiết kế
1860 độc lập ngôn ngữ và là một công cụ mạnh giúp khử nhập nhằng các văn
1861 bản không giới hạn~\cite{cg}.
1863 CG có thể được xem như một tập hợp các luật mẫu-hành
1864 động\footnote{pattern-action rule}, không quá một luật với mỗi tag có nhập
1865 nhằng. Mỗi luật bao gồm một hoặc nhiều mẫu (các ``ràng buộc'') xác
1866 định khi nào tag đó không hợp lệ. Nếu thỏa một mẫu trong số các mẫu
1867 của luật, tag đó sẽ bị xoá. Các mẫu ngữ cảnh có thể là mẫu cục bộ hoặc
1868 toàn cục, có thể tham khảo những phân tích nhập nhằng hoặc không nhập
1869 nhằng. Thuật toán sẽ được chạy vài lần để giảm nhập nhằng từ từ, nhờ đó
1870 giúp các ngữ cảnh giảm nhập nhằng, hoặc không còn nhập nhằng, tạo điều
1871 kiện khử nhập nhằng những từ khác.
1873 Mô tả cú pháp và hình thái được mã hoá bằng tag thay vì cấu trúc đóng
1874 mở ngoặc. Mô tả cú pháp rất nông. Mỗi từ được gắn với một tag chức
1875 năng cú pháp\footnote{syntactic function tag}, quy định mô tả phụ
1876 thuộc về mặt chức năng.
1878 Các ràng buộc giúp tránh các dự đoán có nhiều rủi ro chứ không chọn ra
1879 giải pháp đúng. Do đó CG chỉ giúp giảm số lượng các nhập nhằng. Văn
1880 phạm ràng buộc tiếng Anh (EngCG) đã giúp cải thiện đáng kể chất
1881 lượng bộ đánh nhãn từ loại tiếng Anh. Văn phạm ràng buộc giúp loại bỏ
1882 hầu hết các nhập nhằng có thể được.
1884 % XXX vd
1887 Việc áp dụng CG để khử nhập nhằng cho trình bắt lỗi chính tả là một
1888 công việc khó khăn vì hiện nay CG cho tiếng Việt vẫn chưa được xây
1889 dựng.
1891 \subsection{Mật độ quan niệm}
1892 %-% Word Sense disambiguation using conceptual density 96.
1895 Đây thực chất là áp dụng khử nhập nhằng ngữ nghĩa dùng
1896 WordNet và độ đo khoảng cách giữa các khái niệm trong WordNet. Cách
1897 này được áp dụng cho danh từ.
1899 WordNet là một mạng ngữ nghĩa về từ vựng tiếng Anh, bao gồm các mối
1900 liên hệ khác nhau giữa các từ tiếng Anh. WordNet định nghĩa các quan
1901 hệ khác nhau cho mỗi từ loại. Đối với danh từ thì hai loại quan hệ
1902 quan trọng nhất là hypernym và hyponym.
1904 A được xem là hyponym của B
1905 (và B là hypernym của A) nếu ta có thể nói ``A là một loại đặc biệt
1906 của B''. Ví dụ, cây là một loại thực vật. Vậy cây là hyponym của thực
1907 vật (và thực vật là hypernym của cây)
1909 WordNet được tổ chức theo đơn vị là các synset. Synset
1910 (Synonym set) là một nhóm các từ đồng nghĩa có thể dùng thay thế cho
1911 nhau. Mỗi từ có thể thuộc nhiều synset khác nhau. Trong trường hợp đó,
1912 các syset được gọi là sense của từ đó. Phần danh từ trong WordNet có
1913 thể xem như một đồ thị của các synset và các liên kết hypernym/hyponym
1914 giữa các synset đó.
1916 Độ đo khái niệm\footnote{conceptual distance} cung cấp một nền tảng để
1917 đo độ giống nhau về mặt nghĩa của các từ. Độ đo khái niệm được định
1918 nghĩa bởi \cite{Rada} là độ dài đường đi ngắn nhất liên kết các khái
1919 niệm trong mạng ngữ nghĩa phân cấp.
1921 Cho một khái niệm $c$ nằm trên đỉnh cây con và $nhyp$ là số hypernym
1922 mỗi nút. Mật độ quan niệm\footnote{conceptual density} (CD) để khử nhập nhằng cho $c$ khi cây con của
1923 nó chứa $m$ sense của từ đó như sau:
1925 $$CD(c,m)=\frac{\displaystyle\sum^{m-1}_{i=0}nhyp^{i^{0.20}}}{descendants_c}$$
1927 Trong công thức trên, tham số $0,20$ được dùng để làm trơn hệ số mũ
1928 $i$ khi $m$ chạy từ 1 đến số sense tổng cộng trong WordNet. Nhiều giá
1929 trị đã được thử cho tham số này và tham số gần $0,20$ là tốt nhất.
1932 Thuật toán khử nhập nhằng dựa trên CD như sau: Cho cửa sổ với kích
1933 thước nhất định, chương trình di chuyển cửa sổ mỗi
1934 danh từ một lần, từ đầu câu cho đến hết, khử nhập nhằng cho danh từ ở
1935 chính giữa cửa sổ, xem các danh từ còn lại trong cửa sổ là ngữ
1936 cảnh. Đặt cửa sổ các danh từ là $W$ và danh từ chính giữa cửa sổ là
1937 $w$, ta có thuật toán~\vref{algo:CD}.
1939 \begin{algo}
1940 \caption{Khử nhập nhằng danh từ dùng CD}
1941 \label{algo:CD}
1942 \begin{enumerate}
1943 \item tree := compute\_tree(words\_in\_window).
1945 Loop
1946 \item tree := compute\_conceptual\_distance(tree)
1947 \item concept := select\_concept\_width\_highest\_weight(tree)
1949 if concept = null then exitloop
1950 \item tree := mark\_disambiguated\_senses(tree,concept)
1952 endloop
1953 \item output\_disambiguation\_result(tree)
1954 \end{enumerate}
1955 \end{algo}
1957 Đầu tiên, thuật toán thể hiện một dàn các danh từ trong cửa sổ, các
1958 sense và hypernym của chúng (bước 1). Sau đó thuật toán tính
1959 CD cho mỗi khái niệm trong WordNet tương ứng với sense
1960 nó chứa trong cây con của nó (bước 2). Thuật toán chọn khái niệm $c$
1961 với CD cao nhất (bước 3) và chọn sense đúng bên dưới
1962 cho những từ tương ứng (bước 4).
1964 Thuật toán tiến hành tính CD cho những sense còn lại trong dàn, tiếp
1965 tục khử nhập nhằng những danh từ còn lại trong cửa sổ (quay lại bước
1966 2, 3, 4). Khi không thể khử nhập nhằng được nữa, những sense còn lại
1967 của $w$ được xử lý và xuất kết quả ra (bước 5).
1969 Giải pháp CD có hạn chế là chỉ áp dụng đối với danh từ. Những loại từ
1970 khác, do có các mối quan hệ phức tạp hơn nhiều so với quan hệ hypernym
1971 của danh từ nên rất khó áp dụng. CD đôi khi không thể khử nhập nhằng
1972 tuyệt đối (chỉ chừa lại một kết quả) mà nhiều khi vẫn còn lại vài nhập
1973 nhằng. Tuy nhiên việc giảm nhập nhằng bằng CD cũng giúp ít rất nhiều
1974 cho trình bắt lỗi chính tả.
1976 Hạn chế quan trọng của CD khi áp dụng cho
1977 tiếng Việt là thiếu WordNet hoàn chỉnh cho tiếng Việt. Việc xây dựng một
1978 mạng ngữ nghĩa tiếng Việt có tầm vóc như WordNet sẽ tốn rất nhiều công
1979 sức, chưa kể các điểm khác biệt giữa tiếng Anh và tiếng Việt đòi hỏi
1980 các nhà ngôn ngữ học phải xem xét lại có thể áp dụng hoàn toàn các mối quan hệ
1981 đã được sử dụng trong WordNet hay không, hay cần phải loại bỏ và thêm
1982 vào một số quan hệ khác cho phù hợp với tiếng Việt. Nói tóm lại, đây
1983 là một giải pháp hay tuy nhiên không thể áp dụng trong điều kiện hiện
1984 tại. Gần đây có nhiều đề tài nghiên cứu xây dựng WordNet tiếng
1985 Việt~\cite{wordnetviet}. Hy vọng có thể áp dụng CD và các giải pháp
1986 dựa trên WordNet khác
1987 cho tiếng Việt trong tương lai không xa.
1990 \section{Bắt lỗi tự động}
1991 \label{sec:context-spelling}
1993 Tự động phát hiện và sửa lỗi chính tả được đặt ra để cải tiến các
1994 chương trình bắt lỗi chính tả. Các chương trình bắt lỗi chính tả
1995 truyền thống thường dựa trên từ điển, nên không thể bắt lỗi những từ
1996 sai, nhưng lại có trong từ điển. Ví dụ, ``give me a peace of cake''
1997 (lẽ ra phải là ``give me a piece of cake'') hoặc ``anh ấy là một người
1998 bàng quang'' (trong khi phải là ``anh ấy là một người bàng
1999 quan''). Hướng giải quyết là dựa vào tập nhầm lẫn để tìm ra những từ
2000 có khả năng viết sai (ví dụ, ``peace-piece'' và ``bàng quang-bàng
2001 quan'') sau đó dựa vào ngữ cảnh để xác định xem đang xét có phù hợp
2002 với ngữ cảnh hay không. Bởi vậy bài toán này còn được gọi là bắt lỗi
2003 chính tả cảm ngữ cảnh\footnote{context-sensitive spelling
2004 checking}.
2005 %% Đa số các thuật toán thường chuyển câu đang xét thành một
2006 %% tập các đặc trưng rồi dựa vào đó để xem xét, hoặc sử dụng các mô hình
2007 %% ngôn ngữ để đánh giá.
2009 \subsection{Mô hình TBL}
2010 \label{sec:tbl-spell}
2013 TBL\footnote{Transformation-based Learning} là mô hình học có giám sát,
2014 được Eric Brill đưa ra vào năm 1993. Đây là mô hình học luật dựa trên
2015 lỗi, tạo ra các luật mới để khắc phục các lỗi còn lại sau khi đã áp
2016 dụng các luật trước đó. TBL được áp dụng để tự động phát hiện và sửa
2017 lỗi chính tả. TBL chỉ nhắm vào một tập lỗi thông dụng cho trước, chủ
2018 yếu là loại lỗi dùng từ sai, loại lỗi rất khó bị phát hiện bởi các
2019 trình bắt lỗi chính tả thông thường. Những lỗi không phải từ (lỗi nhập
2020 liệu~\ldots{}) không được xử lý bởi TBL. Phương pháp này được áp dụng
2021 bởi Lidia Mangu và Eric Brill~\cite{tbl} cho kết quả rất cao
2022 (93,15\%).
2024 TBL hoạt động như một bộ luật sửa lỗi. Dữ liệu ban đầu cần được một
2025 chương trình khác (baseline) xử lý để phát hiện hiện và sửa lỗi chính tả. Mục
2026 tiêu của chương trình này phát hiện và sửa đúng lỗi chính tả càng
2027 nhiều càng tốt. Các lỗi gây ra bởi chương trình ban đầu này sẽ được
2028 sửa bởi TBL. Các luật học được từ quá trình huấn luyện TBL sẽ được áp
2029 dụng lần lượt theo thứ tự, sửa chữa các lỗi của do chương trình
2030 baseline gây ra cũng như các lỗi do chính việc áp dụng luật TBL gây
2031 ra. Kết quả là số lỗi sai chính tả sẽ giảm đáng kể.
2033 Các luật trong TBL là các luật dạng mẫu-hành
2034 động\footnote{pattern-action rule} sử dụng nhiều loại thông tin khác
2035 nhau để xác định ngữ cảnh. Hành động trong luật thường là thay thế
2036 từ đang xét bằng một từ khác. Các thông được sử dụng trong mẫu bao gồm
2037 vị trí tương đối của các từ so với từ đang xét, từ loại, từ~\ldots{} Ba
2038 loại mẫu được dùng trong~\cite{tbl} là:
2039 \begin{itemize}
2040 \item Từ $W$ xuất hiện trong phạm vi $\pm k$ từ chung quanh từ $w$
2041 đang xét.
2042 \item Một mẫu xác định gồm $l$ từ/từ loại liên tiếp nhau xuất hiện
2043 chung quanh $w$.
2044 \item Một mẫu xác định gồm các từ/từ loại không liên tiếp, xuất hiện
2045 quanh $w$.
2046 \end{itemize}
2048 Huấn luyện TBL giống như cách áp dụng luật TBL. Dữ liệu đầu vào là một
2049 ngữ liệu đã được đánh dấu (từ đúng/từ sai --- nếu từ sai thì đi kèm
2050 với từ đúng). Thực hiện các bước sau:
2051 \begin{enumerate}
2052 \item Gỡ bỏ các đánh dấu trong ngữ liệu, đưa trở về dạng ngữ liệu thô.
2053 \item Đánh baseline cho ngữ liệu thô.
2054 \item Dựa vào các mẫu luật, phát sinh các luật.
2055 \item Lần lượt áp dụng các luật lên ngữ liệu.
2056 \item Tính điểm cho ngữ liệu dựa trên ngữ liệu đã đánh dấu ban đầu,
2057 sau khi áp dụng từng luật lên ngữ liệu. Điểm tăng nghĩa là kết quả
2058 đúng nhiều hơn so với khi chưa áp dụng luật. Điểm âm nghĩa là kết
2059 quả sai nhiều hơn.
2060 \item Nếu điểm âm, bỏ qua luật này.
2061 \item Nếu điểm dương, đưa luật vào danh sách luật.
2062 \item Nếu điểm tăng ít hơn một giới hạn cho trước, dừng thuật toán.
2063 \item Quay lại bước 4.
2064 \end{enumerate}
2066 Sau khi chấm dứt thuật toán, ta chọn khoảng $n$ luật đầu tiên. Những
2067 luật còn lại bị loại bỏ. $n$ luật này chính là những luật kết quả của
2068 quá trình huấn luyện theo mô hình TBL.
2070 Việc áp dụng TBL đòi hỏi phải có ngữ liệu đã đánh dấu (ngữ liệu vàng),
2071 một hàm tính điểm (được dùng trong bước 5), trình đánh dấu baseline,
2072 và các mẫu luật. Ngoài ra còn có một số tham số (ngưỡng dừng thuật
2073 toán, các tham số $n$, $k$, $l$~\ldots{} đã nêu trên). Việc chọn mẫu
2074 luật và các tham số thích hợp ảnh hưởng nhiều đến hiệu quả của TBL.
2076 Ngữ liệu đánh dấu có thể được tạo ra từ tập nhầm
2077 lẫn\footnote{confusion set}. Tập nhầm lẫn xác định những từ thường bị
2078 nhầm lẫn (Ví dụ, ``their'' và ``there'' hay ``đã'' và ``đả''~\ldots{})
2079 Từ văn bản đúng chính tả, ta có thể áp dụng tập nhầm lẫn để tạo ra ngữ
2080 liệu sai chính tả. Để thực hiện đều này cần có tập nhầm lẫn.
2082 Nếu tập nhầm lẫn không chỉ bao gỗm các nhập nhằng về tiếng (hoặc từ
2083 đơn) mà cả nhập nhằng về từ (Ví dụ ``bàn quan'' và ``bàng quang'') thì
2084 cần phải có thêm một bộ tách từ.
2086 Hiệu quả của TBL phụ thuộc vào tập nhầm lẫn. Tập nhầm lẫn càng lớn
2087 thì khả năng sửa lỗi chính tả bằng TBL càng cao. Tuy nhiên, tập nhầm
2088 lẫn càng lớn thì khả năng sai sót cũng càng lớn, và chương trình không
2089 thể tập trung vào các lỗi thường gặp. Để TBL hiệu quả hơn, cần sử dụng
2090 thông tin từ loại (hoặc phân lớp từ). Tuy nhiên, một khi chưa sửa lỗi
2091 chính tả/tách từ xong thì việc tìm từ loại bằng các phương pháp thông
2092 dụng trở nên không an toàn.
2095 %\subsection{Mô hình n-gram}
2096 %%% Mays et al 91 -> tri\-gram
2099 \subsection{Mô hình Winnow}
2101 Bài toán bắt lỗi chính tả được xem như là bài toán khử nhập nhằng
2102 từ. Các từ nhập nhằng được tập hợp thành tập nhầm lẫn. Tập nhầm lẫn $C
2103 = \{W_1,\ldots{},W_n\}$ nghĩa là mỗi từ $W_i$ trong tập $C$ có thể bị
2104 dùng lẫn lộn với các từ còn lại trong $C$.
2105 Bài toán bao gồm một câu, và một từ cần sửa chữa. Thuật toán thể hiện
2106 bài toán như là một danh sách các đặc trưng tích cực\footnote{active
2107 feature}. Mỗi đặc trưng tích cực thể hiện cho một ngữ cảnh cụ
2108 thể. Hai loại đặc trưng được dùng là từ ngữ cảnh\footnote{context
2109 word} và collocation. Từ ngữ cảnh là một tập các từ nằm xung quanh
2110 từ đang xét (giới hạn trong khoảng $\pm k$ từ tính từ từ đang
2111 xét). Collocation là một mẫu $l$ từ/từ loại liên tiếp nhau xung quanh
2112 từ đang xét.
2114 Một bộ rút trích đặc trưng\footnote{feature extractor} được sử dụng để
2115 chuyển văn bản gốc thành danh sách các đặc trưng tích cực. Bộ rút
2116 trích đặc trưng phải được huấn luyện trước, để chỉ lọc ra những đặc
2117 trưng nhất định (đặc trưng tích cực), thay vì tất cả các đặc trưng.
2119 Để huấn luyện bộ rút trích đặc trưng, ta cho chạy bộ rút trích đặc
2120 trưng trên ngữ liệu huấn luyện, rút trích tất cả các đặc trưng có thể
2121 có, đồng thời thống kê số lượng của mỗi đặc trưng. Sau khi chạy xong,
2122 danh sách đặc trưng này sẽ bị cắt bớt theo một tiêu chí cho trước, chỉ
2123 chừa lại những đặc trưng được xem là tích cực. Có thể thu gọn danh
2124 sách đặc trưng theo nhiều tiêu chí khác nhau. Tuy nhiên cách đơn giản
2125 nhất là dựa vào tần số xuất hiện của các đặc trưng. Nếu các đặc trưng
2126 xuất hiện ít hơn một ngưỡng nào đó thì đặc trưng đó bị loại bỏ.
2128 Công việc mỗi bộ phân lớp là xác định từ $W_i$ trong tập nhầm lẫn có thuộc
2129 về câu đang xét hay không. Mỗi bộ phân lớp chạy thuật toán Winnow. Bộ
2130 phân lớp nhận tập các đặc trưng tích cực (đại diện cho câu đang xét),
2131 trả về giá trị nhị phân cho biết từ $W_i$ có thuộc về câu đang xét hay
2132 không. Đặt $F$ là tập các đặc trưng tích cực. Với mỗi $f\in F$, đặt
2133 $w_f$ là trong số của cung nối $f$ với bộ phân lớp. Thuật toán Winnow
2134 trả về giá trị 1 khi và chỉ khi $$\sum_{f\in F}w_f > \theta$$ trong đó
2135 $\theta$ là tham số ngưỡng.
2137 Khởi đầu, bộ phân lớp không kết nối với bất kỳ đặc trưng nào trong
2138 mạng. Trong quá trình huấn luyện, các kết nối và trọng số của kết nối
2139 sẽ được thành lập. Một mẫu huấn luyện bao gồm một câu (tập đặc trưng
2140 tích cực) cùng với từ $W_c$ trong tập nhầm lẫn. $W_c$ là từ đúng cho
2141 câu trong mẫu huấn luyện đối với các mẫu khẳng định\footnote{positive
2142 example} và là từ sai trong các mẫu phủ định\footnote{negative
2143 example}.
2145 Quá trình huấn luyện được tiến hành theo như sau: lần lượt mỗi mẫu
2146 được đưa vào hệ thống, các bộ phân lớp được cập nhật, sau đó mẫu bị
2147 hủy.
2149 Bước đầu tiên huấn luyện bộ phân lớp là thiết lập các liên kết
2150 giữa bộ phân lớp và các đặc trưng tích cực $F$ trong mẫu. Nếu đặc
2151 trưng tích cực $f \in F$ chưa được kết nối vào bộ phân lớp, và câu là
2152 mẫu khẳng định đối với bộ phân lớp, ta tạo một kết nối giữa đặc trưng
2153 đó và bộ phân lớp với giá trị trọng số khởi đầu là $0,1$. Chú ý rằng
2154 không có gì xảy ra với các mẫu phủ định.
2156 Bước kế tiếp là cập nhật trong số cho các liên kết. Bước này được thực
2157 hiện nhờ vào luật cập nhật Winnow, chỉ cập nhật trọng số khi xảy ra
2158 lỗi. Nếu bộ phân lớp dự đoán là 0 đối với một mẫu khẳng định (nghĩa là
2159 lẽ ra bộ phân lớp phải dự đoán là 1), trong số sẽ được tăng:
2160 $$\forall f \in F, w_f \leftarrow \alpha \cdot w_f$$
2161 trong đó $\alpha > 1$ là tham số cho trước. Nếu bộ phân lớp dự đoán 1
2162 với các mẫu phủ định (mà lẽ ra bộ phân lớp phải dự đoán là 0), trọng
2163 số sẽ được giảm:
2164 $$\forall f \in F, w_f \leftarrow \beta \cdot w_f$$
2165 với $0 < \beta < 1$ là tham số cho trước. \cite{Golding99} đề nghị
2166 $\alpha$ là $1,5$ và $\beta$ là $0,5$ đến $0,9$. Như vậy, trọng số của
2167 các đặc trưng không tích cực sẽ giữ nguyên, không thay đổi. Thời gian
2168 cập nhật của thuật toán phụ thuộc vào số đặc trưng tích cực trong mẫu.
2170 Thay vì xử lý từ $W_i$ dựa trên một bộ phân lớp, ta có thể áp dụng kết
2171 quả trả về của nhiều bộ phân lớp đồng thời. Mô hình Weighted Majority
2172 được dùng để kết hợp nhiều bộ phân lớp. Ta cho chạy nhiều bộ phân lớp
2173 đồng thời. Các bộ phân lớp trả về các giá trị khác nhau. Hiệu suất của
2174 mỗi bộ phân lớp được theo dõi. Trọng số được tính toán để phản ánh độ
2175 chính xác của bộ phân lớp. Giá trị sau cùng là tổng của các dự đoán
2176 của các bộ phân lớp được xét, kèm với trọng số của mỗi bộ phân lớp.
2178 Mô hình này được áp dụng trong~\cite{Golding99}.
2180 \subsection{Mô hình Danh sách quyết định}
2181 %%% Yarowsky 94 -> decision lists
2183 Mô hình Danh sách quyết định được Yarowsky đưa ra để giải quyết bài
2184 toán khử nhập nhằng ngữ nghĩa. Mô hình này dựa trên các đặc trưng quan
2185 trọng để nhận dạng. Ngoài ra kết xuất của mô hình rất đơn giản, dễ
2186 hiểu, tạo thuận lợi trong nghiên cứu, cải tiến mô hình. Phương pháp
2187 này được~\cite{vietdecisionlist} áp dụng để bắt lỗi chính tả tiếng
2188 Việt.
2190 Mô hình có thể sử dụng nhiều loại đặc trưng khác nhau. Hai đặc trưng
2191 thường được áp dụng là từ ngữ cảnh và collocation.
2193 Thuật toán của mô hình như sau:
2194 \begin{enumerate}
2195 \item Xét mỗi từ trong câu, có tập nhầm lẫn tương ứng là $S$.
2196 \item Với mỗi từ $w \in S$:
2197 \begin{enumerate}
2198 \item Xác định tập đặc trưng $C_w$ không chứa các đặc trưng xung đột
2199 với các đặc trưng đã được chấp nhận trước đó.
2200 \item Tìm điểm của từ:$$Score(w)=\underset{f\in C_w}{max}P(w|f)$$
2201 và xác định $$f_w = \underset{f\in C_w}{argmax}P(w|f)$$
2202 \end{enumerate}
2203 \item Từ được chọn là $$a=\underset{w\in S}{argmax}Score(w)$$ Ghi nhớ
2204 thuộc tính $f_w$ để kiểm tra xung đột ở các vị trí khác.
2205 \end{enumerate}
2207 Quá trình huấn luyện mô hình như sau.
2208 \begin{itemize}
2209 \item Bộ rút trích đặc trưng (tương tự
2210 như trong mô hình Winnow) được sử dụng để rút ra các đặc trưng tích
2211 cực từ các câu trong ngữ liệu huấn luyện.
2212 \item Đếm tần số xuất hiện của mỗi
2213 đặc trưng.
2214 \item Loại bỏ các đặc trưng không đáng tin cậy (Ví dụ, tần số
2215 quá thấp).
2216 \item Sắp xếp các đặc trưng theo thứ tự giảm dần khả năng quyết định.
2217 \end{itemize}
2219 \subsection{Mô hình Tri\-gram và Bayes}
2221 Mô hình sửa lỗi bằng Tri\-gram rất đơn giản. Đối với mỗi câu, các từ
2222 trong tập nhầm lẫn được thay thế cho từ tương ứng trong câu, sau đó
2223 tính xác suất tri\-gram của toàn bộ câu. Từ tương ứng với câu có xác
2224 suất lớn nhất sẽ là từ được chọn. Cho câu $W =
2225 w_1\ldots{} w_k\ldots{} w_n$, $w_k'$ là từ được dùng để thay thế cho
2226 $w_k$, tạo ra câu mới $W'$. Nếu $P(W') > P(W)$ thì $w_k'$ sẽ được
2227 chọn, với $P(W)$ và $P(W')$ lần lượt là xác suất tri\-gram của câu $W$
2228 và $W'$.
2230 Một cải tiến của phương pháp này là
2231 áp dụng tri\-gram dựa trên từ loại thay vì tri\-gram từ. Từ câu $W$, ta
2232 tạo ra các chuỗi từ loại. Xác suất cuối cùng là:
2233 \begin{align*}
2234 P(W) &=\sum_T P(W,T)\\
2235 P(W,T)&=P(W|T)P(T)\\
2236 &=\prod_i P(w_i|t_i)\prod_i P(t_i|t_{i-2}t_{i-1})
2237 \end{align*}
2238 với $T$ là một chuỗi từ loại của $W$, $T=t_1\ldots{} t_n$ và
2239 $P(t_i|t_{i-2}t_{i-1})$ là xác suất tri\-gram từ loại.
2241 Một mô hình khác để tìm và sửa lỗi chính tả là áp dụng bộ phân lớp
2242 Bayes. Có thể xem đây là bài toán phân lớp từ dựa vào một tập các đặc
2243 trưng. Từ cần xét là từ nằm trong tập nhầm lẫn, ta sẽ xét từ này và
2244 các từ khác trong tập nhầm lẫn trong cùng ngữ cảnh. Tập đặc trưng
2245 chính là ngữ cảnh của từ cần xét. Tập đặc trưng được rút trích từ câu
2246 đang xét. Các đặc trưng và cách rút trích đặc trưng tương tự như trong
2247 mô hình Winnow.
2249 Mô hình Tri\-gram và Bayes, mỗi cái có điểm mạnh riêng. Mô hình tri\-gram
2250 hoạt động tốt nếu những từ trong tập nhầm lẫn không cùng từ
2251 loại. Ngược lại, khi không thể phân biệt dựa trên từ loại, mô hình
2252 Bayes sẽ hoạt động tốt hơn do dựa vào các thông tin về cú pháp, ngữ
2253 cảnh xung quanh. Do đó, giải pháp tốt nhất là kết hợp hai mô hình này
2254 với nhau. Đầu tiên ta áp dụng mô hình Tri\-gram. Trong quá trình xử lý,
2255 nếu thấy mọi từ trong tập nhầm lẫn đều cùng từ loại, ta áp dụng mô
2256 hình Bayes. Ngược lại, ta sẽ chấp nhận kết quả của mô hình
2257 Tri\-gram. Giải pháp này được áp dụng trong~\cite{Golding96}, tạo ra mô
2258 hình Tribayes.
2261 \subsection{Mô hình Bayes và Danh sách quyết định}
2262 %%% Golding 95 -> hybrid method
2263 Mô hình Danh sách quyết định là một mô hình mạnh. Tuy nhiên, có một
2264 điểm cần lưu ý là mô hình này chỉ sử dụng {\em một} đặc trưng tốt nhất
2265 để phân loại. Có lẽ tốt hơn là nên sử dụng {\em tất cả} các đặc trưng
2266 để phân loại. Không có lý do gì để chỉ sử dụng một đặc trưng, trong
2267 khi ta vẫn có thể khai thác các đặc trưng khác. Đây là nơi có thể cải
2268 tiến bằng cách sử dụng bộ phân lớp Bayes.
2270 Bộ phân lớp Bayes cũng sử
2271 dụng một tập các đặc trưng, sắp theo thứ tự giảm dần hiệu quả. Bộ phân
2272 lớp Bayes phân loại từ đang xét bằng cách sử dụng các đặc trưng. Tuy
2273 nhiên, thay vì dừng lại sau khi áp dụng đặc trưng đầu tiên có thể sử
2274 dụng, Bayes duyệt qua tất cả các đặc trưng, kết hợp tất cả các đặc
2275 trưng, và giải quyết các xung đột giữa các đặc trưng nếu có, để đưa ra
2276 kết quả sau cùng. Ta giả sử chỉ sử dụng các đặc trưng loại từ ngữ cảnh
2277 và collocation. Nếu hai đặc trưng cần xét đều là từ ngữ cảnh,
2278 vậy sẽ không có xung đột. Nếu hai đặc trung đang xét đều
2279 là collocation và chồng lên nhau, nghĩa là có xung đột. Đặc trưng xung
2280 đột với đặc trưng đã xét trước đó sẽ bị bỏ qua, không được xem
2281 xét.
2283 Phương pháp này được đề nghị bởi~\cite{Golding95}.
2285 \section{Bắt lỗi tiếng châu Á}
2288 Điểm đặc trưng dễ thấy giữa các ngôn ngữ châu Âu và các ngôn ngữ châu
2289 Á, như tiếng Trung Quốc, tiếng Nhật, tiếng Hàn Quốc~\ldots{}, là ranh
2290 giới từ. Đối với các thứ tiếng châu Âu, các cụm ký tự cách nhau bởi
2291 khoảng trắng cũng là từ, do đó việc tách từ rất dễ dàng (chỉ phải
2292 xử lý các trường hợp đặc biệt như dấu `-'~\ldots{}). Đối với các tiếng
2293 châu Á, đặc biệt là tiếng Việt, công việc phức tạp hơn nhiều. Bởi vì
2294 một ``từ'' như quan niệm châu Âu chỉ là một phần từ (một âm tiết trong
2295 tiếng Việt) trong các ngôn ngữ châu Á. Điều này đặt ra một vấn đề mà
2296 các chương trình bắt lỗi chính tả các thứ tiếng châu Âu chưa từng gặp
2297 phải: phân ranh giới từ.
2299 Do các phương pháp dựa trên tiếng Anh đều ngầm định có thể tìm được
2300 ranh giới từ ngay tức thì, nên khi áp dụng cho tiếng Trung Quốc,
2301 tiếng Việt~\ldots{}{} không dễ dàng. Điểm khó khăn ở đây là nếu ta thay
2302 một từ bằng một từ khác (trong tập nhầm lẫn) có độ dài không giống từ
2303 trước đó, thì toàn bộ ranh giới từ phía sau sẽ bị thay đổi. Nói cách
2304 khác, câu đã bị biến thành một câu khác (xét trên quan điểm câu là một
2305 chuỗi các từ) khi thay đổi một từ trong câu.
2307 Nếu không giải trực tiếp bài toán mà thực hiện tách từ trước, sau đó
2308 mới bắt lỗi chính tả, thì khó khăn lại đè nặng lên phần tách từ.
2309 Bài toán tìm ranh giới từ vốn đã phức tạp
2310 (trong một số trường hợp, nếu không dựa vào thông tin ngữ nghĩa thì
2311 không thể nào tách từ), lại càng phức tạp hơn khi áp dụng trong bài
2312 toán bắt lỗi chính tả, vì khi đó ta phải tìm ranh giới từ khi {\em các
2313 từ/tiếng đầu vào có thể không đúng}. Nói cách khác, ta phải thực hiện
2314 tách từ trong điều kiện dữ liệu đầu vào không hoàn toàn chính xác:
2315 tách từ mờ. Các kỹ thuật tách từ, nếu bỏ qua
2316 yếu tố này sẽ dễ dẫn đến sai lầm, vì mọi phương pháp tách từ đều ngầm
2317 định là dữ liệu đầu vào là chính xác. Sau khi tách từ xong, bài toán bắt
2318 lỗi chính tả trở nên đơn giản. Ta có thể áp dụng các kỹ thuật đã được
2319 áp dụng trên bắt lỗi chính tả các ngôn ngữ châu Âu dễ dàng.
2321 Với tiếng Việt, do độ dài mỗi tiếng ngắn (khoảng năm chữ cái, tối đa
2322 bảy chữ cái). Tuy
2323 nhiên nếu tính theo cấu trúc âm tiết thì mỗi tiếng chỉ gồm tối đa bốn
2324 thành phần (không kể thanh điệu) là âm đầu, âm đệm, âm chính và âm
2325 cuối. Mỗi thành phần đều được thể hiện bằng một cụm chữ cái riêng
2326 biệt, có thể coi như là một đơn vị tương đương chữ cái. Vậy nên, xét
2327 một mặt nào đó, có thể xem mỗi tiếng trong tiếng Việt chỉ gồm tối đa
2328 bốn ``chữ cái''. Do độ dài tiếng quá ngắn nên số lượng nhập nhằng của
2329 một tiếng lớn hơn rất nhiều so với các ngôn ngữ châu Âu dù chỉ xét
2330 từ đồng âm.
2332 Trình bắt lỗi tiếng Việt đã được nghiên cứu trong những năm gần
2333 đây~\cite{Tuoi,vietdecisionlist,grcheck}. Giải pháp được đề nghị
2334 trong~\cite{Tuoi,grcheck} sử dụng phân tích cú pháp để đánh giá các cách tách
2335 từ. Trong khi đó \cite{vietdecisionlist} sử dụng danh sách quyết định
2336 để khử nhập nhằng cho từng từ một.
2339 %%% Bắt lỗi chính tả không tách từ, có không?
2341 \section{Tách từ}
2343 %% \subsection{Tách từ}
2345 %% \cite{Sproat} sử dụng WFST để tách từ, huấn luyện bằng EM dựa trên
2346 %% cách tách từ đúng nhất.
2348 %% \cite{wordseg} sử dụng giải pháp tương tự như \cite{Sproat} nhưng cải
2349 %% tiến bằng cách cáp dụng Neural Networks để giải quyết nhập nhằng dựa
2350 %% vào POS. Nghiên cứu đề cập đến một số vấn đề tiền xử lý tiếng Việt như
2351 %% xác định tên riêng, từ láy, phân tích hình thái.
2353 %% \cite{Ravishankar} đề nghị tạo ra lưới từ\footnote{word lattice} sau
2354 %% đó sử dụng thuật toán tìm đường đi ngắn nhất để tìm cách tách từ tốt
2355 %% nhất dựa trên 2-gram hoặc 3-gram.
2357 %% \cite{LAH} sử dụng n-gram và quy hoạch động để tách từ,
2358 %% không dùng từ điển. Giải pháp này tương tự như \cite{softcount}, tuy
2359 %% nhiên chỉ tính xác suất cách tách từ tốt nhất thay vì tính tổng xác
2360 %% suất mọi cách tách từ như trong \cite{softcount}.
2362 %% \cite{Chunyu} kết hợp n\-gram, lập trình quy hoạch động để tách từ. Xài
2363 %% soft-count thay vì ``hard-count'' như \cite{Chang}. \cite{Chunyu} còn
2364 %% đề nghị dùng case-based learning.
2366 %\note{Liệt kê các phương pháp tách từ}
2367 Bài toán tách từ cho ngôn ngữ đơn lập đã được đặt ra từ lâu, chủ yếu
2368 để giải quyết cho tiếng Trung Quốc, tiếng Nhật. Các thuật toán tách từ có thể
2369 được phân loại như sau:
2371 \begin{description}
2372 \item[Dựa theo luật] Bao gồm các cách sau:
2374 \begin{itemize}
2375 \item Longest Matching, Greedy Matching Models (Yuen Poowarawan, 1986;
2376 Sampan Rarurom, 1991)
2377 \item Mô hình khớp tối đa\footnote{Maximal Matching Model}. Mô hình
2378 này được chia thành ``khớp tối đa tiến''\footnote{forward maximum
2379 match} và ``khớp tối đa lùi''\footnote{backward maximum match}. Đối
2380 với phương pháp này thì một từ điển hoàn chỉnh là không thể
2381 thiếu. Một từ điển không hoàn chỉnh sẽ giảm hiệu suất của thuật
2382 toán. Tuy nhiên, dễ thấy là khó có thể có một từ điển hoàn chỉnh
2383 (đặc biệt khi các ngôn ngữ vẫn còn được tiếp tục phát triển hằng
2384 ngày trong thời đại ngày nay). Mô hình này tùy thuộc nhiều vào từ
2385 điển.
2386 %% \begin{itemize}
2387 %% \item Thai, Sornlertlamvanich (1993).
2388 %% \item Chinese, Chih-Hao Tsai (1996), MMSeg 2000.
2389 %% \end{itemize}
2390 \end{itemize}
2391 \item[Dùng thống kê]
2392 Giải pháp này dựa vào ngữ cảnh từ xung quanh để đưa ra quyết định
2393 thích hợp. Có hai vấn đề cần được giải quyết đối với giải pháp này:
2394 độ rộng ngữ cảnh, và cách áp dụng thống kê. Ngữ cảnh càng rộng thì
2395 thuật toán càng phức tạp.
2397 Cho dù độ rộng ngữ cảnh thế nào, luôn có thể áp dụng mô hình
2398 first-order HMM. Tuy nhiên giải pháp này phụ thuộc rất nhiều vào ngữ
2399 liệu huấn luyện. Kết quả huấn luyện trên ngữ liệu chính trị khó có
2400 thể áp dụng trên các tài liệu văn học và ngược lại. Thêm vào đó, có
2401 những từ có xác suất rất cao, nhưng chỉ có chứng năng về mặt ngữ
2402 pháp, làm giảm vai trò của xác suất.
2403 %% \begin{itemize}
2404 %% \item HMM dựa trên thuật toán Viterbi. (Asanee Kawtraku, 1995;
2405 %% Surapant,1995).
2406 %% \item EM. Xianping, 1996.
2407 %% \end{itemize}
2408 \item[Các cách khác]
2409 Hầu hết các giải pháp khác là sự lai tạo giữa các mô hình trên và
2410 các mô hình ngôn ngữ học như WFST, TBL. Thời gian xử lý
2411 các giải pháp loại này trở nên đáng kể, nhưng độ chính xác đạt được
2412 khá cao.
2414 Tri thức về ngôn ngữ, thường được áp dụng cho các mô hình dựa trên
2415 luật, hiếm khi được áp dụng cho những mô hình trên.
2416 \end{description}
2418 Một số phương pháp tách từ được mô tả ngắn gọn bên dưới.
2420 \subsection{Khớp tối đa}
2422 Thuật toán so khớp tối đa hoạt động như tên của chính nó. Thuật toán
2423 giải quyết bài toán tách từ bằng cách chọn cách tách từ nào có nhiều
2424 từ nhất (so khớp được nhiều nhất). Thuật toán được áp dụng để xây dựng
2425 chương trình tách từ tiếng Trung Quốc
2426 MMSEG\footnote{http://casper.beckman.uiuc.edu/~c-tsai4/chinese/wordseg/mmseg.zip}.
2427 Thuật toán này có nhiều biến thể khác nhau.
2430 \begin{itemize}
2431 \item Dạng đơn giản, được dùng để giải quyết nhập nhằng từ đơn. Giả sử
2432 có một chuỗi ký tự (tương đương với chuỗi tiếng trong tiếng Việt)
2433 $C_1, C_2, \ldots{} C_n$. Ta bắt đầu từ đầu chuỗi. Đầu tiên, kiểm
2434 tra xem $C_1$ có phải là từ hay không, sau đó kiểm tra xem $C_1C_2$
2435 có phải là từ hay không. Tiếp tục tìm cho đến khi tìm được từ dài
2436 nhất. Từ có vẻ hợp lý nhất sẽ là từ dài nhất. Chọn từ đó, sau đó tìm
2437 tiếp như trên trên những từ còn lại cho đến khi xác định được toàn
2438 bộ chuỗi từ.
2439 \item Dạng phức tạp. Quy tắc của dạng này là phân đoạn có vẻ hợp lý
2440 nhất là đoạn ba từ với chiều dài tối đa. Thuật toán bắt đầu như dạng
2441 đơn giản. Nếu phát hiện ra những cách tách từ gây nhập nhằng (ví dụ,
2442 $C_1$ là từ và $C_1C_2$ cũng là từ), ta xem các chữ kế tiếp để tìm
2443 tất cả các đoạn ba từ có thể có bắt đầu với $C_1$ hoặc $C_1C_2$. Ví
2444 dụ ta được những đoạn sau:
2445 \begin{itemize}
2446 \item $C_1\quad C_2\quad C_3C_4$
2447 \item $C_1C_2\quad C_3C_4\quad C_5$
2448 \item $C_1C_2\quad C_3C_4\quad C_5C_6$
2449 \end{itemize}
2450 Chuỗi dài nhất sẽ là chuỗi thứ ba. Vậy từ
2451 đầu tiên của chuỗi thứ ba ($C_1C_2$) sẽ được chọn. Thực hiện lại các
2452 bước cho đến khi được chuỗi từ hoàn chỉnh. Cách này đạt được độ
2453 chính xác 99.69\%~\cite{ChenLiu}.
2454 \end{itemize}
2458 \subsection{Mô hình HMM}
2460 Trong cách áp dụng này, các trạng thái ẩn là các lớp từ, giả định rằng
2461 mỗi từ có thể thuộc mọi lớp với một xác suất nhất định. Bài toán được
2462 xem như tìm kiếm chuỗi lớp từ $C=c_1,\ldots{},c_n$ từ một chuỗi từ
2463 $W=w_1,\ldots{},w_n$. Mục tiêu là tìm $W$ và $C$ từ câu $S$ cho trước,
2464 sao cho tối đại xác suất$$\underset{W,C}{argmax}P(W|C)P(C)$$
2465 Giả định rằng xác suất $P(W|C)$ chỉ phụ thuộc vào lớp từ của nó, và
2466 xác suất lớp $P(C)$ chỉ phụ thuộc vào lớp của từ đứng trước. Những xác
2467 suất này có thể được ước lượng bằng thuật toán Baum-Welch dùng ngữ
2468 liệu huấn luyện. Tiến trình học dựa trên thuật toán Baum-Welch và
2469 giống với bài toán đánh nhãn từ loại bằng HMM, trừ việc số trạng thái
2470 được xác định trước và xác suất khởi đầu được gán ngẫu nhiên.
2472 %% \subsection{Mô hình HHMM}
2474 %% Mô hình Markov ẩn phân cấp (HHMM)\footnote{Hierarchical Hidden Markov
2475 %% Model}~\cite{hhmm} được áp dụng trong~\cite{hhmm2} để giải quyết bài toán tách từ
2476 %% tiếng Trung Quốc.
2478 %% Mô hình HMM\footnote{Hidden Markov Model} (L. R. Rabiner, 1989) là một
2479 %% mô hình rất mạnh để xử lý
2480 %% ngôn ngữ tự nhiên. Tuy nhiên, HMM truyền thống khó áp dụng hiệu quả
2481 %% do một số hiện tượng phức tạp trong ngôn ngữ tự nhiên. Do vậy, Shai
2482 %% Fine et al (1998) đã đưa ra mô hình HHMM, một mô hình đệ quy, tổng
2483 %% quát hoá của HMM.
2485 %% HHMM bao gồm sáu thành phần ($S$, $O$, $\Pi$, $A$, $B$, $D$).
2486 %% \begin{itemize}
2487 %% \item $D$ là số mức sâu.
2488 %% \item $S$ là tập trạng thái hữu hạn.
2489 %% \item $O$ là bảng chữ cái kết quả hoặc kết xuất trung gian.
2490 %% \item $\Pi$ là xác suất trạng thái khởi đầu.
2491 %% \item $A$ là xác suất chuyển trạng thái.
2492 %% \item $B$ là xác suất phát sinh các ký hiệu hoặc kết xuất trung gian.
2493 %% \end{itemize}
2494 %% Sự khác nhau giữa HHMM và HMM là:
2495 %% \begin{itemize}
2496 %% \item Tập trạng thái $S$ có thể được tách làm nhiều tập con, tùy theo
2497 %% số mức của nó. Một trạng thái trong $S$ được đánh dấu bằng $q_i^d$
2498 %% với $(0<d\le D, 0<i\le|S^d|)$. Trong đó $d$ là chỉ số mức, $i$ là
2499 %% chỉ số trạng thái, $S^d$ là tập trạng thái mức $d$. Khi $d=D$,
2500 %% $q_i^d$ được gọi là trạng thái kết thúc vì its observation is
2501 %% symbols. Ngược lại, nó được gọi là trạng thái nội bộ vì observation
2502 %% của nó là từ HMM con của nó trong mức thứ $(d+1)$.
2503 %% \item Mỗi trạng thái nội bộ $q^d$ $(0<d<D)$ có những trạng thái con
2504 %% của nó, hình thành một HMM độc lập. Trong HMM con, xác suất chuyển
2505 %% trạng thái là:
2506 %% $$A(q^d) = (a_{ij}(q^d)) = (P(q_j^{d+1}|q_i^{d+1}))$$
2507 %% Véc tơ phân bố khởi đầu là:
2508 %% $$\Pi(q^d)=(\pi^d(q_i^{d+1}))=(P(q_i^{d+1}|q^d))$$
2509 %% Trong đó $P(q_i^{d+1}|q^d)$ được định nghĩa là xác suất của trạng
2510 %% thái $q^d$ kích hoạt trạng thái con $q_i^{d+1}$ lúc ban đầu.
2511 %% \item Chỉ có HMM dưới đáy có thể observe các ký hiệu. Xác suất phát
2512 %% ký hiệu tương ứng là:
2513 %% $$B(q^D)=(b_k(q^D))=(P(o_k|q^D))$$
2514 %% với $o_k$ nằm trong tập ký hiệu. Với mỗi HMM mức $d (d<D)$, chuỗi
2515 %% trạng thái trong các HMM con của nó có thể xem như là
2516 %% observation. Xác suất phát sinh có thể được ước lượng như trên.
2517 %% \end{itemize}
2519 %% HHMM bao gồm $D$ mức HMM mà mỗi mức này là một HMM độc lập. Hơn nữa,
2520 %% mỗi HMM chỉ liên kết với cha và con của nó. Toàn bộ tập tham số của
2521 %% HHMM được ký hiệu là:
2522 %% \begin{align*}
2523 %% \lambda&=\{(\lambda(q^d))\}_{d\in\{1,\ldots{},D\}}\\
2524 %% &=\{\{A(q^d)\}_{d\in\{1,\ldots{},D-1\}},\{\Pi(q^d)\}_{d\in\{1,\ldots{},D-1\}},\{B(q^D)\}\}
2525 %% \end{align*}
2527 %% HMM là dạng đặc biệt của HHMM, khi $D=1$.
2529 %% Khi áp dụng HHMM để tách từ. Các từ chính là tập ký hiệu, còn các
2530 %% tiếng chính là các trạng thái. Đến đây, ta quay về bài toán HMM truyền
2531 %% thống.
2533 \subsection{Mô hình WFST và mạng nơ-ron}
2535 WFST\footnote{Weighted Finite State Transducer} đã được~\cite{Sproat}
2536 áp dụng để tách từ tiếng Trung Quốc. Ý tưởng cơ bản là áp dụng WFST
2537 kết hợp với trọng số là xác suất xuất hiện của mỗi từ trong ngữ
2538 liệu. Dùng WFST để duyệt qua câu cần xét. Cách duyệt có trọng số lớn
2539 nhất sẽ là cách tách từ được chọn. Giải pháp này cũng đã được áp dụng
2540 trong~\cite{Tachtu,Tachtu2} kèm với mạng nơ-ron để khử nhập nhằng.
2542 %% \subsection{Mô hình TBL}
2544 %% TBL là mô hình học có thầy được Eric Brill đưa ra vào năm 1990.
2546 %% Việc áp dụng TBL đòi hỏi phải có một ngữ liệu tách từ sẵn. Tuy lượng
2547 %% ngữ liệu không cần lớn như trong các cách áp dụng thống kê, nhưng vẫn
2548 %% là một lượng đáng kể. Việc tạo một ngữ liệu như thế sẽ tốn rất nhiều
2549 %% công sức. Đây là một điểm yếu (và cũng là điểm mạnh) của TBL.
2551 \subsection{Mô hình Source-Channel cải tiến}
2552 %-% cws-ACL03.pdf
2554 Mô hình này được đề nghị trong~\cite{sc}.
2556 Đặt $S$ là một câu tiếng Trung Quốc, hay là một chuỗi các ký tự (tương
2557 đương chuỗi tiếng trong tiếng Việt). Với mỗi cách tách từ $W$ có thể
2558 có, chọn cách tách từ tốt nhất $W^*$, tương ứng với xác suất điều kiện
2559 $P(W|S)$:
2560 $$W^*=\underset{w}{argmax}P(W|S)$$
2561 Theo công thức Bayes, bỏ mẫu số là hằng số, ta được:
2562 $$W^*=\underset{w}{argmax}P(W)P(S|W)$$
2563 Ta định nghĩa lớp từ $C$ như sau:
2564 \begin{itemize}
2565 \item Mỗi từ được định nghĩa như một lớp.
2566 \item Mỗi từ dẫn xuất hình thái được định nghĩa như một lớp.
2567 \item Mỗi loại ký hiệu khác nhau được định nghĩa như một lớp. Ví dụ, các biểu
2568 thức thời gian thuộc về lớp TIME.
2569 \item Mỗi loại tên riêng thuộc về một lớp. Ví dụ, tên người thuộc lớp PN.
2570 \end{itemize}
2572 Ta chuyển công thức trên qua các lớp từ:
2573 $$C^*=\underset{c}{argmax}P(C)P(S|C)$$
2574 Công thức trên là công thức cơ bản của mô hình source-channel cho tách
2575 từ tiếng Trung Quốc. Mô hình giả định câu S được phát sinh như sau:
2576 Đầu tiên, một người chọn một chuỗi khái niệm (ví dụ, lớp từ $C$) để
2577 xuất ra, theo xác suất $P(C)$. Sau đó người đó cố gắng thể hiện các
2578 khái niệm đó bằng chuỗi các ký tự, theo xác suất $P(S|C)$.
2580 Mô hình source-channel có thể được hiểu theo một cách khác: $P(C)$ là
2581 mô hình thống kê dự đoán xác suất của chuỗi lớp từ. Nó chỉ ra khả năng
2582 một lớp từ xuất hiện, dựa trên một ngữ cảnh cho trước. Vậy $P(C)$ còn
2583 được hiểu như {\em mô hình ngữ cảnh}. $P(S|C)$ là mô hình phát sinh,
2584 dự đoán khả năng một chuỗi ký tự được phát sinh dựa trên lớp từ cho
2585 trước. Vậy $P(S|C)$ còn được hiểu như {\em mô hình lớp}.
2587 Mặc dù mô hình ngữ cảnh và mô hình lớp có thể được kết hợp bằng một
2588 phép nhân đơn giản. Tuy nhiên nếu thêm trọng số thì kết quả tốt
2589 hơn. Lý do là có một số mô hình lớp dự đoán kết quả rất không chính
2590 xác. Hơn nữa, các mô hình lớp của các lớp từ khác nhau được xây dựng
2591 theo những cách khác nhau. Vì vậy xác suất mô hình lớp khác nhau nhiều
2592 giữa các mô hình lớp. Một cách để cân bằng những xác suất này là thêm
2593 vào một trọng số $CW$ cho mỗi mô hình lớp để điều chỉnh xác suất
2594 $P(S|C)$ thành $P(S|C)^{CW}$
2596 Với mô hình đã có, thao tác tách từ bao gồm hai bước:
2597 \begin{enumerate}
2598 \item Cho chuỗi S, phát sinh mọi cách tách từ có thể có. Mỗi cách tách
2599 từ được đánh nhãn lớp từ và xác suất lớp $P(S'|C)$ với $S'$ là bất
2600 kỳ chuỗi con nào của $S$.
2601 \item Thuật toán tìm kiếm Viterbi được áp dụng để chọn cách tách từ có
2602 khả năng nhất theo công thức nêu trên.
2603 \end{enumerate}
2605 \subsubsection{Huấn luyện}
2607 Nếu có một dữ liệu được tách từ sẵn, công việc trở nên rất dễ
2608 dàng. Tuy nhiên, việc xây dựng một ngữ liệu tách từ sẵn đủ lớn sẽ tốn
2609 rất nhiều công sức (đặc biệt là các mô hình thống kê thường đòi hỏi
2610 lượng ngữ liệu cực kỳ lớn, lớn hơn rất nhiều so với các mô hình dựa
2611 trên luật). Để đơn giản vấn đề, ngữ liệu này được xây dựng tự động như
2612 sau:
2613 \begin{enumerate}
2614 \item Khởi đầu, sử dụng một bộ tách từ sẵn có (có thể áp dụng các
2615 thuật giải đơn giản, không cần huấn luyện, như Longest matching,
2616 Maximum matching~\ldots{})
2617 \item Sử dụng mô hình đề nghị để tách từ ngữ liệu huấn luyện.
2618 \item Tái huấn luyện mô hình dựa trên kết quả tách từ có được ở bước
2619 2. Bước 2--3 có thể được lặp lại nhiều lần cho đến khi hiệu suất của
2620 mô hình ngừng tăng.
2621 \end{enumerate}
2623 %%% give some comments about source-channel models.
2625 %%% Giải thích rõ hơn về các mô hình
2627 \subsection{Mô hình TBL}
2629 Mô hình TBL (xem thêm phần~\vref{sec:tbl-spell}) cũng có thể được áp
2630 dụng để tách từ tiếng Trung Quốc~\cite{palmer}.
2632 Mô hình TBL có thể được áp dụng cho nhiều bài toán khác nhau. Tùy vào
2633 các hành động cụ thể của mẫu luật mà cách áp dụng sẽ khác nhau. Mẫu luật
2634 áp dụng cho TBL sử dụng các hành động sau:
2635 \begin{itemize}
2636 \item Nối hai ký tự (tiếng).
2637 \item Tách hai ký tự.
2638 \item Trượt ranh giới từ sang ký tự kế bên.
2639 \end{itemize}
2641 Trình tách từ baseline, có thể áp dụng cách khớp tối đa.
2644 %\subsection{Tách từ bằng bộ đánh nhãn}
2647 \section{Tách từ mờ}
2649 Như đã nói trên, bài toán tách từ không đơn thuần là tách từ đúng như
2650 nghĩa ban đầu, mà là tách từ trong điều kiện dữ liệu đầu vào có khả
2651 năng bị sai. Nói cách khác, đây là bài toán tách từ có khả năng chịu
2652 lỗi\footnote{error-tolerant word segmentation}. Các phương pháp tách
2653 từ được nêu, thông thường không thể áp dụng trực tiếp mà phải có một
2654 số cải tiến nhất định nếu có thể. Ngoài ra cũng có thể áp dụng một số
2655 giải pháp khác, tuy không trực tiếp áp dụng cho tách từ mờ, nhưng phần
2656 nào có thể gợi ý cho một giải thuật tách từ mờ hiệu quả.
2658 Kemal Oflazer~\cite{Oflazer} khi xử lý hình thái trong tiếng Thổ Nhĩ Kỳ gặp trường
2659 hợp khá giống với trường hợp này. Tác giả phải tách hình thái từ
2660 trong điều kiện từ đó bị sai chính tả. Do đặc tính
2661 ngôn ngữ chắp dính\footnote{agglunative language}, số tiếp vĩ ngữ
2662 nhiều, liên tiếp nhau, gây khó khăn cho việc nhận dạng tiếp vĩ ngữ,
2663 cũng như không thể phân biệt những tiếng nào hợp thành một từ trong
2664 một chuỗi tiếng trong tiếng Việt. Tác giả dùng một hàm độ đo, tạo ra
2665 các tiếp đầu ngữ có khả năng thay thế dựa trên độ đo này, sau đó sử
2666 dụng WFST để tìm chuỗi tiếp vĩ ngữ thích hợp nhất.
2668 Bài toán nhận dạng tiếng nói trong tiếng Anh cũng gặp trường hợp tương
2669 tự~\cite{Ravishankar}. Sau công đoạn xử lý âm thanh, ta nhận được
2670 một chuỗi các âm tiết. Ta phải chuyển nhóm âm tiết này thành
2671 chuỗi từ. Do âm thanh thường bị nhiễu, nên các âm tiết có thể
2672 không chính xác hoàn toàn. Ngoài ra, do đặc tính của tiếng Anh nên
2673 cùng một chuỗi âm tiết có thể suy ra nhiều chuỗi từ khác nhau. Tác giả
2674 sử dụng lưới từ để tạo ra các chuỗi từ có khả năng từ chuỗi âm tiết,
2675 sau đó n\-gram trên từ để lượng giá các chuỗi từ.
2677 Một điểm đáng chú ý ở
2678 đây là sự tương đồng về một mặt nào đó giữa tiếng Anh và tiếng
2679 Việt. Với tiếng Anh, từ có thể tách dễ dàng, nhưng từ bao gồm nhiều âm
2680 tiết. Việc phân ranh giới âm tiết trong tiếng Anh là một điều khá khó
2681 khăn. Với tiếng Việt, các âm tiết được tách rất dễ dàng vì mỗi âm tiết
2682 là một ``tiếng'' tương đương với một ``từ'' trong câu --- cách nhau
2683 bởi khoảng trắng. Từ của tiếng Việt lại bao gồm nhiều tiếng, và việc
2684 tách từ lại gặp nhiều khó khăn. Với nhận xét này, có thể thấy các bài
2685 toán nhận dạng tiếng nói tiếng Anh gặp cùng vấn đề với bài toán bắt
2686 lỗi chính tả tiếng Việt!
2688 \cite{Chang} cũng dùng mô hình ngôn ngữ dạng n\-gram để đánh giá các
2689 cách tách từ sau khi đã qua tiền xử lý nhập nhằng chính tả, tuy nhiên
2690 lại sử dùng nhiều mô hình ngôn ngữ khác nhau như
2691 character bi\-gram, word bi\-gram, inter-word character bi\-gram (IWCB), POS
2692 bi\-gram, word class bi\-gram.
2694 Dựa trên những nghiên cứu này, có thể thấy giải pháp khả thi cho việc
2695 tách từ khi bị
2696 sai chính tả, là phát sinh một loạt các từ có khả năng thay thế, với
2697 giả định trong tập từ này sẽ có từ đúng chính tả, thay thế từ sai chính
2698 tả ban đầu. Sau đó sử dụng tách từ tìm một cách tách tốt nhất. Sau khi
2699 tìm được cách tách từ, ta có thể tra từ điển để tìm xem từ nào bị sai.
2701 \subsection{Huấn luyện}
2703 Nếu có dữ liệu đã được đánh dấu sẵn các ranh giới từ, công việc đơn
2704 giản chỉ là áp dụng các công thức thống kê để tính ra các giá trị cần
2705 thiết.
2707 Đối với việc huấn luyện các thuật toán tách từ truyền thống, ta có thể
2708 sử dụng bộ tách từ tiếng Việt sẵn có để tạo ngữ liệu. Chất lượng của
2709 bộ tách từ sẽ ảnh hưởng đến chất lượng của thuật toán.
2711 Với các thuật toán tách từ mờ, đôi khi không thể áp dụng bộ tách từ
2712 sẵn có. Với điều kiện hiện tại, khó có thể tìm được một khối lượng
2713 ngữ liệu lớn đã được tách từ sẵn, do đó cần phải tìm giải pháp tính
2714 được các tham số cần thiết từ ngữ liệu chưa được tách từ (ngữ liệu thô).
2716 Thuật toán EM\footnote{Estimation Maximization} thường được áp dụng để vượt
2717 qua khó khăn này~\cite{softcount,Sproat}. Trên lý thuyết, áp dụng
2718 thuật toán EM đảm bảo kết quả sẽ hội tụ, và kết quả ở mỗi vòng lặp sau
2719 sẽ tốt hơn hoặc bằng kết quả của vòng lặp trước.
2720 %Theo \cite{xxx}, ta chỉ cần lặp khoảng 5-7 vòng lặp là đủ.
2722 Do thuật toán EM cũng có nhiều hạn chế (đặc biệt là hạn chế tối ưu cục
2723 bộ), nhiều giải pháp đã được đưa ra để khắc phục các hạn chế
2724 này~\cite{text-tiling,self-supervised}.
2726 Một giải pháp khác là áp dụng HMM để tìm ra ranh giới từ, sau đó áp
2727 dụng các công thức thống kê thông thường. Giải pháp này gặp hạn chế
2728 bởi chính HMM, vì HMM là mô hình thống kê thuần tuý, không phát huy
2729 được một số đặc trưng của tách từ, cũng không sử dụng các tri thức về
2730 ngôn ngữ học, do đó phần nào hạn chế kết quả cuối cùng.
2732 %XXX
2733 %XXX % đưa cái này lên phần cơ sở tin học/huấn luyện
2734 %% Có thể huấn luyện dựa trên dữ liệu mẫu, hoặc dữ liệu thô. Do hầu hết
2735 %% các phương pháp tách từ đều dựa trên n\-gram ($n\ge 1$) nên rất cần có
2736 %% khối lượng dữ liệu huấn luyện lớn nhằm đạt tính bao quát. Dữ liệu
2737 %% mẫu, được tách từ sẵn, thường không đủ để huấn luyện. Giải pháp chủ
2738 %% yếu là huấn luyện dựa trên dữ liệu thô, chưa tách từ.
2740 %% Thuật toán thường dùng nhất để huấn luyện trên dữ liệu thô là thuật
2741 %% toán EM. Nhiều người đã cố gắng cải tiến EM theo nhiều cách khác nhau
2742 %% nhằm nâng cao chất lượng huấn luyện, đồng thời hạn chế những khuyết
2743 %% điểm của EM.
2745 %% \cite{self-supervised} đề nghị cách giải quyết hạn chế ``tối ưu cục
2746 %% bộ'' của EM, bằng cách phân phối lại từ vựng sau mỗi lần chạy và khởi
2747 %% động lại EM với điểm khởi đầu tốt hơn.
2749 %% \cite{text-tiling} sử dụng một lượng nhỏ ngữ liệu huấn luyện có chất
2750 %% lượng cao (\textit{seed set}) và một lượng lớn ngữ liệu có chất lượng
2751 %% không thật bảo đảm (\textit{training set}), xử lý qua 4 bước:
2752 %% \begin{enumerate}
2753 %% \item \textbf{Phân đoạn tập huấn luyện}
2754 %% \item \textbf{Phân hạng tập huấn luyện}
2755 %% \item \textbf{Tổ hợp tập huấn luyện}
2756 %% \item \textbf{Language model pruning}
2757 %% \end{enumerate}
2760 \chapter{Mô hình}
2761 \label{cha:model}
2762 %TOC
2763 \minitoc
2765 \section{Mô hình chung}
2767 Việc bắt lỗi chính tả của một văn bản được xử lý lần lượt qua các bước
2768 (xem hình~\vref{fig:overall-model}), bao gồm ba khối chính là:
2769 \begin{itemize}
2770 \item Khối tiền xử lý.
2771 Tách văn bản thành những đoạn ngắn. Tách
2772 đoạn thành từng tiếng. Đánh dấu các ký hiệu, dấu ngắt dòng, các số,
2773 tên riêng~\ldots{}
2775 \item Khối bắt lỗi non-word.
2776 Kiểm tra các tiếng với các tiếng đã có
2777 trong từ điển. Báo lỗi những tiếng không có trong từ điển. Sau đó
2778 đưa ra giải pháp thay thế.
2780 \item Khối bắt lỗi real-word.
2781 Tương tự như khối bắt lỗi real-word. Tuy nhiên cần phải tách từ
2782 trước khi thực hiện bắt lỗi chính tả.
2783 \end{itemize}
2785 %% \begin{enumerate}
2786 %% \item \textbf{Tiền xử lý}
2787 %% \item \textbf{Bắt lỗi tiếng}
2788 %% \item \textbf{Tạo lưới từ} Tìm ra mọi từ có thể có trong câu. Xem
2789 %% giải thích về lưới từ bên dưới. Lồng trong phần này là phần
2790 %% \textbf{Phát sinh từ thay thế}
2791 %% \item \textbf{Tách từ} Dựa vào lưới từ, đưa ra cách tách từ tốt nhất.
2792 %% \item \textbf{Bắt lỗi từ} Dựa vào từ điển và cách tách từ đã có,
2793 %% tìm những từ nào không có trong từ điển. Những từ này được xem là từ
2794 %% sai. Sau đó \textbf{Đưa ra giải pháp thay thế}
2795 %% \end{enumerate}
2797 \begin{figure}[htbp]
2798 \centering
2799 \includegraphics[width=\textwidth]{overall}
2800 \caption{Mô hình chung}
2801 \label{fig:overall-model}
2802 \end{figure}
2805 \subsection{Tiền xử lý}
2807 Phần tiền xử lý bao gồm nhiều công đoạn, bắt đầu bằng phần tách các
2808 token (``tiếng'') (\vref{sec:preprocess:token}), và các phần tiền xử lý
2809 khác như đánh dấu các số, các ký hiệu~\ldots
2811 Do đây là tiền xử lý trên dữ liệu không chính xác, nên một số công
2812 đoạn tiền xử lý (như nhận dạng tên riêng) không được thực hiện ngay ở
2813 công đoạn này mà được thực hiện trong phần bắt lỗi real-word.
2815 \subsection{Bắt lỗi non-word}
2817 Phần này sử dụng từ điển để tìm ra những token sai, không có trong từ
2818 điển, lập danh sách từ đề nghị, sau đó yêu cầu người dùng chọn từ
2819 đúng.
2821 Phần này được chạy lặp đi lặp lại cho đến khi không còn lỗi
2822 non-word. Sau đó sẽ đến phần thực hiện của bắt lỗi real-word.
2824 \subsection{Bắt lỗi real-word}
2826 Phần này cố gắng tìm ra tất cả các từ sai chính tả. Phần này gồm hai
2827 công đoạn là tách từ và bắt lỗi chính tả.
2829 Đầu tiên, lưới từ của câu đang xét sẽ được xây dựng. Sau đó lưới từ
2830 này được bổ sung thêm từ cơ chế phục hồi lỗi và các bước tiền xử lý đã
2831 không thể thực hiện được trong phần tiền xử lý. Từ lưới từ này, ta sẽ
2832 chọn ra một cách tách từ tốt nhất dựa vào mô hình ngôn ngữ.
2834 Sau khi đã tách từ xong, phần việc còn lại rất giống với các bước đã
2835 thực hiện trong phần tách từ non-word. Tuy nhiên, thay vì lần lượt tra cứu
2836 các từ với từ điển, ta sẽ so sánh giữa từ trong cách tách từ đúng nhất
2837 và từ trong câu có giống nhau hay không. Từ trong cách tách từ đúng
2838 nhất được xem là từ đúng. Nếu từ trong câu không giống, ta xem như đó
2839 là lỗi chính tả. Phần còn lại được thực hiện tương tự như trong phần
2840 bắt lỗi non-word.
2843 \section{Tiền xử lý}
2846 \subsection{Tách token}
2847 \label{sec:preprocess:token}
2849 Do văn bản đầu vào là một chuỗi các ký tự, ta cần phải tách văn bản ra
2850 thành từng tiếng một, loại bỏ các khoảng trắng dư thừa và đánh dấu các
2851 loại dấu câu trong văn bản. Sau khi tách xong, ta được một dãy các
2852 chuỗi, mỗi chuỗi là một ``token'' kèm theo thông tin về loại token đó
2853 (chữ, khoảng trắng, dấu câu~\ldots)
2855 Ví dụ, đoạn văn bản trên được tách thành những phần như sau:
2857 \def\mybox#1{\hbox{\vrule width 0pt height 24pt}\framebox{\strut#1}}
2858 {\noindent
2859 \mybox{Do} \hfil \mybox{ } \hfil \mybox{văn} \hfil \mybox{ } \hfil \mybox{bản} \hfil
2860 \mybox{ } \hfil \mybox{đầu} \hfil \mybox{ } \hfil \mybox{vào} \hfil \mybox{ } \hfil
2861 \mybox{} \hfil \mybox{ } \hfil \mybox{một} \hfil \mybox{ } \hfil
2862 \mybox{chuỗi} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2863 \mybox{} \hfil \mybox{ } \hfil \mybox{tự} \hfil \mybox{,} \hfil \mybox{ } \hfil
2864 \mybox{ta} \hfil \mybox{ } \hfil \mybox{cần} \hfil \mybox{ } \hfil \mybox{phải} \hfil
2865 \mybox{ } \hfil \mybox{tách} \hfil \mybox{ } \hfil \mybox{văn} \hfil \mybox{ } \hfil
2866 \mybox{bản} \hfil \mybox{ } \hfil \mybox{ra} \hfil \mybox{ } \hfil
2867 \mybox{thành} \hfil \mybox{ } \hfil \mybox{từng} \hfil \mybox{ } \hfil
2868 \mybox{tiếng} \hfil \mybox{ } \hfil
2869 \mybox{một} \hfil \mybox{,} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2870 \mybox{bỏ} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2871 \mybox{khoảng} \hfil \mybox{ } \hfil \mybox{trắng} \hfil \mybox{ } \hfil
2872 \mybox{} \hfil \mybox{ } \hfil \mybox{thừa} \hfil \mybox{ } \hfil \mybox{} \hfil
2873 \mybox{ } \hfil \mybox{đánh} \hfil \mybox{ } \hfil \mybox{dấu} \hfil \mybox{ } \hfil
2874 \mybox{các} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2875 \mybox{dấu} \hfil \mybox{ } \hfil
2876 \mybox{câu} \hfil \mybox{ } \hfil \mybox{trong} \hfil \mybox{ } \hfil
2877 \mybox{văn} \hfil \mybox{ } \hfil \mybox{bản} \hfil \mybox{.} \hfil \mybox{ } \hfil
2878 \mybox{Sau} \hfil \mybox{ } \hfil \mybox{khi} \hfil \mybox{ } \hfil
2879 \mybox{tách} \hfil \mybox{ } \hfil \mybox{xong} \hfil \mybox{,} \hfil \mybox{ } \hfil
2880 \mybox{ta} \hfil \mybox{ } \hfil \mybox{được} \hfil \mybox{ } \hfil \mybox{một} \hfil
2881 \mybox{ } \hfil \mybox{dãy} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2882 \mybox{chuỗi} \hfil \mybox{,} \hfil \mybox{ } \hfil \mybox{mỗi} \hfil \mybox{ } \hfil
2883 \mybox{chuỗi} \hfil \mybox{ } \hfil \mybox{} \hfil \mybox{ } \hfil
2884 \mybox{một} \hfil \mybox{ } \hfil \mybox{``} \hfil \mybox{token} \hfil
2885 \mybox{''} \hfil \mybox{ } \hfil
2886 \mybox{kèm} \hfil \mybox{ } \hfil \mybox{theo} \hfil \mybox{ } \hfil
2887 \mybox{thông} \hfil \mybox{ } \hfil \mybox{tin} \hfil \mybox{ } \hfil
2888 \mybox{về} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2889 \mybox{token} \hfil \mybox{ } \hfil \mybox{đó} \hfil \mybox{ } \hfil
2890 \mybox{(} \hfil \mybox{chữ} \hfil \mybox{,} \hfil \mybox{ } \hfil
2891 \mybox{khoảng} \hfil \mybox{ } \hfil \mybox{trắng} \hfil \mybox{,} \hfil
2892 \mybox{ } \hfil \mybox{dấu} \hfil \mybox{ } \hfil \mybox{câu} \hfil \mybox{ } \hfil
2893 \mybox{\ldots} \hfil \mybox{)} \hfill
2896 Quy luật tách như sau:
2897 \begin{itemize}
2898 \item Khoảng trắng là ký tự khoảng trắng (space) hoặc ký tự tab.
2899 \item Dấu kết thúc câu bao gồm ba dấu: \mybox{.} \mybox{?} \mybox{!}
2900 \item Dấu đóng ngoặc bao gồm: \mybox{"} \mybox{)} \mybox{]} \mybox{\}}
2901 \mybox{>} \mybox{'}
2902 \item Một token là:
2903 \begin{itemize}
2904 \item Một hoặc nhiều dấu kết câu và các dấu đóng ngoặc nếu có. Ví
2905 dụ: \mybox{.)}
2906 \item Một hoặc nhiều dấu nối chữ (hyphen) \mybox{-}.
2907 \item Một hoặc nhiều dấu mở nháy đơn \mybox{`}.
2908 \item Một hoặc nhiều dấu đóng nháy đơn \mybox{'}.
2909 \item Một hoặc nhiều chữ, chữ số, một số dấu: \mybox{.} \mybox{,}
2910 \mybox{:} \mybox{'} \mybox{\$} \mybox{\%} \mybox{-}
2911 \mybox{$\backslash$} \mybox{/}; kết thúc bằng chữ hoặc chữ số. Ví
2912 dụ: \mybox{tôi} \mybox{\$12}
2913 \item Một hoặc nhiều chữ, chữ số, kết thúc bằng dấu tỉnh lược
2914 \mybox{'} (quy tắc này chủ yếu áp dụng cho tiếng Anh, như
2915 \mybox{she'} \mybox{s} \mybox{ } \mybox{a} \mybox{ } \mybox{teacher})
2916 \item Một chữ hoặc chữ số.
2917 \item Một hoặc nhiều khoảng trắng, dấu xuống dòng và các ký tự lạ khác.
2918 \end{itemize}
2919 \end{itemize}
2921 \subsection{Tách câu}
2922 \label{sec:model:sentence-segmentation}
2924 Mục đích của tách câu là tách ra thành từng câu để xử lý. Việc xác
2925 định đơn vị câu rất quan trọng trong các ứng dụng xử lý ngôn ngữ tự
2926 nhiên. Tuy nhiên, do chương trình này chưa sử dụng một số thông tin
2927 cần đến đơn vị câu, nên ``câu'' ở đây được hiểu như là một đoạn ngắn,
2928 một câu hoặc một phần của câu.
2930 Việc tách câu dựa vào các dấu câu để ngắt câu ra thành từng đoạn để xử
2931 lý. Mỗi đoạn sẽ được xử lý độc lập với nhau. Các đoạn được phân cách
2932 bởi các token dấu câu \mybox{.} \mybox{,} \mybox{;} \mybox{(}
2933 \mybox{)}~\ldots{} Phần tách token phải được thực hiện trước phần tách
2934 câu.
2936 \subsection{Chuẩn hoá}
2939 \subsubsection{Chuẩn hoá dấu}
2941 Chuẩn hoá là đặt lại vị trí dấu trong các tiếng nhằm đảm bảo thống
2942 nhất một quy tắc đặt dấu chung. Do tiếng Việt có nhiều hơn một quy
2943 định về
2944 quy tắc bỏ dấu (bỏ dấu khoa
2945 học, bỏ dấu mỹ thuật~\ldots), gây khó
2946 khăn cho các thao tác xử lý về sau, bởi vì cùng một chữ nhưng dùng hai
2947 quy tắc bỏ dấu khác nhau sẽ cho ra hai chuỗi ký tự hoàn toàn khác nhau
2948 (Ví dụ, ``hoà'' và ``hòa'').
2950 Để tránh tình trạng này, dấu được tách
2951 riêng ra khỏi tiếng, được coi như là một ký tự nằm ở đầu tiếng. Như
2952 vậy một tiếng bất kỳ sẽ bao gồm ký tự đầu tiên đại diện cho thanh
2953 điệu, các ký tự theo sau đại diện cho âm đầu và vần của tiếng đó. Dấu
2954 được thể hiện theo quy ước gõ VNI:
2955 \begin{itemize}
2956 \item Thanh ngang được biểu diễn bằng ký tự `0'.
2957 \item Thanh sắc được biểu diễn bằng ký tự `1'.
2958 \item Thanh huyền được biểu diễn bằng ký tự `2'.
2959 \item Thanh hỏi được biểu diễn bằng ký tự `3'.
2960 \item Thanh ngã được biểu diễn bằng ký tự `4'.
2961 \item Thanh nặng được biểu diễn bằng ký tự `5'.
2962 \end{itemize}
2964 Theo quy tắc trên, ``hoà'' sẽ được biến đổi thành ``2hoa'';
2965 ``hòa'' sẽ được biến đổi thành ``2hoa''. Như vậy ta có thể coi ``hòa''
2966 và ``hoà'' là tương đương nhau khi so sánh dạng biến đổi ``2hoa'' của
2967 chúng. Một số ví dụ khác: ``hồng'' được biến đổi thành ``2hông'',
2968 ``hoa'' được biến đổi thành ``0hoa''.
2970 Các tiếng nước ngoài, các ký hiệu~\ldots{} không có dấu, sẽ được xem như
2971 có thanh ngang. Như vậy, ``USA'' sẽ được biến đổi thành ``0USA''.
2973 Do việc biến đổi làm mất thông tin về cách bỏ dấu. Ta cần phải giữ lại
2974 chữ gốc bên cạnh chữ biến đổi (``chữ chuẩn hoá'') để có thể dùng lại
2975 sau này. Ta cũng có thể phục hồi chữ từ chữ chuẩn hoá bằng cách phân
2976 tích cấu trúc âm tiết và bỏ dấu thích hợp theo quy tắc bỏ dấu cho
2977 trước. Việc này sẽ giúp chuẩn hoá cách bỏ dấu cho toàn văn bản.
2979 \subsubsection{Chuẩn hoá `y' và `i'}
2981 %% XXX Ngoài ra còn một dạng khác là ``quý'' và ``quí''
2982 Ngoài việc chuẩn hoá cách bỏ dấu, một số chữ trong tiếng Việt kết thúc
2983 bằng `y' có thể được đổi thành `i'. Ví dụ, ``quý'' và ``quí'' đều hợp
2984 lệ. Tuy nhiên, không phải chữ nào kết thúc bằng `y' cũng có thể chuyển
2985 thành `i', ví dụ ``thuý'' và ``thúi''. Nguyên nhân là do khi
2986 chuyển thành `i', chữ cái này kết hợp với `u' tạo ra âm chính `ui'
2987 thay vì âm chính `i'. Một số chữ kết thúc bằng `i' cũng không thể
2988 chuyển sang `y', ví dụ ``bí'', ``chí''~\ldots{} Việc cho phép viết
2989 một từ ở hai cách sẽ làm giảm hiệu suất của chương trình do chương
2990 trình coi ``quý'' và ``quí'' là hai chữ hoàn toàn khác nhau. Giải pháp
2991 là lập danh sách những từ có âm chính là y/i và là âm tiết mở,
2992 sau đó chuyển tất cả những từ kết thúc bằng `i' có trong danh sách
2993 trên sang `y'. Trong quá trình bắt lỗi chính tả, nếu người dùng yêu
2994 cầu chuẩn hoá thì ta có thể xem việc viết `y' hoặc `i' như là sai
2995 chính tả. Nếu không, ta sẽ bỏ qua khác biệt `y' và `i' ở bước báo lỗi
2996 chính tả. Gồm các chữ sau (không xét thanh điệu): ``mi'', ``ti'',
2997 ``thi'', ``qui'', ``ki'', ``hi'', ``li'' ``si'', ``vi''.
2999 \subsection{Chữ viết hoa}
3001 Chữ viết hoa dùng để biểu diễn tên riêng, từ viết tắt hoặc dùng cho
3002 chữ đứng đầu câu. Do đó cần phân biệt chữ đầu câu có
3003 phải là chữ bắt đầu tên riêng hay không. Ngoài ra, cần xác định tên riêng khi
3004 tìm được chữ viết hoa bắt đầu tên riêng. Các văn bản tiếng Việt chưa
3005 hoàn toàn thống nhất về quy tắc viết hoa. Ví dụ, có tài liệu dùng
3006 ``Cộng hoà Xã hội Chủ nghĩa Việt Nam'', nhưng có tài liệu lại dùng
3007 ``Cộng Hoà Xã Hội Chủ Nghĩa Việt Nam''.
3009 Do văn bản đầu vào có khả năng bị sai chính tả, kèm theo sự không
3010 thống nhất trong quy cách viết tên riêng, nên khó có thể xác định
3011 tên riêng ngay ở bước tiền xử lý. Vì vậy phần này sẽ được thực hiện trong
3012 phần tách từ thay vì trong phần tiền xử lý.
3014 %% ngay chính xác có phải là cụm từ viết hoa đúng hay không. Bước này cố
3015 %% gắng phát hiện ra những cụm từ viết hoa và thêm vào lưới từ. Do vậy,
3016 %% phần này được thực hiện bên trong phần \textbf{Phát sinh từ thay thế}.
3018 %% Có thể dùng thuật giải như sau: Nếu bắt đầu bằng chữ viết hoa, và chữ
3019 %% đầu được viết thường cùng những từ kế tiếp của nó là một từ trong từ
3020 %% điển, thì xem như đó là một từ. Nếu một chuỗi từ viết hoa liên tục
3021 %% (hai từ trở lên) thì xem như đó là một từ (một tên riêng), và được
3022 %% đánh dấu từ lạ $UNK$.
3024 %% Với tên riêng của người Việt. Một danh sách các tên tiếng Việt được
3025 %% thu thập nhằm rút ra những chữ thường dùng khi đặt tên. Những chuỗi
3026 %% các chữ hoa liên tiếp được hình thành từ những chữ trong danh sách này
3027 %% sẽ được xem như là tên riêng, đánh mã $PROP$.
3030 %% \begin{algo}\caption{Xử lý chữ hoa}
3031 %% \label{algo:propername}
3032 %% \begin{enumerate}
3033 %% \item Lấy 1 chữ. Kiểm tra ký tự đầu tiên xem có phải ký tự hoa hay
3034 %% không.
3035 %% \item Nếu đây là chữ đầu câu, phát sinh bình thường dựa theo bản
3036 %% viết thường của chữ này. Ngoài ra tiếp tục thực hiện các bước
3037 %% dưới.
3038 %% \item Duyệt từ chữ đó trở đi, lấy chuỗi dài nhất có thể dựa trên
3039 %% $sid$. Phát sinh từ mới dựa trên từ lấy được. Đặt xác suất 0.80.
3040 %% \item Nếu không tìm được từ nào, duyệt lại như bước trên, dùng
3041 %% $scid$.
3042 %% \item Nếu chữ kế tiếp cũng là chữ hoa, duyệt từ đó trở đi để lấy
3043 %% chuỗi chữ hoa dài nhất ($scid$). Phát sinh từ mới
3044 %% mã $PROP$.
3045 %% \end{enumerate}
3046 %% \end{algo}
3048 %% \subsection{Từ láy UNIMPL}
3050 %% Phần này được thực hiện bên trong phần \textbf{Phát sinh từ thay thế}.
3052 %% \begin{itemize}
3053 %% \item Láy toàn bộ (Vd. ba ba, chuồn chuồn~\ldots{})
3054 %% \item Láy âm đầu (Vd. chặt chẽ, trong trẻo~\ldots{})
3055 %% \item Láy điệp vần (Vd. lông bông, lã chã~\ldots{})
3056 %% \item Láy điệp âm, láy vần (Vd. thủ thỉ, tủm tỉm~\ldots{})
3057 %% \item Hai thanh của tiếng thường ở cùng một hệ~\ldots{}
3058 %% \end{itemize}
3060 %% \note{Hổng thèm làm :-)} Vấn đề từ láy cũng tương tự như tên riêng. Giải
3061 %% pháp có thể áp dụng là dựa vào các quy tắc tạo từ láy để phát hiện
3062 %% những từ có khả năng là từ láy và thêm vào lưới từ.
3064 %% Đối với các từ láy trên 2 tiếng. Do số lượng các từ láy dạng này không
3065 %% nhiều nên có thể thêm các từ láy này vào từ điển.
3066 %% %% Nhưng những ``từ láy''
3067 %% %% ``nhưng những'' có thể giết chết module tách từ một cách êm dịu. Chắc
3068 %% %% nên áp dụng giải pháp ``80 từ láy, 20 từ thường''. Không biết được hay
3069 %% %% không, phiêu quá~\ldots{}
3071 %% \begin{algo}\caption{Xử lý từ láy}
3072 %% \label{algo:poem}
3073 %% \begin{enumerate}
3074 %% \item Lấy 2 chữ liên tiếp.
3075 %% \item Kiểm tra quy tắt từ láy.
3076 %% \item Nếu đúng, phát sinh thêm từ láy mới, mã $POEM$.
3077 %% \end{enumerate}
3078 %% \end{algo}
3080 %% %% Có lẽ nên lọc ra danh sách từ láy bằng tay, đánh nhãn toàn bộ là
3081 %% %% $POEM$, hoặc dùng nhãn riêng. Heuristic này không đáng tin lắm.
3082 %% %% Cách hình thành từ láy của con người như thế nào ?? Từ láy thường gắn
3083 %% %% liền với hình tượng, cảm giác gì đó. Làm sao người ta có thể cảm nhận
3084 %% %% được một từ có phải là từ láy hay không??
3086 \subsection{Từ nước ngoài, từ viết tắt, các ký hiệu~\ldots{}}
3088 Xử lý tiếng nước ngoài, các ký hiệu chuyên ngành, các từ viết tắt. Do
3089 trình bắt lỗi không có kiến thức về các lĩnh vực chuyên
3090 ngành, cũng như các thứ tiếng trên thế giới, nên việc áp dụng tri thức
3091 để phân loại là điều hết sức khó khăn. Giải pháp được dùng ở đây là
3092 xem các từ nước ngoài, từ viết tắt, các ký hiệu~\ldots{} như là
3093 những chữ bình thường (và sẽ được xem như là lỗi chính tả trong phần
3094 bắt lỗi chính tả).
3096 Phần này sẽ cố gắng phân loại một số loại thường gặp như số, ngày
3097 tháng~\ldots{} nhằm giảm bớt các lỗi sai chính tả không đáng có. Các
3098 con số được đánh dấu riêng bằng mã $NUM$. ``Số'' ở đây được coi là bất
3099 cứ chữ nào bắt đầu bằng số. Ví dụ, ``0lit'', ``0.2'',
3100 ``0-4''~\ldots{}{} đều được coi là số.
3102 Ngày tháng được nhận dạng theo mẫu ``ngày-tháng-năm'' hoặc
3103 ``ngày/tháng/năm''. Nói cách khác, ngày tháng là các số liên tiếp,
3104 cách nhau bằng dấu `/' hoặc `--'. Ngày tháng cũng được đánh nhãn $NUM$.
3107 \section{Bắt lỗi non-word}
3110 \subsection{Tìm lỗi chính tả}
3111 \label{sec:nonword:spelling-checking}
3113 Việc tìm lỗi chính tả đơn giản là duyệt qua từng token, kiểm tra xem
3114 token đó có trong từ điển hay không. Nếu token không có trong từ điển,
3115 token đó bị sai chính tả.
3117 Nếu thực hiện như trên, sẽ có rất nhiều chữ bị cho là sai chính tả, ví
3118 dụ như các con số, ngày tháng~\ldots{} Ta cần phải nhận ra những token
3119 loại này và bỏ qua chúng khi tìm lỗi chính tả. Do phần tiền xử lý đã
3120 đánh dấu các token chứa số bằng mã $NUM$ nên khi thực hiện tìm lỗi
3121 chính tả, ta sẽ không xét những token loại này.
3124 \subsection{Lập danh sách từ đề nghị}
3125 \label{sec:nonword:candidate-list}
3127 Sau khi đã xác định những chữ bị sai chính tả, ta cần đưa ra một số
3128 gợi ý để người dùng chọn, thay vì buộc người dùng tự tìm ra chữ
3129 đúng. Việc lập ra danh sách gợi ý chủ yếu dựa vào nguyên tắc phục hồi
3130 lỗi: Dựa vào nguyên nhân phát sinh ra lỗi, thực hiện thao tác ngược
3131 lại để tìm ra chữ đúng.
3133 Lỗi được xử lý trong phần này là lỗi non-word. Lỗi này có thể do những
3134 nguyên nhân sau:
3135 \begin{itemize}
3136 \item Lỗi nhập liệu sai.
3137 \item Lỗi OCR.
3138 \item Lỗi nhận dạng tiếng nói.
3139 \item Lỗi phát âm sai.
3140 \end{itemize}
3143 \subsubsection{Lỗi nhập liệu}
3144 \label{sec:nonword:recover:keyboard}
3146 Lỗi nhập liệu bao gồm những loại lỗi sau:
3147 \begin{itemize}
3148 \item Lỗi gõ sót phím.
3149 \item Lỗi gõ dư phím.
3150 \item Lỗi gõ sai phím (gõ nhầm phím này bằng phím khác).
3151 \item Lỗi gõ sai thứ tự (gõ đảo thứ tự hai phím liên tiếp nhau).
3152 \end{itemize}
3154 Ngoài ra, do phím spacebar phát sinh ký tự khoảng trắng dùng để phân
3155 cách các chữ với nhau, nên cần phải xử lý đặc biệt với phím này. Dựa
3156 vào các loại lỗi trên, ta có thêm các lỗi bổ sung:
3157 \begin{itemize}
3158 \item Lỗi gõ thiếu phím spacebar, gom hai chữ thành một chữ.
3159 \item Lỗi gõ dư phím spacebar, tách một chữ thành hai chữ.
3160 \item Lỗi gõ sai phím spacebar, có thể dẫn đến việc nhóm hai chữ hoặc
3161 tách chữ làm hai.
3162 \item Lỗi gõ sai thứ tự giữa một phím và phím spacebar dẫn đến việc
3163 một ký tự trong chữ này bị đẩy sang chữ khác.
3164 \end{itemize}
3166 Giải pháp khắc phục lỗi là thực hiện ngược lại quá trình tạo ra
3167 lỗi. Đối với lỗi gõ sót phím, dư phím, ta có thể thêm một phím hoặc
3168 bớt một phím để tạo ra chữ mới. Với lỗi gõ sai thứ tự, ta duyệt qua
3169 chữ, lần lượt hoán vị hai ký tự liên tiếp để tạo ra chữ mới.
3171 Đối với lỗi gõ nhầm phím, ta dựa vào bố trí bàn phím để phát sinh
3172 lỗi. Giả định sơ đồ bố trí của bàn phím EN-US được dùng. Do thông
3173 thường chỉ gặp một lỗi gõ nhầm với phím ngay bên cạnh này mỗi
3174 từ, nên chương trình chỉ lưu danh sách những phím lân cận với từng
3175 phím, dựa trên bàn phím EN-US. Ví dụ: $A \rightarrow \{ S, Q, W, X, Z \}$.
3177 Với những phím hai ký tự như phím `\texttt{2}' (`\texttt{2}' và
3178 `\texttt{@}') thì \texttt{@} sẽ được thêm
3179 vào tập các phím lân cận với \texttt{2} và ngược lại.
3181 Danh sách cụ thể được nêu trong bảng~\vref{tab:neighbor-keys}.
3183 \begin{table}[htbp]
3184 \centering
3185 \begin{tabular}{ll|ll|ll}
3186 Phím&Phím lân cận&Phím&Phím lân cận&Phím&Phím lân cận\\\hline
3187 \verb#`#&\verb#~1!#&%z
3188 \verb#~#&\verb#`1!#&%z
3189 \verb#1#&\verb#!`~q2@#\\
3190 \verb#!#&\verb#1`~q2@#&%z
3191 \verb#2#&\verb#@1!qw3#\#&%z
3192 \verb#@#&\verb#21!qw3#\#\\
3193 \verb#3#&\#\verb#2@we4$#&%z
3194 \#&\verb#32@we4$#&%z
3195 \verb#4#&\verb#$3#\#\verb#er5%#\\
3196 \verb#$#&\verb#43#\#\verb#er5%#&%z
3197 \verb#5#&\verb#%4$rt6^#&%z
3198 \verb#%#&\verb#54$rt6^#\\
3199 \verb#6#&\verb#^5%ty7&#&%z
3200 \verb#^#&\verb#65%ty7&#&%z
3201 \verb#7#&\verb#&6^yu8*#\\
3202 \verb#&#&\verb#76^yu8*#&%z
3203 \verb#8#&\verb#*7&ui9(#&%z
3204 \verb#*#&\verb#87&ui9(#\\
3205 \verb#9#&\verb#(8*io0)#&%z
3206 \verb#(#&\verb#98*io0)#&%z
3207 \verb#0#&\verb#)9(op-_#\\
3208 \verb#)#&\verb#09(op-_#&%z
3209 \verb#-#&\verb#_0)p[=+#&%z
3210 \verb#_#&\verb#-0)p[=+#\\
3211 \verb#=#&\verb#+-_[{]}\\|#&%z
3212 \verb#+#&\verb#=-_[{]}\\|#&%z
3213 \verb#\#&\verb#|=+]}#\\
3214 \verb#|#&\verb#\=+]}#&%z
3215 \verb#q#&\verb#aw2@1!#&%z
3216 \verb#w#&\verb#qase3#\#\verb#2@#\\
3217 \verb#e#&\verb#wsdr4$3#\#&%z
3218 \verb#r#&\verb#edft5%4$#&%z
3219 \verb#t#&\verb#rfgy6^5%#\\
3220 \verb#y#&\verb#tghu7&6^#&%z
3221 \verb#u#&\verb#yhji8*7&#&%z
3222 \verb#i#&\verb#ujko9(8*#\\
3223 \verb#o#&\verb#iklp0)9(#&%z
3224 \verb#p#&\verb#ol;:[{-_0)#&%z
3225 \verb#[#&\verb#]}=+-_#\\
3226 \verb#{#&\verb#]}=+-_#&%z
3227 \verb#]#&\verb#[{=+\|#&%z
3228 \verb#}#&\verb#[{=+\|#\\
3229 \verb#a#&\verb#qwsz#&%z
3230 \verb#s#&\verb#awedxz#&%z
3231 \verb#d#&\verb#erfcxs#\\
3232 \verb#f#&\verb#rtgvcd#&%z
3233 \verb#g#&\verb#tyhbvf#&%z
3234 \verb#h#&\verb#yujnbg#\\
3235 \verb#j#&\verb#uikmnh#&%z
3236 \verb#k#&\verb#iol,<mj#&%z
3237 \verb#l#&\verb#op;:.>,<k#\\
3238 \verb#;#&\verb#/?.>l#&%z
3239 \verb#:#&\verb#/?.>l#&%z
3240 \verb#'#&\verb#[{]}/?;:#\\
3241 \verb#"#&\verb#'[{]}/?;:#&%z
3242 \verb#z#&\verb#asx#&%z
3243 \verb#x#&\verb#zsdc#\\
3244 \verb#c#&\verb#xdfv#&%z
3245 \verb#v#&\verb#cfgb#&%z
3246 \verb#b#&\verb#vghn#\\
3247 \verb#n#&\verb#bhjm#&%z
3248 \verb#m#&\verb#njk,<#&%z
3249 \verb#,#&\verb#<mkl.>#\\
3250 \verb#<#&\verb#,mkl.>#&%z
3251 \verb#.#&\verb#>,<l;:/?#&%z
3252 \verb#>#&\verb#.,<l;:/?#\\
3253 \verb#/#&\verb#?.>;:'"#&%z
3254 \verb#?#&\verb#/.>;:'"#&%z
3255 \end{tabular}
3256 \caption{Danh sách phím lân cận}
3257 \label{tab:neighbor-keys}
3258 \end{table}
3261 Do với mỗi phím có khoảng 8 phím lân cận. Một chữ dài trung bình 5
3262 tự sẽ phát sinh ra một tập $8^5$ các chuỗi có khả năng. Trong số này
3263 chỉ có một số rất ít là chữ thật sự, đúng quy tắc chính tả. Tuy nhiên
3264 việc xử lý một khối lượng lớn như vậy là không thể. Vì vậy chương
3265 trình giả định chỉ nhập gõ sai tối đa hai phím với mỗi chữ, nhằm giảm
3266 thiểu bùng nổ tổ hợp.
3268 Với lỗi spacebar, ta cũng xét tương tự. Tuy nhiên, với những lỗi có
3269 khả năng tách làm hai chữ, ta sẽ xét chữ hiện thời và chữ kế tiếp cùng
3270 lúc, xem như là một chữ. Lỗi gõ nhầm spacebar với một phím khác là
3271 điều khó có thể xảy ra vì phím spacebar tương đối lớn, dễ nhận diện
3272 khi gõ.
3274 Với các kiểu gõ như VNI, TELEX. Chương trình cố gắng ``phục hồi'' từ
3275 những chữ gõ sai nếu phát hiện được. Ví dụ, ``nguyê4n'' sẽ tạo ra
3276 ``nguyễn''. Bộ gõ được VNI, TELEX cài đặt, sau đó nhận chuỗi các ký tự
3277 của chữ đang xét qua bộ gõ phục hồi các dấu. Bước này được thực hiện
3278 sau bước trên, để nếu gõ nhầm phím dấu kế bên thì vẫn có thể phục hồi
3279 lại.
3281 Bộ gõ VNI và TELEX được sử dụng như trong
3282 bảng~\vref{tab:vni-telex}. Nguyên tắc của các bộ gõ được cài đặt không
3283 quá cầu kỳ, do yêu cầu chỉ là để phục hồi lỗi. Các phím dấu của mỗi bộ
3284 gõ sẽ được duyệt qua chữ, từ vị trí của phím dấu về đầu chữ. Nếu phím
3285 dấu có thể kết hợp được với ký tự đang được duyệt, ta xem như đã phục
3286 hồi lỗi. Lỗi VNI-TELEX được áp dụng lại, sau khi đã phục hồi lỗi theo
3287 phương pháp trên, vì khi gõ VNI-TELEX người dùng vẫn có khả năng gõ
3288 nhầm các phím dấu.
3290 \begin{table}[htbp]
3291 \centering
3292 \begin{tabular}{ll|ll}
3293 \multicolumn{2}{c}{VNI}&\multicolumn{2}{c}{TELEX}\\
3294 Phím&Dấu&Phím&Dấu\\\hline
3295 1&dấu sắc&s&dấu sắc\\
3296 2&dấu huyền&f&dấu huyền\\
3297 3&dấu hỏi&r&dấu hỏi\\
3298 4&dấu ngã&x&dấu ngã\\
3299 5&dấu nặng&j&dấu nặng\\
3300 6&dấu mũ&aa,ee,oo&â,ê,ô\\
3301 u7,o7&ư,ơ&uw,ow&ư,ơ\\
3302 a8&ă&aw&ă\\
3303 d9&đ&dd&đ\\
3304 \end{tabular}
3305 \caption{Kiểu gõ VNI-TELEX}
3306 \label{tab:vni-telex}
3307 \end{table}
3309 % Hmm.. phần phục hồi ngược từ VNI, TELEX. Vd, englíh (english). Cái này
3310 % nhường cho English Speller. Hơi vướng với VIQR.
3312 Các chữ được phát sinh sẽ được so sánh với từ điển tiếng. Nếu chữ nằm trong từ
3313 điển, ta cho chữ vào danh sách đề nghị. Ngược lại, chữ bị hủy bỏ.
3315 Tóm lại, thuật toán~\vref{algo:keyb} để phục hồi lỗi bàn phím.
3316 \begin{algo}
3317 \caption{Phục hồi lỗi bàn phím}
3318 \label{algo:keyb}
3319 \begin{enumerate}
3320 \item Phục hồi lỗi VNI-TELEX.
3321 \item Phục hồi lỗi gõ sót phím. Phục hồi lỗi VNI-TELEX dựa trên kết
3322 quả của lần phục hồi trước.
3323 \item Phục hồi lỗi gõ dư phím. Phục hồi lỗi VNI-TELEX dựa trên kết
3324 quả của lần phục hồi trước.
3325 \item Phục hồi lỗi nhầm phím. Phục hồi lỗi VNI-TELEX dựa trên kết
3326 quả của lần phục hồi trước.
3327 \item Phục hồi lỗi sai thứ tự phím. Phục hồi lỗi VNI-TELEX dựa trên kết
3328 quả của lần phục hồi trước.
3329 \item Phục hồi lỗi gõ sót phím spacebar. Phục hồi lỗi VNI-TELEX dựa trên kết
3330 quả của lần phục hồi trước.
3331 \item Phục hồi lỗi gõ dư phím spacebar. Phục hồi lỗi VNI-TELEX dựa trên kết
3332 quả của lần phục hồi trước.
3333 \item Phục hồi lỗi sai thứ tự phím spacebar. Phục hồi lỗi VNI-TELEX dựa trên kết
3334 quả của lần phục hồi trước.
3335 \item Lọc lại danh sách những từ đã có. Nếu từ không nằm trong từ
3336 điển tiếng thì loại bỏ.
3337 \end{enumerate}
3338 \end{algo}
3340 \begin{algo}\caption{Phục hồi lỗi VNI-TELEX}
3341 \begin{enumerate}
3342 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3343 \item Nếu ký tự đang xét là phím dấu, duyệt ngược từ vị trí ký tự
3344 đang xét về đầu chữ. Nếu có thể ghép dấu, thực hiện ghép dấu, lưu
3345 chữ vào danh sách.
3346 \end{enumerate}
3347 \end{algo}
3349 \begin{algo}\caption{Phục hồi lỗi gõ sót phím}
3350 \begin{enumerate}
3351 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3352 \item Ở từng vị trí, chèn thêm một ký tự vào bên phải ký tự đang
3353 xét. Lưu chữ vào danh sách.
3354 \end{enumerate}
3355 \end{algo}
3357 \begin{algo}\caption{Phục hồi lỗi gõ dư phím}
3358 \begin{enumerate}
3359 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3360 \item Ở từng vị trí, xóa ký tự đang xét. Lưu chữ vào danh sách.
3361 \end{enumerate}
3362 \end{algo}
3364 \begin{algo}\caption{Phục hồi lỗi gõ nhầm phím}
3365 \begin{enumerate}
3366 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3367 \item Ở từng vị trí, thay thế ký tự đang xét bằng ký tự lân cận (như
3368 trong bảng~\vref{tab:neighbor-keys}). Lưu chữ vào danh sách.
3369 \end{enumerate}
3370 \end{algo}
3372 \begin{algo}\caption{Phục hồi lỗi gõ sai thứ tự phím}
3373 \begin{enumerate}
3374 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3375 \item Ở từng vị trí, hoán vị ký tự đang xét và ký tự bên phải ký tự
3376 đang xét. Lưu chữ vào danh sách.
3377 \end{enumerate}
3378 \end{algo}
3380 \begin{algo}\caption{Phục hồi lỗi gõ sót phím spacebar}
3381 \begin{enumerate}
3382 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3383 \item Ở từng vị trí, tách chữ làm hai chữ tại vị trí ký tự đang
3384 xét. Lưu hai chữ vào danh sách.
3385 \end{enumerate}
3386 \end{algo}
3388 \begin{algo}\caption{Phục hồi lỗi gõ dư phím spacebar}
3389 \begin{enumerate}
3390 \item Nối chữ đang xét và chữ bên phải chữ đang xét lại làm một.
3391 \item Lưu chữ vào danh sách.
3392 \end{enumerate}
3393 \end{algo}
3395 \begin{algo}\caption{Phục hồi lỗi gõ sai thứ tự phím spacebar}
3396 \begin{enumerate}
3397 \item Chuyển một ký tự từ chữ bên phải chữ đang xét sang cuối chữ đang
3398 xét. Lưu vào danh sách.
3399 \item Chuyển một ký tự từ chữ đang xét sang đầu chữ bên phải chữ đang
3400 xét. Lưu vào danh sách.
3401 \end{enumerate}
3402 \end{algo}
3404 \subsubsection{Lỗi phát âm}
3406 Lỗi phát âm chủ yếu gây ra lỗi real-word. Tuy nhiên lỗi phát âm đôi
3407 khi vẫn có lỗi non-word. Đây là những từ phát âm giống nhau, chữ viết
3408 bao gồm các thành phần âm đầu, âm đệm, âm chính, âm cuối hợp lệ. Tuy
3409 nhiên kết hợp các thành phần lại không tạo thành một chữ nằm trong từ
3410 điển tiếng. Ví dụ, ``nghành'', ``ngỉ'', ``ka''. Do đặc điểm của chữ
3411 quốc ngữ, một số âm tố không thể kết hợp với nhau. Đây là nguyên nhân
3412 chủ yếu của lỗi loại này.
3414 Lỗi phát âm sẽ được trình bày cụ thể trong
3415 phần~\vref{sec:realword:recover:sound}. Phần này chỉ nêu ra những điểm
3416 riêng của lỗi phát âm --- non-word.
3418 Với loại lỗi này, ta cần phân tích cấu trúc âm tiết tiếng Việt. Sau
3419 khi phân tích cấu trúc âm tiết tiếng Việt, ta sẽ thay thế từng thành
3420 phần của âm tiết bằng một thành phần khác có cách phát âm giống như
3421 thành phần được thay thế. Thuật toán lỗi phát âm như trong thuật
3422 toán~\vref{algo:error:nonword}.
3423 \begin{algo}
3424 \caption{Phục hồi lỗi phát âm (non-word)}
3425 \label{algo:error:nonword}
3426 \begin{enumerate}
3427 \item Phân tích cấu trúc âm tiết.
3428 \item Tạo danh sách âm tiết, bao
3429 gồm các âm tiết có phát âm tương tự với âm tiết ban đầu.
3430 \item Lọc lại danh sách, những âm tiết không có trong từ điển tiếng
3431 bị loại bỏ.
3432 \end{enumerate}
3433 \end{algo}
3435 \subsection{Sắp xếp danh sách từ đề nghị}
3436 \label{sec:nonword:sort-candidates}
3438 Như đã nói trong phần~\vref{sec:sort-candidates}, có nhiều cách để sắp
3439 xếp danh sách từ đề nghị. Do không thể sử dụng các thông tin cú pháp,
3440 ngữ nghĩa, giải pháp được áp dụng là dùng mô hình ngôn ngữ (được dùng
3441 khi bắt lỗi real-word --- phần~\vref{sec:language-model}) sẽ được dùng
3442 để đánh giá các từ đề nghị, cùng với việc loại bỏ các chữ không cùng
3443 chữ hoa/thường với chữ gốc và áp dụng thống kê tần số sử dụng của mỗi
3444 từ.
3446 Giải pháp được áp dụng như sau trong thuật
3447 toán~\vref{algo:nonword:sort}.
3448 \begin{algo}
3449 \caption{Sắp xếp danh sách từ đề nghị (non-word)}
3450 \label{algo:nonword:sort}
3451 \begin{enumerate}
3452 \item Phát sinh lưới từ.
3453 \item Thêm các chữ đề nghị vào, cập nhật lưới từ, thêm các từ mới từ
3454 những chữ được thêm.
3455 \item Áp dụng mô hình ngôn ngữ, dựa vào điểm để sắp xếp danh sách từ.
3456 \end{enumerate}
3457 \end{algo}
3459 \section{Bắt lỗi real-word}
3461 \subsection{Lưới từ}
3462 \label{sec:wordlattice}
3464 Bắt lỗi real-word đòi hỏi tách từ và lượng giá các cách tách từ bằng
3465 mô hình ngôn ngữ. Để thuận tiện xử lý, chương trình sử dụng một cấu
3466 trúc dữ liệu dạng đồ thị để thể hiện các từ --- gọi là lưới
3467 từ\footnote{word lattice}. Đây là một đồ thị có hướng không chu trình,
3468 với các nút là các từ trong câu, cạnh là đường nối giữa hai từ kề
3469 nhau, hướng thể hiện thứ tự của các từ trong câu. Ngoài các nút là các
3470 từ trong câu, lưới từ có hai nút đặc biệt là nút ``head'' và nút
3471 ``tail''. Nút ``head'' nằm ở đầu lưới từ, nối với những nút tương ứng
3472 với những từ đầu tiên trong câu. Ngược lại, nút ``tail'' nằm ở cuối
3473 lưới từ, được nối với những từ cuối cùng trong câu.
3474 Lưới từ chứa tất cả
3475 các từ có khả năng xuất hiện trong câu. Các từ được liên kết với nhau
3476 theo trật tự như trong câu. Khi duyệt từ nút gốc đến nút đích, ta sẽ
3477 được một cách tách từ cho câu. Hình~\vref{fig:wordlattice} thể hiện một
3478 lưới từ.
3480 \begin{figure}[htbp]
3481 \centering
3482 \includegraphics[width=\textwidth]{wordlattice}
3483 \caption{Lưới từ của câu ``Học sinh học sinh học''}
3484 \label{fig:wordlattice}
3485 \end{figure}
3487 Ngoài lưới từ cơ bản như mô tả ở trên, ta có thể mở rộng lưới từ để
3488 chứa thêm những từ có khả năng, phát sinh từ công đoạn phục hồi lỗi,
3489 nhằm xác định xem từ nào là đúng nhất. Lưới từ này gọi là lưới từ mở
3490 rộng (hình~\vref{fig:wordlattice1}).
3492 \begin{figure}[htbp]
3493 \centering
3494 \includegraphics[width=\textwidth]{wordlattice1}
3495 \caption{Lưới từ mở rộng của câu ``Học sinh học sinh học''}
3496 \label{fig:wordlattice1}
3497 \end{figure}
3499 Một dạng khác của lưới từ, gọi là lưới~2-từ (xem
3500 hình~\vref{fig:wordlattice2}). Trong loại lưới từ này,
3501 mỗi nút không phải là một từ mà là hai từ đứng liền nhau. Hai nút nối
3502 liền nhau thì từ bên phải của nút bên trái và từ bên trái của nút bên
3503 phải là một. Nói cách khác, một cặp nút nối với nhau bằng một cạnh
3504 trong lưới từ chỉ có ba từ thay vì bốn từ. Lưới từ loại này dùng để
3505 thể hiện mô hình tri\-gram (trong khi lưới từ bình thường được dùng để
3506 thể hiện bi\-gram). Việc tạo ra lưới 3-từ, lưới 4-từ là có thể. Tuy
3507 nhiên những lưới từ này thường không hiệu quả.
3509 \begin{figure}[htbp]
3510 \centering
3511 \includegraphics[width=\textwidth]{wordlattice2}
3512 \caption{Lưới~2-từ của câu ``Học sinh học sinh học''}
3513 \label{fig:wordlattice2}
3514 \end{figure}
3516 \subsection{Tạo lưới từ}
3517 \label{sub:lattice:creation}
3519 Lưới từ cơ bản được tạo bằng thuật toán Viterbi. Mỗi tiếng trong câu
3520 được duyệt qua để tìm ra tất cả các từ có thể có trong đoạn. Sau đó
3521 tập hợp các từ này lại tạo nên lưới từ.
3523 \begin{algo}\caption{Tạo lưới từ (cơ bản)}
3524 Cho câu S có n tiếng. State là đỉnh, còn ``nút i'' là cạnh. Ta duyệt
3525 lần lượt qua các cạnh để tìm ra các từ. Duyệt i từ 1 đến n:
3526 \begin{itemize}
3527 \item Tạo state gốc cho nút i.
3528 \item Xét các state, nếu tiến thêm được một bước thì lưu lại state mới (i+1).
3529 \item Nếu không tiến được thì xóa state.
3530 \item Nếu hoàn tất một từ thì lưu lại.
3531 \end{itemize}
3532 \end{algo}
3534 Thuật toán tạo lưới~2-từ được nêu trong \cite{Ravishankar}. Thuật toán
3535 sẽ tạo ra lưới $n$-từ từ lưới $n-1$-từ. Lưới từ cơ bản nên trên được
3536 xem như là lưới 1-từ. Thuật toán được tóm tắt lại như trong thuật
3537 toán~\vref{algo:extend-lattice}.
3539 \begin{algo}
3540 \caption{Tạo lưới $n$-từ từ lưới $(n-1)$-từ}
3541 \label{algo:extend-lattice}
3542 \begin{enumerate}
3543 \item Nếu nút ($w$) có $n$ từ đứng liền trước nó ($w_i$),
3544 $i=1,2,\ldots{},n$ trong lưới từ gốc, nó sẽ được lặp lại $n$ lần trong
3545 lưới từ mới, tên là ($w_{i}w$), tương ứng với $i=1,2,\ldots{},n$.
3546 \item Nếu ($w_i$) nối với ($w_j$) trong lưới từ gốc, nối tất cả
3547 ($w_xw_i$) với ($w_iw_j$) $x$ bất kỳ.
3548 \item Giá trị của ($w_iw_j$) là giá trị của cạnh ($w_i$) ($w_j$) trong
3549 lưới từ cũ.
3550 \item Giá trị của cạnh ($w_iw_j$) ($w_jw_k$) là 3-gram của $w_i$, $w_j$
3551 và $w_k$.
3552 \end{enumerate}
3553 \end{algo}
3555 %% Các lưới n-từ có đặc điểm là tăng nhanh số nút và số cạnh, nhưng số
3556 %% tầng vẫn không đổi (Đồ thị càng ngày càng ``mập'', nhưng ``cao''
3557 %% không nổi ;-) )
3562 \subsection{Mở rộng lưới từ --- Phục hồi lỗi}
3563 \label{sec:realword:recover}
3565 Sau khi có lưới từ cơ bản. Ta có thể áp dụng mô hình ngôn ngữ để tìm
3566 ra cách tách từ tốt nhất nếu bài toán là tách từ. Tuy nhiên, do câu
3567 không hoàn toàn chính xác, ta cần phải tiến hành phục hồi lỗi --- thêm
3568 vào những từ có khả năng đúng, sau đó mới có thể tách từ. Phần phục
3569 hồi lỗi, thêm từ vào lưới từ để tạo lưới từ mở rộng là nội dung của
3570 công đoạn này.
3572 Như đã xét ở phần~\vref{sec:nonword:candidate-list}, có 4 loại lỗi chủ
3573 yếu là lỗi bàn phím, lỗi OCR, lỗi nhận dạng tiếng nói, lỗi phát âm (và
3574 các loại lỗi còn lại). Cả bốn loại lỗi này đều có thể gây ra lỗi
3575 real-word. Tuy nhiên, lỗi real-word chủ yếu là lỗi phát âm, lỗi bàn
3576 phím chiếm rất ít, phần còn lại là lỗi OCR và lỗi nhận dạng tiếng
3577 nói. Phần này chủ yếu tập trung vào lỗi phát âm. Lỗi bàn phím được
3578 trình bày trong phần~\vref{sec:nonword:recover:keyboard}.
3580 %% Phần này được sử dụng trong lúc tạo lưới từ và kiểm tra chính
3581 %% tả. Mục đích là, cho trước một từ, phát sinh những từ ``gần giống''
3582 %% với từ đó. Việc định nghĩa như thế nào là ``giống'' ở đây dựa theo các
3583 %% nguyên nhân gây ra lỗi chính tả:
3584 %% \begin{itemize}
3585 %% \item Lỗi phát âm. Ví dụ, ``vu'' và ``du''.
3586 %% \item Do lỗi bàn phím. Có thể do gõ nhầm những phím lân cận. Ví dụ: gõ
3587 %% ``tôi'' thành ``tôu''. Khắc phục lỗi này dựa vào bố trí phím trên
3588 %% bàn phím. Độ đo là khoảng cách từ phím tạo ra ký tự trong từ cho
3589 %% trước và những từ chung quanh. Thông thường lỗi này chỉ xảy ra một
3590 %% lần trong mỗi từ. Ngoài ra còn lỗi liên quan đến cách kiểu gõ tiếng
3591 %% Việt.
3592 %% \item Lỗi OCR\footnote{Optical Character Recognition}. Lỗi dạng này
3593 %% phụ thuộc nhiều vào phông chữ được dùng trên văn bản giấy. Tuy nhiên
3594 %% vẫn có một số lỗi chung như ``a'' và ``c'', ``d'' và ``cl''~\ldots{}
3595 %% \item Lỗi sai về mặt từ vựng, cú pháp. Lỗi này hiện thời không xử lý
3596 %% do cần nhiều tri thức về ngôn ngữ tiếng Việt.
3597 %% \item Lỗi không rõ nguyên nhân. Với dạng lỗi này, ta dùng hàm độ đo,
3598 %% tính số lần thêm/xóa/thay đổi/hoán vị mỗi ký tự giữa hai từ. Hàm độ đo
3599 %% được dùng được nêu trong \cite{Oflazer}, sẽ được trình bày lại bên
3600 %% dưới.
3601 %% \end{itemize}
3603 %% \note{Hmm..} có lẽ nên gắng thêm vào các từ phát sinh một ``hệ số chính
3604 %% xác''. Từ gốc là từ có hệ số chính xác cao hơn so với các từ được phát
3605 %% sinh. Good or bad? Hmmm... Làm sao để làm? Hmmm Hmmm
3607 %%% trường hợp có hai đường đi đến cùng một cạnh và cạnh âm thì sao?
3609 \subsubsection{Lỗi phát âm}
3610 \label{sec:realword:recover:sound}
3612 Lỗi phát âm phụ thuộc vào cách phát âm của từng
3613 vùng. \cite{LoiChinhTa} liệt kê các trường hợp lỗi thông dụng
3614 nhất. Những quy tắc này được áp dụng để tạo ra những từ gần giống phát
3615 âm.
3616 %%% Nêu tổng quan, nói cụ thể hơn ở phần sau ``previous work''
3617 Theo~\cite{LoiChinhTa}, lỗi bao gồm các loại sau:
3618 \begin{itemize}
3619 \item Lỗi thanh điệu. Chủ yếu là lỗi nhầm lẫn hai thanh hỏi, ngã.
3620 \item Lỗi về âm đầu. Thường lẫn lộn các âm đầu sau: C/K, G/Gh, Ng/Ngh,
3621 Ch/Tr, S/X, V/D/Gi/R, W/Hw/Ngw/Qu.
3622 \item Lỗi về âm chính. Thường lẫn lộn các âm chính sau: ai/ay/ây,
3623 ao/au/âu, ăm/âm, ăp/âp, iu/iêu/êu, im/iêm/em, ip/iêp/êp/ep,
3624 oi/ôi/ơi, om/ôm/ơm, op/ôp/ơp, ong/ông, oc/ôc, ui/uôi, um/uôm, up/(uôp),
3625 ưi/ươi, ưu/ươu, ưm/ươm, (ưp)/ươp.
3626 \item Lỗi về âm cuối. Thường lẫn lộn chữ ghi các âm cuối trong các vần
3627 sau:
3628 an/ang, at/ac, ăn/ăng, ăt/ăc, ân/âng, ât/âc, en/eng, et/ec, ên/ênh,
3629 êt/êch, in/inh, it/ich, iên/iêng, iêt/iêc, ơn/(ơng), ơt/(ơc),
3630 un/ung, ut/uc, uôn/uông, uôt/uôc, ưn/ưng, ưt/ưc, ươn/ương, ươt/ươc.
3631 \item Sai quy cách viết hoa
3632 \end{itemize}
3635 %%\subsubsection{Lỗi không rõ nguyên nhân}
3636 %%XXX
3637 %% Lỗi này dựa vào {\em độ đo khoảng cách hiệu chỉnh} được đề cập
3638 %% trong \cite{Oflazer}. Các thao tác hiệu chỉnh được đo gồm {\em chèn,
3639 %% xóa, thay thế một ký tự} hoặc {\em hoán vị hai ký tự kề nhau}, để có
3640 %% thể chuyển đổi từ này thành từ kia. Đặt $X = x_1, x_2, \ldots{}, x_m$ và
3641 %% $Y = y_1,y_2,\ldots{},y_n$ là hai chuỗi có độ dài tương ứng là $m$ và
3642 %% $n$. $X[i]\quad(Y[j])$ biểu diễn chuỗi con ban đầu của X (Y) từ đầu từ
3643 %% đến ký tự thứ $j$. Cho $X$ và $Y$, độ đo $ed(X[m],Y[n])$ được tính như
3644 %% sau:
3645 %% \begin{equation}
3646 %% \begin{array}{rll}
3647 %% ed(X[i+1],Y[j+1]) &= ed(X[i],Y[j]) & \text{nếu $x_{i+1}=y_{j+1}$
3648 %% (ký tự cuối như nhau)}\\
3649 %% &= 1+min\{ed(X[i-1],Y[j-1]), & \text{nếu $x_i=y_{j+1}$}\\
3650 %% &\qquad\qquad ed(X[i+1],Y[j]), & \text{và $x_{i+1}=y_j$}\\
3651 %% &\qquad\qquad ed(X[i],Y[j+1])\}\\o
3652 %% &= 1+min\{ed(X[i],Y[j]),&\text{trường hợp khác}\\
3653 %% &\qquad\qquad ed(X[i+1],Y[j]),\\
3654 %% &\qquad\qquad ed(X[i],Y[j+1])\}\\
3655 %% ed(X[0],Y[j]) &=j & 0 \le j \le n\\
3656 %% ed(X[i],Y[j]) &=i & 0 \le i \le n\\\\
3657 %% ed(X[-1],Y[j]) &=ed(X[i],Y[-1]) = max(m,n)&\text{Biên}
3658 %% \end{array}
3659 %% \end{equation}
3661 %% Thuật toán có thể được khử đệ quy khi cài đặt bằng quy hoạch
3662 %% động. Nhận thấy $ed(X[i+1],Y[i+1])$ cần dùng
3663 %% $ed(X[i],Y[i])$,$ed(X[i-1],Y[i-1])$,$ed(X[i],Y[i+1])$ hoặc
3664 %% $ed(X[i+1],Y[i])$, ta có thể tính từ lần lượt từ thấp đến cao theo
3665 %% đường zig-zag bắt đầu từ đỉnh (1,1), sau đó đến đường chéo phụ (1,2),
3666 %% (2,1), rồi đường chéo (1,3),(2,2),(3,1)~\ldots{}
3668 %% \begin{algo}\caption{Tính hàm $ed$}
3669 %% \label{algo:ed}
3670 %% \begin{enumerate}
3671 %% \item Đặt (0,0) là 0 nếu x[0] = y[0] hoặc 1 nếu ngược lại.
3672 %% \item Đặt (0,j) là j
3673 %% \item Đặt (i,0) là i
3674 %% \item (i,j)=(i-1,j-1) nếu x[i]=y[j]
3675 %% \item (i,j)=1+min\{(i-2,j-2),(i,j-1),(i-1,j)\} nếu x[i] = y[j-1]
3676 %% hoặc x[i-1]=y[j]
3677 %% \item (i,j)=1+min\{(i-1,j-1),(i,j-1),(i-1,j)\} trong các trường hợp còn lại
3678 %% \end{enumerate}
3679 %% \end{algo}
3681 %% Ví dụ: tính độ sai khác giữa chữ ``thắng'' và ``tắgn''. Ta tính các
3682 %% giá trị như bảng~\vref{tab:ed-example}. Vậy có hai khác biệt giữa hai
3683 %% chữ. Khác biệt thứ nhất là xoá ký tự `h'. Khác biệt thứ hai là hoán vị
3684 %% hay ký tự `n' và `g'.
3686 %% \begin{table}[htbp]
3687 %% \centering
3688 %% \begin{tabular}{|c|c|c|c|c|c|c|}
3689 %% \hline
3690 %% X&-&-&t&ắ&g&n\\\hline
3691 %% -&0&0&0&0&0&0\\\hline
3692 %% -&0&0&1&2&3&4\\\hline
3693 %% t&0&1&\bf 0&\bf 1&\bf 2&\bf 3\\\hline
3694 %% h&0&2&\bf 1&\bf 1&\bf 2&\bf 3\\\hline
3695 %% ắ&0&3&\bf 2&\bf 1&\bf 1&\bf 2\\\hline
3696 %% n&0&4&\bf 3&\bf 2&\bf 2&\bf 1\\\hline
3697 %% g&0&5&\bf 4&\bf 3&\bf 2&\bf 2\\\hline
3698 %% \end{tabular}
3699 %% \caption{Bảng $ed$ của ``thắng'' và ``tắgn''}
3700 %% \label{tab:ed-example}
3701 %% \end{table}
3703 \subsubsection{Phân tích âm tiết}
3704 \label{sec:realword:syllable}
3706 Để phát sinh từ dựa trên lỗi phát âm, cần phân tích cấu trúc của từng
3707 tiếng. Một tiếng bao gồm âm đầu, vần và thanh. Vần gồm âm đệm, âm
3708 chính và âm cuối. Trong các thành phần của tiếng, âm chính là bắt buộc
3709 phải có. Các thành phần còn lại có thể không có. Ta có thể biểu diễn
3710 cấu trúc âm tiếng theo sơ đồ trạng thái như hình~\vref{fig:syllable}.
3712 \begin{figure}[htbp]
3713 \centering
3714 \includegraphics[width=\textwidth]{syllable}
3715 \caption{Sơ đồ trạng thái phân tích cấu trúc tiếng}
3716 \label{fig:syllable}
3717 \end{figure}
3719 Ta có thể phân tích tiếng dùng FST. Tuy nhiên, qua
3720 hình~\vref{fig:syllable} có thể thấy chỉ có tám cách để hình thành
3721 tiếng. Cài đặt theo tám cách này đơn giản và hiệu quả hơn dùng FST
3722 tổng quát.
3723 %Việc sắp xếp thứ tự áp dụng từng cách và một số heuristic
3724 %sẽ giúp loại bỏ nhập nhằng khi phân tích tiếng.
3725 \begin{algo}\caption{Phân tích cấu trúc âm tiết}
3726 Kiểm tra mẫu A, bao gồm việc phân tích âm tiết theo mẫu A. Nếu âm
3727 tiết có thể phân tích theo mẫu A và không vi phạm các quy luật phân
3728 bố thì chấp nhận âm tiết, dừng thuật toán.
3729 \begin{enumerate}
3730 \item Kiểm tra mẫu ``Âm đầu, âm chính, âm cuối''.
3731 \item Kiểm tra mẫu ``Âm chính, âm cuối''.
3732 \item Kiểm tra mẫu ``Âm đầu, âm chính''.
3733 \item Kiểm tra mẫu ``Âm chính''.
3734 \item Kiểm tra mẫu ``Âm đầu, âm đệm, âm chính, âm cuối''.
3735 \item Kiểm tra mẫu ``Âm đệm, âm chính, âm cuối''.
3736 \item Kiểm tra mẫu ``Âm đầu, âm đệm, âm chính''.
3737 \item Kiểm tra mẫu ``Âm đệm, âm chính''.
3738 \item Không thể phân tích âm tiết. Dừng.
3739 \end{enumerate}
3740 \end{algo}
3742 Khi phân tích tiếng, có thể có một số nhập nhằng giữa các thành phần
3743 của tiếng. Ví dụ, ``lúa'' bao gồm âm đôi ``ua'' hay âm đệm ``u'' và âm
3744 chính ``a''? Những âm có thể gây nhập nhằng xuất phát từ việc âm `u'
3745 và `o' có thể vừa là âm đệm, vừa là âm chính, bao gồm các âm ``uô'',
3746 ``ua''. Ngoài ra còn có nhập nhằng giữa âm chính và âm cuối, bao gồm
3747 ``ui'', ``uy'', ``oi''. Cuối cùng là trường hợp ``qu''. Hầu hết các
3748 nhập nhằng này được loại bỏ bằng thứ tự áp dụng các mẫu âm tiết (ưu
3749 tiên xét các trường hợp không có âm đệm trước). Hai
3750 trường hợp cần được xử lý đặc biệt là ``uy'' và ``qu''.
3752 Nếu chỉ sử dụng những luật này, sẽ có nhiều tiếng phân tích được,
3753 nhưng thực tế không tồn tại. Ví dụ, ``cỳ'', ``kông''~\ldots{} Tuy
3754 nhiên cách phân tích này vẫn chấp nhận được. Những tiếng sai như vậy
3755 sẽ được phát hiện và sửa chữa trong phần bắt lỗi non-word.
3756 %% Các quy
3757 %% luật phân bố âm tiết được sử dụng để giải quyết những trường hợp
3758 %% này. Cụ thể ba luật sau được sử dụng:
3759 %% \begin{itemize}
3760 %% \item Âm cuối i chỉ đứng trước các âm ``ư, ươ, ơ, â, a, ă, u, uô, ô,
3761 %% o''.
3762 %% \item Âm cuối u chỉ đứng trước các âm ``i, iê, ê, e, ư, ươ, ơ, â, a,
3763 %% ă''.
3764 %% \item Âm đệm không đứng trước các âm ``u, uô, ô, o''.
3765 %% \end{itemize}
3768 \subsection{Hoàn chỉnh lưới từ}
3769 \label{sec:lattice:competion}
3771 Sau khi tạo lưới từ mở rộng, cần bảo đảm có thể tìm được một cách tách
3772 từ từ từ đầu tiên cho đến từ cuối cùng và mọi cách tách từ đều kết thúc
3773 ở từ cuối cùng trong câu. Nói cách khác, phải đảm bảo luôn tìm được
3774 đường đi từ bất kỳ đỉnh nào trên đồ thị đến đỉnh của các từ kết thúc câu.
3775 Do từ điển bị giới hạn, có khả năng lưới từ thiếu một vài cạnh làm đồ
3776 thị không còn liên thông. Bước này thêm vào các đỉnh để bảo đảm đồ thị
3777 liên thông. Lưới từ sẽ được duyệt lại, tìm những nơi không liên thông,
3778 thêm vào các đỉnh (mã ``UNK'') để đảm bảo tính liên thông.
3780 \subsection{Áp dụng mô hình ngôn ngữ --- Tách từ}
3782 %\section{Tách từ}
3783 \label{sec:language-model}
3785 Phần này sử dụng mô hình ngôn ngữ n\-gram để đánh giá các cách tách từ,
3786 từ đó đưa ra cách tách từ tốt nhất. Dựa theo cấu trúc lưới từ, một
3787 cách tách từ chính là đường đi từ nút head đến nút tail. Ta có thể
3788 tiến hành việc lượng giá bằng cách duyệt đồ thị theo chiều sâu, tìm
3789 mọi cách tách từ. Với mỗi cách tách từ tìm được, mô hình ngôn ngữ sẽ
3790 được áp dụng để tính giá trị của cách tách từ đó.
3792 Cách trên đơn giản, nhưng không hiệu quả. Với bài toán tách từ bình
3793 thường (không tách từ mờ), số phân nhánh trong đồ thị không nhiều, mô
3794 hình này có thể áp dụng được. Tuy nhiên, với các câu dài phương pháp
3795 này trở nên không hiệu quả vì số lượng các cách tách từ tăng rất
3796 nhanh. Hãy xét một trường hợp cực đoan, một câu dài 86 chữ: ``\textit{Đó là trả
3797 lời của Bộ Ngoại giao nước ta tại cuộc họp báo thường kỳ ngày hôm qua trước
3798 câu hỏi của một số phóng viên nước ngoài về phản ứng của Việt Nam đối
3799 với việc Ủy ban về Tự do Tôn giáo Quốc tế của Hoa Kỳ tổ chức điều trần
3800 vấn đề tôn giáo Việt Nam và việc một số tổ chức tôn giáo hải ngoại kêu
3801 gọi trì hoãn việc phê chuẩn Hiệp định Thương mại song phương với Việt
3802 Nam}''. Đây là một câu trích từ một tin tức thời sự. Khi đọc lướt qua câu
3803 này, ta không cảm nhận được độ dài của nó. Những câu loại này không
3804 phải hiếm gặp trong các văn bản hành chính. Câu này có $76101451776 \approx 76\cdot 10^9$ cách
3805 tách từ khác nhau ($842851528992620544 \approx 842\cdot 10^{15}$ nếu tách từ mờ), dẫn đến
3806 việc tính giá trị của từng cách tách từ một là điều không thực tế.
3808 Thật ra, đối với bài toán tách từ thông thường, ta có thể phân tách
3809 câu trên thành từng đoạn ngắn hơn, do có một số từ trong câu hoàn toàn
3810 không nhập nhằng trong tách từ. Những từ như thế được biểu diễn trên
3811 lưới từ là những điểm thắt nút. Nhờ những điểm này, ta có thể tách
3812 câu ra thành từng đoạn ngắn hơn và xử lý từng đoạn độc lập. Cách này
3813 tùy thuộc vào loại mô hình ngôn ngữ được áp dụng. Với mô hình uni\-gram,
3814 có thể áp dụng cách này. Với mô hình bi\-gram hoặc cao hơn, ta cần tìm
3815 những nút có điều kiện khắt khe hơn. Cụ thể với bi\-gram, ta cần tìm ra
3816 một cặp nút thắt thì vì chỉ cần một nút. Như vậy, việc sử dụng mô hình
3817 bi\-gram hay tri\-gram, để có được mô hình ngôn ngữ hiệu quả hơn, sẽ làm
3818 giảm đi số phân đoạn trong câu, làm tăng thời gian xử lý.
3820 Bài toán tách từ mờ lại càng khó khăn hơn. Do kết quả của việc phục
3821 hồi lỗi, số nút trong lưới từ tăng rất nhiều, hậu quả là các nút có
3822 thể dùng để phân đoạn giảm đáng kể, hầu như không còn. Do vậy cải tiến
3823 trên coi nhưng không thể phát huy tác dụng.
3825 Cải tiến trên dùng nguyên tắc quy hoạch động để cải tiến. Điều đó dẫn
3826 đến suy nghĩ tại sao không tận dụng quy hoạch động triệt để hơn? Thật
3827 sự, ta có thể áp dụng thuật toán Viterbi để giải quyết bài toán
3828 này. Thuật toán Viterbi đã được áp dụng thành công trong những bài
3829 toán tìm kiếm tương tự trong lĩnh vực nhận dạng tiếng nói.
3831 Thuật toán Viterbi có thể hoạt động, nhưng không tận dụng triệt để ưu
3832 điểm của lưới từ. Do mô hình ngôn ngữ được sử dụng là n\-gram, ta sẽ
3833 dùng mô hình bi\-gram. Do mỗi nút đại diện cho một từ, cạnh nối giữa hai
3834 từ có thể đại diện cho xác suất bi\-gram $logP(w_2|w_1)$, việc tính mô
3835 hình ngôn ngữ cho một cách tách từ:
3836 \begin{align*}
3837 P(w_1\ldots w_n)&= P(w_1|head)\prod_{i=2}^nP(w_i|w_{i-1})P(tail|w_n)\\
3838 logP(w_1\ldots w_n)&= log(P(w_1|head)\prod_{i=2}^nP(w_i|w_{i-1})P(tail|w_n)\\
3839 &=P(w_1|head)+\sum_{i=2}^nP(w_i|w_{i-1})+P(tail|w_n)
3840 \end{align*}
3842 Với cách tính này, việc tính $logP(w_1\ldots w_n)$ tương đương với giá
3843 trị đường đi từ head đến tail (cạnh head đến nút của từ đầu tiên là
3844 $P(w_1|head)$, còn cạnh từ nút của từ cuối cùng đến tail là
3845 $P(tail|w_n)$). Việc tính $maxP$ tương đương với $minlogP$, cũng là
3846 tìm đướng đi ngắn nhất từ head đến tail. Bài toán cuối cùng quy về bài
3847 toán tìm đường đi ngắn nhất trong đồ thị có hướng, có trọng số.
3849 Thuật toán tìm đường đi ngắn nhất được dùng ở đây là thuật toán tìm
3850 kiếm theo độ ưu tiên PFS\footnote{Priority-First Search --- PFS} để tìm
3851 đường đi ngắn nhất trên đồ thị. Khoảng cách giữa hai
3852 điểm trong đồ thị là xác suất bi\-gram của hai từ. Bài toán tìm đường
3853 đi ngắn nhất, có thể áp dụng PFS, Prime, Djisktra. PFS được chọn vì
3854 lưới từ, qua khảo sát, có thể được coi là một đồ thị thưa.
3856 Cách trên được áp dụng cho bi\-gram, không thể áp dụng cho tri\-gram do
3857 giả định dùng trọng số của cạnh là xác suất bi\-gram, bi\-gram là xác suất
3858 giữa hai từ liên tiếp, trong khi tri\-gram là xác suất giữa ba từ liên
3859 tiếp. Để áp dụng tri\-gram thay vì bi\-gram, ta sẽ sử dụng lưới~2-từ. Sau
3860 đó áp dụng thuật toán PFS cho đồ thị mới vì mỗi nút trong lưới~2-từ
3861 thực chất bao gồm 3 từ liên tiếp nhau.
3863 Cách làm này không thể thực hiện với n\-gram ($n > 3$) vì khi đó số
3864 nút/cạnh trong đồ thị sẽ tăng đáng kể. Ngoài ra, PFS cũng không áp
3865 dụng được trong trường hợp sử dụng những độ đo như đo số lỗi sai đã
3866 xảy ra~\ldots{} Trong trường hợp đó ta nên sử dụng thuật toán
3867 Viterbi.
3869 %% XXXX. Nếu WFST cộng viterbi, beam pruning \ldots{} thì sao nhỉ?
3871 \subsection{Tìm lỗi chính tả}
3872 \label{sec:realword:spelling-checking}
3874 Sau khi tách từ xong, việc bắt lỗi chính tả cũng giống như phần bắt
3875 lỗi chính tả non-word~(\vref{sec:nonword:spelling-checking}).
3877 \subsection{Lập danh sách từ đề nghị}
3878 \label{sec:realword:candidate-list}
3880 Việc lập danh sách từ đề nghị tương tự như lập danh sách từ đề nghị
3881 khi bắt lỗi non-word~(\vref{sec:nonword:candidate-list}). Tuy nhiên, ta
3882 sẽ sử dụng từ điển thay vì dùng từ điển tiếng.
3884 Việc phục hồi lỗi trong bước này là không cần thiết vì đã được thực
3885 hiện trong phần tách từ.
3887 %% Do tiếng Việt đọc sao ghi vậy,
3888 %% nên bước chuyển từ từ sang âm có thể bỏ qua. Bước còn lại là áp dụng
3889 %% thuật toán đo độ hiệu chỉnh giữa hai từ như đã nêu trong~\vref{algo:ed}
3890 %% Ta có thể so sánh từng ký tự, hoặc so sánh theo âm (ví dụ, ``th'' thay
3891 %% vì ``t'' và ``h'').
3893 %% Chương trình sẽ liệt kê XXXX (chọn theo tiêu chí nào?, 10 từ lớn nhất
3894 %% hay sao đây)
3896 %% XXXX. thuật toán tính ed.
3900 \subsection{Sắp xếp danh sách từ đề nghị}
3901 \label{sec:realword:sort-candidates}
3903 Trong phần tách từ, ta đã xác định được cách tách từ đúng nhất nhờ áp
3904 dụng mô hình ngôn ngữ. Áp dụng mô hình ngôn ngữ giúp ta chọn được câu
3905 hợp lý nhất trong số các câu có thể hình thành từ lưới từ, việc tìm ra
3906 ranh giới từ chỉ là hiệu ứng phụ. Do đã chọn được câu hợp lý nhất nên
3907 từ đúng nhất chính là từ nằm trong câu được chọn này. Do đó, từ nằm
3908 trên câu được chọn cần được ưu tiên sắp ở đầu danh sách từ đề
3909 nghị. Những từ còn lại có thể được sắp xếp như trong
3910 phần~\vref{sec:nonword:sort-candidates}.
3912 \subsection{Các heuristic để cải thiện độ chính xác}
3914 \subsubsection{Phân biệt từ gốc và từ phát sinh}
3916 Với lưới từ hiện có, ta coi từ gốc và những từ phát sinh là như
3917 nhau. Tuy nhiên, trên thực tế ta thường ưu tiên chọn từ gốc hơn là các
3918 từ phát sinh, do số lỗi trong câu chỉ chiếm một tỉ lệ nhỏ, phần còn
3919 lại là các từ đúng. Việc đánh đồng hai loại từ này làm cho chương
3920 trình dễ có khuynh hướng sử dụng từ phát sinh không giới hạn chừng
3921 nào những từ này còn tạo ra một câu hợp lý. Tiếng Việt có số lượng
3922 từ hạn chế hơn so với tiếng Anh (do đặc điểm ngôn ngữ đơn lập, hình
3923 thái từ nằm ngoài từ, nên số lượng từ giảm xuống), những câu phát sinh
3924 nghe có vẻ hợp lý cũng nhiều hơn. Nếu không khống chế số lượng từ phát
3925 sinh được sử dụng thì khả năng chọn nhầm câu đúng sẽ cao hơn.
3927 Vấn đề đầu tiên có thể được giải quyết bằng cách tăng giá trị các
3928 cạnh nối đến từ phát sinh một tỉ lệ nhất định để phản ánh sự khác
3929 biệt. Ví dụ, trong hình~\vref{fig:wordlattice1}, ta có thể biến đổi
3930 giá trị các cạnh nối đến từ ``xinh'' bằng cách tăng 0,2\% giá trị của
3931 các cạnh nối đến từ ``xinh'' đó. Vậy, bất cứ cách tách từ nào chứa từ
3932 xinh cũng sẽ bị tăng một khoảng giá trị nhất định, so với các cách
3933 tách từ chứa từ ``sinh'' vẫn giữa nguyên giá trị gốc. Nhờ vậy, từ gốc
3934 sẽ được ưu tiên hơn các từ phát sinh.
3936 Cách này nói chung hạn chế việc sử dụng từ phát sinh, tăng khả năng sử
3937 dụng từ gốc. Việc điều chỉnh tỉ lệ tăng cho từ phát sinh cần phải được
3938 xem xét cẩn thận. Việc tăng quá nhiều sẽ làm cho chương trình bám lấy
3939 từ gốc, giảm khả năng phát hiện lỗi. Nhưng nếu không tăng thì chương
3940 trình có khả năng tìm nhầm câu đúng, dẫn đến sai lầm dây chuyền trong
3941 các bước tiếp theo.
3943 Trên nguyên tắc, độ giảm của các cạnh nên phụ thuộc vào khả năng xuất
3944 hiện của các từ phát sinh. Những từ phát sinh có khả năng nhất sẽ ít
3945 bị giảm nhất, những từ hiếm gặp nhất sẽ bị giảm nhiều nhất. Việc này
3946 sẽ giúp hạn chế lỗi chọn sai từ của mô hình ngôn ngữ. Tuy nhiên các
3947 thông số về khả năng xuất hiện của các từ phát sinh đòi hỏi phải có ngữ
3948 liệu sai trong thực tế và ngữ liệu đúng tương ứng để rút trích thông
3949 tin này. Đây là một hướng phát triển trong tương lai.
3952 \subsubsection{Chuẩn hoá độ dài câu}
3954 Do mô hình ngôn ngữ được tính toán dựa trên tổng giá trị của các
3955 cạnh, nên các câu có ít từ hơn (ít cạnh hơn) thường có xu hướng được
3956 chọn vì tổng giá trị sẽ nhỏ hơn. Do đó cần có một cách để chuẩn hoá độ
3957 dài câu, loại bỏ sự ảnh hưởng về số lượng từ trong câu lên giá trị của
3958 câu.
3960 Việc chuẩn hóa có thể được thực hiện bằng cách lấy giá trị của câu
3961 chia cho số lượng từ trong câu.
3962 Nếu ta sử dụng Viterbi hay
3963 WFST thì chỉ cần chuẩn hoá giá trị mỗi lần duyệt nút kế. Khi áp dụng
3964 đồ thị để giải quyết, ta không thể làm như vậy vì giá trị các cạnh
3965 được ngầm định là không thay đổi, và công thức tính độ dài đường đi là
3966 tổng các cạnh, cũng không thay đổi. Tuy nhiên ta có thể khắc phục bằng
3967 cách thay đổi giá trị của các cạnh {\em chưa được xét}. Việc thay đổi
3968 giá trị các cạnh chưa được xét sẽ không ảnh hưởng đến tính đúng đắn
3969 của thuật toán, vì thuật toán tính toán đường đi ngắn nhất dựa vào các
3970 cạnh đã xét. Nếu ta không thay đổi giá trị các cạnh đã xét, thuật toán
3971 vẫn không đổi.
3973 Giả sử có một đường đi qua $n$ cạnh $e_1,e_2,\ldots,e_n$, giá trị
3974 đường đi qua các cạnh đó là $\sum_{i=1}^{n}e_i$. Nếu được chuẩn hóa,
3975 giá trị mới sẽ là $\frac{1}{n}\sum_{i=1}^{n}e_i$.
3976 %% \begin{align*}
3977 %% \Delta&=\sum_{i=1}^{n}e_i-\frac{1}{n}\sum_{i=1}^{n}e_i\\
3978 %% &=\frac{n-1}{n}\sum_{i=1}^{n}e_i\\
3979 %% \frac{1}{n}\sum_{i=1}^{n}e_i&=\sum_{i=1}^{n}e_i-\Delta\\
3980 %% &=\sum_{i=1}^{n}e_i-\frac{n-1}{n}\sum_{i=1}^{n}e_i\\
3981 %% &=\sum_{i=1}^{n}(e_i-\frac{n-1}{n}e_i)\\
3982 %% &=\sum_{i=1}^{n}\frac{1}{n}e_i
3983 %% \end{align*}
3984 Do $$\frac{1}{n}\sum_{i=1}^{n}e_i=\sum_{i=1}^{n}\frac{1}{n}e_i$$ ta
3985 thấy mỗi cạnh cần phải ``co'' lại còn một khoảng $\frac{1}{n}$ (hay
3986 nói cách khác, mất đi $\frac{n-1}{n}$) giá trị
3987 thực của chính nó. Các cạnh cứ co lại từ từ mỗi khi thêm vào một cạnh
3988 mới. Tuy nhiên, do các cạnh đã xét sẽ không thể thay đổi, nên ta sẽ
3989 gom tất cả các khoảng giá trị mất đi này trừ vào cạnh sẽ được xét.
3991 Giả sử đã có $n$ cạnh, ta cần thêm cạnh $e_{n+1}$ vào. Độ dài $n$ cạnh
3992 trước đó là $N$ (đã chuẩn hoá). Ta cần tính $N'$ là độ dài $n+1$ cạnh đã
3993 chuẩn hoá
3994 \begin{align*}
3995 \Delta&=N'-N\\
3996 &=\frac{Nn+e_{n+1}}{n+1}-N\\
3997 &=\frac{e_{n+1}-N}{n+1}\\
3998 N'&=N+\Delta
3999 \end{align*}
4001 Ta có thể coi cạnh mới, cần được thêm vào là cạnh có giá trị là
4002 $\Delta=\frac{e_{n+1}-N}{n+1}$ thay vì $e_{n+1}$ như ban đầu. Tuy
4003 nhiên, do $\Delta$ có thể âm, cần dùng những thuật toán có thể tìm
4004 đường đi trên đồ thị có trọng số âm như Bellman-Ford thay vì dùng
4005 PFS. Có thể hình dung đồ thị mới là một loại đồ thị động, các cạnh
4006 phía sau càng ngày càng bị thu ngắn lại.
4008 Một vấn đề cần quan tâm là, liệu thuật toán Bellman-Ford có còn đúng
4009 với một đồ thị động như vậy hay không? Giả sử ta tính được giá trị
4010 cạnh khi dựa trên đường đi ngắn nhất phía trước nó là A1. Sau đó, vì
4011 một lí do nào đó, đường đi ngắn nhất tới điểm đó bị đổi sang A2, dẫn
4012 đến giá trị cạnh đã tính không còn hợp lệ. Với một đồ thị tổng quát, thuật
4013 toán có thể không còn chính xác. Tuy nhiên với đồ thị DAG của lưới từ,
4014 điều này vẫn còn đúng. Trong DAG, ta có thể xác định được tập các nút
4015 cha của một nút nào đó (những nút nối đến nút đó), tách rời hoàn toàn
4016 với phần còn lại của đồ thị. Do đó ta có thể tìm đường đi lớn nhất chỉ
4017 trong tập con đó mà thôi. Sau khi tìm được đường đi ngắn nhất trong
4018 tập con này, coi như đường đi đã ổn định và không thay đổi nữa, vì vậy
4019 việc tính giá trị cạnh kế tiếp sẽ không bị thay đổi sau mỗi lần tính
4020 toán. Vì lí do này nên thuật toán sẽ phải duyệt thứ tự các điểm theo
4021 thứ tự tôpô chứ không thể duyệt theo một thứ tự ngẫu nhiên.
4025 \subsubsection{Từ phát sinh phụ thuộc ngữ cảnh từ gốc}
4027 Mô hình hiện tại phát sinh từ cho mọi từ trong câu. Thực tế khi đọc
4028 một câu, ta thường coi như mọi từ đều đúng. Ta chỉ ``phát sinh từ'' ở
4029 những chỗ có vấn đề trong câu (thường là do từ không phù hợp với ý
4030 nghĩa của câu hoặc của đoạn văn). Ta có thể áp dụng ý tưởng này để
4031 biến đổi lưới từ nhằm hạn chế những lỗi tìm nhầm câu đúng.
4033 Cách tiếp cận ở đây là tăng giá trị cạnh nối đến những từ phát sinh từ
4034 những từ gốc ``có vấn đề''. Từ gốc càng có vấn đề thì tỉ lệ tăng càng
4035 thấp. Từ gốc càng ít có vấn đề thì tỉ lệ tăng càng cao nhằm giảm khả
4036 năng sử dụng từ phát sinh của từ này. Độ đo vấn đề là ngram của liên
4037 quan đến các tiếng của từ gốc trong câu. Với bigram, độ đo này là
4038 trung bình xác suất của hai bigram nối với tiếng. Với trigram, độ đo
4039 này là trung bình xác suất của ba trigram nối với tiếng đó. Độ đo vấn
4040 đề của từ là tổng độ đo của các tiếng thuộc từ đó.
4042 Với cách làm này, các từ phát sinh sẽ không được đánh giá ngang nhau
4043 nữa. Những từ phát sinh từ những từ gốc có ít khả năng gặp lỗi sẽ bị
4044 tăng với một tỉ lệ nhất định, so với những từ phát sinh từ từ gốc có
4045 nhiều khả năng xảy ra lỗi. Việc này giúp giảm khả năng tìm nhầm câu
4046 đúng.
4049 \section{Huấn luyện}
4050 \label{sec:training}
4052 Do chương trình cần một số tham số như thống kê tần số xuất hiện của
4053 từ, mô hình ngôn ngữ bi\-gram, tri\-gram~\ldots nên ta cần phải thu thập
4054 các tham số này. Đối với tiếng Anh, việc này tương đối dễ dàng. Tuy
4055 nhiên, do không thể xác định ranh giới từ tiếng Việt, ta cần phải sử
4056 dụng một bộ tách từ trước khi huấn luyện. Chương trình sử dụng một tập
4057 ngữ liệu đã tách từ sẵn dựa trên~\cite{smt}. Tuy nhiên, mô hình ngôn
4058 ngữ đòi hỏi ngữ liệu huấn luyện càng lớn càng tốt. Do vậy chương trình
4059 tự tạo thêm ngữ liệu huấn luyện thêm ngữ liệu dựa thô chưa tách từ.
4061 Đối với tiếng Việt, đã có một số nghiên cứu về tách từ tiếng Việt,
4062 tiêu biểu là~\cite{Tachtu,Tachtu2}. Chương trình này không sử dụng bộ tách từ
4063 hiện có vì các lý do sau:
4064 \begin{itemize}
4065 \item Bộ tách từ trong~\cite{Tachtu,Tachtu2} sử dụng uni\-gram. Trên lý thuyết,
4066 bi\-gram/tri\-gram tốt hơn uni\-gram do chứa đựng thông tin về ngữ cảnh.
4067 \item Do bộ tách từ thống kê thường phụ thuộc vào ngữ liệu, nếu sử
4068 dụng một bộ tách từ trên lĩnh vực khác với lĩnh vực được huấn luyện
4069 cho trình bắt lỗi chính tả, kết quả sẽ không như mong đợi.
4070 \item Cách tách từ được đề nghị tạo ra mô hình ngôn ngữ tốt hơn so với
4071 cách sử dụng bộ tách từ rồi thống kê trên đó (sẽ giải thích chi tiết
4072 bên dưới)
4073 \end{itemize}
4075 \subsection{Huấn luyện mô hình ngôn ngữ}
4077 Như đã nói, tính toán mô hình ngôn ngữ cần phải tách từ. Trong phần
4078 bắt lỗi real-word, ta đã thực hiện được phần tách từ mờ. Do dữ liệu
4079 huấn luyện được xem là chính xác nên chỉ cần tách từ bình thường. Do
4080 đó ta sẽ bỏ qua phần Tạo lưới từ mở rộng, giữ nguyên lưới từ cơ
4081 bản, và phần bắt lỗi non-word. Tóm lại, các bước thực hiện gồm khối
4082 tiền xử lý, theo sau là các bước Tạo lưới từ và Tách từ. Trong phần
4083 tách từ, ta chỉ cần dùng PFS thay vì Bellman-Ford vì lưới từ không có
4084 trọng số âm.
4086 %% Tiền xử lý giống như phần~\vref{sub:preprocess}
4087 %% Tạo Lưới từ giống như phần~\vref{sub:lattice}, nhưng chỉ xét những từ nào thực sự
4088 %% có trong câu, sử dụng lưới từ thay vì lưới từ mở rộng.
4090 Nếu dùng PFS để tách từ, ta chỉ có 1 cách tách từ tốt nhất. Việc đếm
4091 từ sẽ dựa trên cách tách từ này. Cách này cho kết quả tương tự như bộ
4092 tách từ rời, trừ việc áp dụng bi\-gram/tri\-gram thay cho uni\-gram. Đối với
4093 đồ thị có trọng số âm, thuật toán Bellman-Ford sẽ được sử dụng thay
4094 cho PFS.
4096 Thay vì chỉ sử dụng một cách tách từ, ta có thể thống kê trên nhiều
4097 cách tách từ của cùng một câu. Cách này phản ánh
4098 giá trị của các từ chính xác hơn. Ví dụ, ta có 3 cách tách từ với xác
4099 suất các cách tách từ tương ứng lần lượt là 0,5, 0,40,1. Cách chỉ
4100 dùng cách tách từ tốt nhất sẽ chỉ tính những từ trong cách tách từ
4101 đầu, với giá trị mỗi từ là 1,0.
4102 %Cách tính này ``dồn phiếu'' của 2 cách sau cho cách đầu.
4103 Trường hợp sau, các từ trong cách 23 vẫn được
4104 tính. Số đếm của mỗi từ không còn là 1, mà là xác suất của cách tách
4105 từ chứa từ đó. Trở lại ví dụ cũ, các từ trong cách một sẽ được cộng thêm
4106 0,5 thay vì 1. Ngoài ra các từ trong cách 23 lần lượt được cộng
4107 0,40,1. Dễ thấy, các từ trong cách tách từ thấp sẽ không tăng số
4108 đếm đáng kể, do đó không thể gây ảnh hưởng lớn đến quyết định tách
4109 từ.
4110 Cách cộng dồn số như vậy được gọi là ``fractional count'' (hay
4111 trong~\cite{softcount} gọi là ``soft-count''). Do bộ tách từ rời chỉ
4112 trả về cách tách từ tốt nhất, nên ta không thể áp dụng fractional
4113 count dựa trên bộ tách từ rời. Đó là một trong những lý do không sử
4114 dụng bộ tách từ rời.
4116 Thay vì tính trên mọi cách tách từ (có thể rất lớn nếu câu dài), ta có
4117 thể dùng WFST
4118 % hoặc dùng thuật toán trong~\cite{softcount} (tạm gọi là thuật toán
4119 % ``soft-count'')
4120 để tách
4121 từ. WFST phải dùng kèm với beam pruning để tránh bùng nổ số tổ hợp các
4122 cách tách từ. Sau khi dùng WFST, ta còn n cách tách từ tốt nhất, được
4123 dùng để đếm fractional count.
4126 Tuy nhiên, tốt hơn hết vẫn là tính trên tất cả các cách tách từ, nếu có
4127 thể. \cite{softcount}~đưa ra một giải pháp (tạm gọi là thuật toán
4128 ``soft-count'') áp dụng quy hoạch động để giải quyết vấn đề này.
4129 Soft-count thực tế không kết xuất ra một cách tách từ cụ thể nào (và
4130 do vậy nên
4131 cũng không thể áp dụng để tìm cách tách từ tốt nhất được!). Thuật toán
4132 đếm mọi từ thể có theo cách khác, không cần dựa trên cách tách từ hoàn
4133 chỉnh. Thuật toán được mô tả trong~\cite{softcount} không dùng từ điển. Mọi chuỗi con trong câu đều được
4134 cho là từ. Điểm này, vừa là điểm mạnh vì không cần dùng từ
4135 điển, nhưng cũng là điểm yếu vì yếu tố này làm giảm độ chính xác một
4136 cách đáng kể (khoảng 20\%, như kết quả trong~\cite{softcount}).
4139 \subsubsection{Thuật toán Soft-count}
4141 Cho một cây dài $n$ chữ. Có $2^{n-1}$ cách để tách câu. Giả sử chúng
4142 ta biết xác suất $p_i$ của mỗi cách tách từ. Mỗi cách tách từ trong
4143 câu sẽ góp phần vào việc đếm từ, dựa trên xác suất của các cách tách
4144 từ đó. Ví dụ, với cách tách từ có xác suất $p_i$, ta tăng số đếm cho
4145 mỗi từ trong cách tách từ đó một khoảng
4146 $\frac{p_i}{\sum_{j=1}^{2^{n-1}}p_j}$. Cách đếm từ kiểu
4147 này được gọi là ``soft-count'' vì mọi cách tác từ đều được đếm.
4149 Câu cho trước bao gồm các chữ $C_1C_2C_3\ldots C_n$. Mỗi từ
4150 $C_{j_1}\ldots C_{j_2}$ trong câu sẽ được tăng một khoảng
4151 $\frac{S_{j_1}^{left}p(C_{j_1}\ldots
4152 C_{j_2})S_{j_2}^{right}}{\alpha}$, trong đó
4153 \begin{itemize}
4154 \item $S_{j_1}^{left}$ là tổng xác suất mọi cách tách từ có thể có của
4155 chuỗi con từ đầu câu đến $C_{j_1}$.
4156 \item $p(C_{j_1}\ldots C_{j_2})$ là xác suất của cách tách từ
4157 $C_{j_1}\ldots C_{j_2}$ hiện có.
4158 \item $\alpha$ là hằng số chuẩn hoá, bằng tổng xác suất mọi cách tách
4159 từ của câu~---~$S_{n+1}^{left}$.
4160 \end{itemize}
4162 $S_{j_1}^{left}$ và $S_{j_2}^{right}$ được tính bằng quy hoạch động.
4164 \begin{align*}
4165 S_i^{left} &= \left\{
4166 \begin{array}{ll}
4167 1&i=1\\
4168 p(C_1)&i=2\\
4169 \sum_{j=1}^{i-1}p(C_j\ldots C_{i-1})S_j^{left}&2<i\le n+1
4170 \end{array}
4171 \right.\\
4172 S_i^{right} &= \left\{
4173 \begin{array}{ll}
4174 1& i=n\\
4175 p(C_n)& i=n-1\\
4176 \sum_{j=i+1}^{n}p(C_{i+1}\ldots C_j)S_j^{right}&1\le i<n-1
4177 \end{array}
4178 \right.
4179 \end{align*}
4181 $S_i^{left}$ được tính lần lượt với $i=1,2,\ldots,n+1$ từ trái sang
4182 phải. Sau khi kết thúc, ta được $\alpha=S_{n+1}^{left}$. Sau đó tính
4183 $S_i^{right}$ với $i=n,n-1,\ldots,3,2,1$ từ phải sang trái, vừa tính
4184 $S_i^{right}$ vừa đếm từ.
4186 Độ phức tạp của thuật toán là $O(kIN)$ với $k$ là độ dài tối đa của
4187 từ, $I$ là số lần duyệt (khoảng $5-10$ lần) và $N$ là kích thước ngữ
4188 liệu.
4190 \subsubsection{Thuật toán Soft-count áp dụng trên bi\-gram}
4192 Như đã nói, thuật toán Soft-count có hai hạn chế là không dùng từ
4193 điển, và tính toán dựa trên uni\-gram. Thuật toán cải tiến được đưa ra
4194 để khắc phục hai hạn chế này.
4197 \paragraph{Sử dụng từ điển và lưới từ}
4199 Với hạn chế không dùng từ điển, khắc phục hạn chế này khá đơn
4200 giản. Với xác suất $P(C_i\ldots C_j)$, nếu từ $C_i\ldots C_j$ không
4201 tồn tại, ta cho xác suất này về $0$. Tuy nhiên, thuật toán sẽ được
4202 thay đổi để tận dụng lưới từ khi tính toán, tránh việc tìm tất cả các
4203 chuỗi con rồi lại xét xem chuỗi con đó có phải là một từ hay không.
4205 Cho lưới từ của câu $S$. Gọi $L(W)$ là tập những từ nối đến nút
4206 $W$. Tương tự, $R(W)$ là tập những từ được nối đến từ nút $W$.
4207 Với mỗi nút $W$ trong $S$, tổng xác suất các cách tách từ có chứa nút
4208 $W$ là:
4209 $$P(W)=P^{left}(W)p(W)P^{right}(W)$$
4211 Trong đó:
4212 \begin{itemize}
4213 \item $P^{left}(W)$ là tổng xác suất các cách tách từ tính từ đầu câu
4214 đến $W$.
4215 \item $P^{right}(W)$ là tổng xác suất các cách tách từ tính từ $W$ đến
4216 hết câu.
4217 \end{itemize}
4220 P^{left}(W) = \left\{
4221 \begin{array}{ll}
4222 p(W)&\text{nếu W là nút head}\\
4223 \displaystyle\sum_{W' \in L(W)}p(W')P^{left}(W')&\text{ngược lại}\\
4224 \end{array}
4225 \right.
4228 Tương tự
4231 P^{right}(W) = \left\{
4232 \begin{array}{ll}
4233 p(W)&\text{nếu W là nút tail}\\
4234 \displaystyle\sum_{W' \in R(W)}p(W')P^{right}(W')&\text{ngược lại}\\
4235 \end{array}
4236 \right.
4239 \begin{algo}\caption{Tính $P^{left}$}
4240 \label{algo:sc1:pleft}
4241 \begin{enumerate}
4242 \item Đặt $P^{left}(head) = p(head)$
4243 \item Đặt $P^{left}(W) = 0$ với mọi $W$ còn lại.
4244 \item Duyệt lần lượt các nút $W$ theo thứ tự từ trái sang phải, tính
4245 theo vị trí bắt đầu của $W$ trong câu. Với $W' \in R(W)$
4246 cộng thêm $p(W)P^{left}(W)$ vào $P^{left}(W')$
4247 \end{enumerate}
4248 \end{algo}
4250 Thuật toán~\vref{algo:sc1:pleft} được dùng để tính $P^{left}$. Thuật
4251 toán tương tự được áp dụng để tính $P^{right}$. Sau khi tính được
4252 $P^{left}$ và $P^{right}$, ta có thể tính fractional
4253 count cho các từ trong câu bằng cách duyệt tất cả các nút trong lưới từ,
4254 cộng thêm vào $\displaystyle\frac{P(W)}{P^{left}(tail)}$ cho từ
4255 $C$. Thực tế, ta sẽ lồng bước này vào trong thuật toán tính
4256 $P^{right}$, vì thuật toán cũng phải duyệt qua tất cả các từ~(thuật
4257 toán~\vref{algo:sc1:pright}).
4259 \begin{algo}\caption{Tính $P^{right}$}
4260 \label{algo:sc1:pright}
4261 \begin{enumerate}
4262 \item Đặt $P^{right}(tail) = p(tail)$
4263 \item Đặt $P^{right}(W) = 0$ với mọi nút còn lại.
4264 \item Duyệt tất cả các nút $W$ từ phải sang trái, tính theo vị trí kết
4265 thúc của $W$ trong câu.
4266 \begin{enumerate}
4267 \item Với $W' \in L(W)$, cộng thêm $p(W)P^{right}(W)$ vào
4268 $P^{right}(W')$
4269 \item Tính fractional count cho $W$ theo công thức
4270 $\displaystyle\frac{P^{left}(W)p(W)P^{right}(W)}{P^{left}(tail)}$
4271 \end{enumerate}
4272 \end{enumerate}
4273 \end{algo}
4275 \paragraph{Áp dụng bi\-gram}
4277 Để áp dụng bi\-gram thay vì
4278 uni\-gram, giải pháp đầu tiên là sử dụng lưới~2-từ thay vì lưới từ. Với
4279 lưới~2-từ, mỗi nút tương đương hai từ liên tiếp nhau, do đó
4280 $P(C_i\ldots C_j)$ tương ứng với $P(W_k|W_{k-1})$ (với $W_k$ là từ thứ
4281 $k$). Tuy nhiên, để áp dụng với tri\-gram, ta lại phải sử dụng
4282 lưới~3-từ. Điều này không hiệu quả vì lưới từ cấp càng cao càng
4283 to, xử lý kém hiệu quả.
4285 Ta có thể áp dụng trực tiếp lưới từ cơ bản cho thuật toán Soft-count
4286 mà không cần lưới~2-từ. Thay vì tính toán các giá trị dựa trên nút,
4287 thuật toán sẽ được thay đổi để tính toán các giá trị dựa trên cạnh.
4289 Thay vì vậy, thuật toán được hiệu chỉnh để áp dụng bi\-gram với lưới từ
4290 thông thường. Thay vì dùng giá trị nút để tính, ta dùng giá trị cạnh
4291 để tính. $p(W)$ sẽ được thay bằng $p(W|W')$ với $W$ và $W'$ là hai từ
4292 kề nhau.
4294 $$P(W)=P^{left}(W)P^{right}(W)$$
4297 P^{left}(W) = \left\{
4298 \begin{array}{ll}
4299 p(W)&\text{nếu W là nút head}\\
4300 \displaystyle\sum_{W' \in L(W)}p(W/W')P^{left}(W')&\text{ngược lại}\\
4301 \end{array}
4302 \right.
4305 Tương tự
4308 P^{right}(W) = \left\{
4309 \begin{array}{ll}
4310 p(W)&\text{nếu W là nút tail}\\
4311 \displaystyle\sum_{W' \in R(W)}p(W'/W)P^{right}(W')&\text{ngược lại}\\
4312 \end{array}
4313 \right.
4316 $P(W)$ đại diện cho xác suất tất cả các cách tách từ đi qua nút
4317 $W$. Do ta huấn luyện bi\-gram, nên cần xác suất $P(W/W')$ chứ không cần
4318 $P(W)$. Nếu $W$ và $W_{+1}$ chỉ có một cạnh, $P(W)$ cũng chính là
4319 $P(W/W_{+1})$. Nếu có nhiều hơn một cạnh, ta cần dùng cách khác để
4320 tính $P(W/W')$. Với thuật toán tính $P^{right}$ hiện có, ta cộng dồn
4321 $p(W/W')P^{right}$ vào cho $P^{right}(W)$. Vậy trong quá trình cộng
4322 dồn ta có thể tính ngay $P(W/W')$ bằng cách nhân giá trị cộng dồn với
4323 $P^{left}(W)$. Thuật toán~\vref{algo:sc2:pleft}
4324 và~\vref{algo:sc2:pright} là thuật toán cải tiến để tính $P^{left}$ và
4325 $P^{right}$.
4327 \begin{algo}\caption{Tính $P^{left}$ cho bi\-gram}
4328 \label{algo:sc2:pleft}
4329 \begin{enumerate}
4330 \item Đặt $P^{left}(head) = p(head)$
4331 \item Đặt $P^{left}(W) = 0$ với mọi $W$ còn lại.
4332 \item Duyệt lần lượt các nút $W$ theo thứ tự từ trái sang phải, tính
4333 theo vị trí bắt đầu của $W$ trong câu.
4334 Với mỗi $W$ tìm được, cộng thêm $p(W'/W)P^{left}(W)$ vào $P^{left}(W')\quad
4335 W' \in R(W)$
4336 \end{enumerate}
4337 \end{algo}
4339 \begin{algo}\caption{Tính $P^{right}$ cho bi\-gram}
4340 \label{algo:sc2:pright}
4341 \begin{enumerate}
4342 \item Đặt $P^{right}(tail) = p(tail)$
4343 \item Đặt $P^{right}(W) = 0$ với mọi nút còn lại.
4344 \item Duyệt tất cả các nút $W$ từ phải sang trái, tính theo vị trí kết
4345 thúc của $W$ trong câu. Với $W' \in L(W)$:
4346 \begin{enumerate}
4347 \item Cộng thêm $p(W/W')P^{right}(W)$ vào $P^{right}(W')$
4348 \item Tính fractional count cho $W'$ theo công thức
4349 $\displaystyle\frac{P^{left}(W')p(W/W')P^{right}(W)}{P^{left}(tail)}$
4350 \end{enumerate}
4351 \end{enumerate}
4352 \end{algo}
4355 \subsubsection{Thuật toán Soft-count mới để áp dụng tri\-gram}
4357 Với cách tính áp dụng để tính Soft-count với bi\-gram, ta chỉ cần dùng
4358 lưới~2-từ thay vì lưới từ để có thể áp dụng tri\-gram (trong khi lẽ ra
4359 phải dùng lưới~3-từ để tính tri\-gram, nếu dùng thuật toán gốc).
4361 %% \subsection{Tính n\-gram}
4363 %% N\-gram được tính như thông thường. Sử dụng backoff chuẩn. Thư viện
4364 %% SRILM được dùng để tính n\-gram.
4367 %\section{Lỗi chính tả}
4369 % \note{Phân loại lỗi, nguyên nhân gây lỗi}
4373 \chapter{Cài đặt}
4374 \label{cha:implementation}
4375 %TOC
4376 \minitoc
4377 \tolerance=10000
4379 Chương trình được cài đặt bằng C++ trên nền Linux. Phần giao diện được
4380 cài đặt bằng Gtk+. Phần giao diện này chỉ mang tính chất minh
4381 hoạ. Trong thực tế, chương trình nên được tích hợp vào các bộ soạn
4382 thảo văn bản như Open Office, AbiWord~\ldots{} để có thể phát huy tác
4383 dụng. Ngoài ra chương trình sử dụng thư viện SRILM~\cite{srilm} để tính toán mô
4384 hình ngôn ngữ.
4386 Chương trình gồm hai phần: phần bắt lỗi chính tả và phần huấn
4387 luyện. Hai phần này sử dụng khá nhiều thành phần chung. Các
4388 thành phần sẽ được trình bày lần lượt bên dưới. Những điểm riêng của
4389 trình bắt lỗi chính tả và trình huấn luyện sẽ được trình bày riêng.
4392 \section{Cấu trúc dữ liệu}
4393 \label{sec:data-structure}
4395 \subsection{Lưu chuỗi}
4396 %\newcommand{\sym}[1]{\verb@#1@}
4397 Để tiết kiệm chỗ và giảm chi phí khi so sánh các token và các từ, chương trình
4398 lưu toàn bộ các token có thể có vào một mảng chung. Mọi token đều được
4399 tham chiếu bằng một con số, tạm gọi là \verb@strid@ (chính là số thứ tự
4400 token trong mảng). Ngoài ra một bảng băm được dùng để ánh xạ chuỗi
4401 sang strid. Cả hai cấu trúc dữ liệu này được cài đặt trong lớp
4402 \verb@StringArchive@. Chương trình chỉ sử dụng một đối tượng
4403 duy nhất thuộc lớp này, được truy cập thông qua hàm \verb@get_sarch()@. Toán tử
4404 \verb@[]@, được cài đặt để chuyển đổi từ strid sang chuỗi và ngược lại.
4406 Từ và tiếng đều được lưu trong StringArchive. Với từ, các khoảng trắng
4407 được thay thế bằng dấu gạch chân `\verb@_@' trước khi lưu. Ngoài ra từ
4408 cách nhau bởi nhiều khoảng trắng sẽ được gom lại thành một khoảng
4409 trắng. Ví dụ, từ ``\texttt{học sinh}'' sẽ được lưu trong StringArchive
4410 dạng ``\verb@học_sinh@''. Việc chuẩn hoá sẽ được tiến hành trên từng
4411 tiếng. Sau khi chuẩn hoá, từ sẽ thành ``\verb@5hoc_0sinh@''.
4413 \subsection{Từ điển}
4415 Từ điển được lưu ở dạng văn bản, mỗi dòng tương ứng với một từ. Trong
4416 bộ nhớ, từ điển sử dụng cây đa nhánh (lớp \verb@Node@). \verb@Node@
4417 gồm hai lớp dẫn xuất là \verb@BranchNode@ (nhánh) và \verb@LeafNode@
4418 (lá). Hàm \verb@Node::is_leaf()@ được dùng để xác định nút nhánh, nút
4419 lá. Trong lớp \verb@BranchNode@, \verb@nodes@ sẽ chứa con trỏ đến
4420 các nút kế tiếp kèm theo chữ tương ứng được dùng để chuyển qua nút đó. Duyệt
4421 từ nút gốc (truy cập thông qua hàm \verb@WordArchive::get_root()@) cho đến hết, ta
4422 sẽ được danh sách tiếng hình thành từ. Chữ được dùng để chuyển qua nút
4423 lá từ nút nhánh là \verb@<mainleaf>@ (với nút lá cơ bản),
4424 \verb@<caseleaf>@~\ldots
4427 Để tiết kiệm bộ nhớ, tất cả các danh sách từ khác nhau trong chương
4428 trình được trộn chung vào một cây \verb@BranchNode@ duy nhất được quản
4429 lý bởi \verb@WordArchive@. Các nút lá khác nhau sẽ phản ánh từ trong
4430 các danh sách khác nhau. Ví dụ, nút \verb@<mainleaf>@ được dùng để lưu
4431 từ trong từ điển từ. Trong khi nút \verb@<caseleaf>@ được dùng để lưu
4432 từ viết hoa của từ viết thường tương ứng (khi duyệt cây bằng từ viết
4433 thường, nhưng lá là từ viết hoa).
4435 Lớp \verb@WordArchive@ chứa nút gốc của cây và một số hàm linh tinh để
4436 thao tác trên cây.
4438 %% Một số hàm thường dùng trong \verb@BranchNode@ bao gồm:
4439 %% \begin{itemize}
4440 %% \item \verb@get_leaf()@: lấy nút lá với id của nút lá cho trước
4441 %% (\verb@<mainleaf>@ hoặc \verb@<caseleaf>@~\ldots)
4442 %% \item \verb@get_leaves()@: lấy tất cả các nút lá (các nút lá phải được
4443 %% đăng ký bằng \verb@WordArchive::register_leaf()@)
4444 %% \item \verb@get_branch()@: lấy nhánh dựa trên id cho trước.
4445 %% \end{itemize}
4447 %% Một số hàm thường dùng trong \verb@LeafNode@ bao gồm:
4448 %% \begin{itemize}
4449 %% \item \verb@get_id()@: Strid của từ.
4450 %% \item \verb@get_syllables()@: Danh sách strid của các tiếng hình thành
4451 %% nên từ.
4452 %% \item \verb@get_syllable_count()@: Số strid hình thành nên từ.
4453 %% \item \verb@set_id()@: đặt strid cho nút.
4454 %% \end{itemize}
4456 %% Các hàm thường dùng trong \verb@WordArchive@ bao gồm:
4457 %% \begin{itemize}
4458 %% \item \verb@get_root()@: Lấy \verb@BranchNode@ của nút gốc.
4459 %% \item \verb@load()@: Xây dựng cây từ điển từ tập tin.
4460 %% \item \verb@save()@: Lưu cây từ điển vào tập tin.
4461 %% \end{itemize}
4463 Từ điển tiếng không được lưu trực tiếp vào tập tin mà sẽ được phát
4464 sinh tự động khi nạp từ điển từ. Thực ra, hàm \verb@WordArchive@::load()@
4465 khi được gọi sẽ lưu các tiếng vào \verb@StringArchive@, đồng thời đánh
4466 dấu tiếng đó thuộc từ điển tiếng. Sau đó, ta có thể xác định một chữ
4467 có phải thuộc về từ điển tiếng hay không nhờ hàm
4468 \verb@StringArchive::in_dict()@.
4470 %% Từ điển từ còn chứa một số ``từ'' đặc biệt, được lấy thông qua hàm
4471 %% \verb@get_id()@. Những từ này bao gồm:
4472 %% \begin{itemize}
4473 %% \item $UNK\_ID$ đại diện cho từ lạ, không biết.
4474 %% \item $PUNCT\_ID$ đại diện cho các dấu câu.
4475 %% \item $PROPER\_NAME\_ID$ đại diện cho tên riêng.
4476 %% \item $START\_ID$ đại diện cho đầu câu. Mỗi đầu câu đều có một ``từ''
4477 %% này (tương đương nút ``head'').
4478 %% \item $STOP\_ID$ đại diện cho cuối câu. Mỗi cuối câu đều có một ``từ''
4479 %% này (tương đương nút ``tail'').
4480 %% \item $POEM\_ID$ đại diện cho từ láy.
4481 %% \item $NUMBER\_ID$ đại diện cho các loại số.
4482 %% \end{itemize}
4484 \subsection{Câu}
4486 Mỗi câu bao gồm danh sách strid của các token, kèm theo vị trí chuỗi
4487 con của token đó trong câu thật sự. Lớp \verb@Sentence@ bao gồm một
4488 mảng các đối tượng \verb@Sentence::Syllable@ (biến \verb@syllables@) đại diện cho các
4489 tiếng. Mỗi đối tượng \verb@Sentence::Syllable@ bao gồm vị trí bắt đầu
4490 của tiếng trong câu \verb@start@, mã strid của tiếng đó \verb@id@ và
4491 mã strid dùng để so sánh \verb@cid@.
4493 %% Các hàm thường dùng:
4494 %% \begin{itemize}
4495 %% \item \verb@set()@: đặt chuỗi đại diện cho câu cho đối tượng
4496 %% \verb@Sentence@.
4497 %% \item \verb@tokenize()@: tách câu dựa trên chuỗi đã đặt.
4498 %% \item \verb@get_syllable_count()@: trả về số tiếng trong câu.
4499 %% \item \verb@operator[]@: Truy cập các tiếng trong câu.
4500 %% \end{itemize}
4502 Chuỗi các câu sẽ được hàm \verb@sentences_split()@ tách thành những
4503 chuỗi con, đại diện cho các câu. Các chuỗi con này sẽ được chuyển cho
4504 \verb@Sentence@ để phân tích thành từng tiếng.
4506 \subsection{Lưới từ}
4508 Lưới từ bao gồm lưới từ dạng thô \verb@Lattice@ và lưới từ \verb@DAG@.
4510 Lưới từ thô \verb@Lattice@ không có nút head và tail, cũng không có các
4511 liên kết tường minh giữa các nút với nhau. Cấu trúc này lưu thành danh
4512 sách các từ theo vị trí bắt đầu của từ. Để biết từ này nối với từ nào,
4513 ta sử dụng thông tin về vị trí bắt đầu của từ và độ dài của từ để suy
4514 ra vị trí bắt đầu của từ kế tiếp, sau đó lấy danh sách của những từ
4515 bắt đầu tại vị trí của từ kế tiếp.
4517 Tất cả các từ của lưới từ được lưu vào danh sách chung (biến
4518 \verb@Lattice::we@ kiểu \verb@WordEntries@), chứa đựng toàn bộ thông tin
4519 liên quan đến một từ. Các từ được tham chiếu bằng số thứ tự của từ
4520 trong WordEntries --- tạm gọi là WordID. Mỗi từ được lưu trong cấu
4521 trúc \verb@WordEntry@. Cấu trúc này bao gồm:
4522 \begin{itemize}
4523 \item \verb@len@: cho biết số tiếng của từ.
4524 \item \verb@fuzid@: mỗi bit trong biến này cho biết trạng thái fuzzy
4525 của tiếng tương ứng trong từ. Nếu bit là 1 nghĩa là tiếng đó được
4526 biến đổi, không phải là tiếng gốc.
4527 \item \verb@id@: WordID.
4528 \item \verb@node@: liên kết đến từ trong từ điển, dùng để lấy các
4529 thông tin chi tiết hơn về từ.
4530 \end{itemize}
4532 \verb@Lattice@ chứa một mảng các đối tượng \verb@WordInfos@. Mỗi đối
4533 tượng \verb@WordInfo@ tương đương với một vị trí tiếng trong
4534 câu. \verb@WordInfos@ cho ta biết danh sách các từ bắt đầu từ vị trí
4535 tiếng đó, danh sách các từ fuzzy tại tiếng đó, chiều dài từ không bị
4536 fuzzy.
4538 %% Các hàm thường dùng của \verb@Lattice@:
4539 %% \begin{itemize}
4540 %% \item \verb@construct()@: xây dựng \verb@Lattice@ từ \verb@Sentence@.
4541 %% \item \verb@pre_construct()@, \verb@post_construct()@: các hàm bên
4542 %% trong của \verb@construct()@, được sử dụng trực tiếp khi cần hiệu
4543 %% chỉnh lưới từ ngay trong quá trình xây dựng lưới từ (như phần phục
4544 %% hồi lỗi~\ldots)
4545 %% \item \verb@get_word_count()@: trả về số tiếng của câu.
4546 %% \item \verb@get_we()@: Lấy danh sách \verb@WordEntry@ của những từ bắt
4547 %% đầu tại vị trí tiếng cho trước.
4548 %% \end{itemize}
4550 Lưới từ \verb@DAG@ được dùng để tổng quát hoá các thuật toán hoạt động
4551 trên cả lưới từ và lưới~2-từ. So với \verb@Lattice@, lớp này giống một
4552 lưới từ hơn.
4553 %% Các hàm thường dùng trong \verb@DAG@ gồm:
4554 %% \begin{itemize}
4555 %% \item \verb@node_id()@ trả về strid của nút có mã id cho trước.
4556 %% \item \verb@node_begin()@ trả về id của nút head.
4557 %% \item \verb@node_end()@ trả về id của nút tail.
4558 %% \item \verb@node_count()@ trả về số nút trong lưới từ. Các nút sẽ được
4559 %% đánh số id từ 0 đến \verb@node_count()-1@.
4560 %% \item \verb@get_next()@ lấy danh sách các từ được nối với từ cho
4561 %% trước.
4562 %% \item \verb@edge_value()@ trả về giá trị cạnh, cho trước hai nút.
4563 %% \end{itemize}
4565 \verb@DAG@ là lớp cơ sở. Lớp dẫn xuất \verb@WordDAG@ hoạt động như
4566 lưới từ cơ bản, còn lớp \verb@WordDAG2@ hoặt động như lưới~2-từ.
4567 %% \verb@WordDAG2@ có thêm một số hàm mới:
4568 %% \begin{itemize}
4569 %% \item \verb@demangle()@ chuyển cách tách từ trong lưới~2-từ về lưới từ
4570 %% (về cơ bản là loại bỏ hai nút head/tail của lưới~2-từ).
4571 %% \item \verb@node_dag_edge()@ trả về giá trị hai nút con nằm trong nút
4572 %% của lưới~2-từ.
4573 %% \item \verb@get_dag()@ lấy lưới từ hình thành nên lưới~2-từ.
4574 %% \end{itemize}
4577 \subsection{Cách tách từ}
4579 Cách tách từ đơn giản là một mảng các WordID của những từ hình thành
4580 nên cách tách từ đó.
4582 \subsection{Mô hình ngôn ngữ}
4584 Mô hình ngôn ngữ được sử dụng là tri\-gram. Mô hình ngôn ngữ được cài
4585 đặt trong thư viện SRILM. Mô hình ngôn ngữ được truy cập thông qua hàm
4586 \verb@get_ngram()@.
4588 \section{Tiền xử lý}
4591 \subsection{Tách token}
4592 \label{sub:preprocess:token}
4594 Chương trình sử dụng flex để tách token. Các quy tắc flex được áp dụng
4595 được liệt kê trong hình~\vref{fig:flex-token}.
4596 \begin{figure}[htbp]
4597 \centering
4598 \begin{verbatim}
4599 SENTENCE_FINAL [.?!]
4600 HYPHEN [\-]
4601 OPEN_SINGLE_QUOTE [\`]
4602 CLOSE_SINGLE_QUOTE [\']
4603 RIGHT_PAREN [\"\)\]\}\>\']
4605 LETTERS_AND_NUMBERS [a-zA-Z0-9]
4606 LETTERS_NUMBER_AND_THEN_SOME [a-zA-Z0-9]
4607 APOSTROPHE \'
4609 SINGLE_CHARACTER [a-zA-Z0-9]
4611 WHITE_SPACE [ \t\n]
4612 NEWLINE [\n]
4613 INVISIBLE [^\040-\176]
4615 {SENTENCE_FINAL}+{RIGHT_PAREN}* |
4616 {HYPHEN}+ |
4617 {OPEN_SINGLE_QUOTE}+ |
4618 {CLOSE_SINGLE_QUOTE}+ |
4619 {LETTERS_NUMBER_AND_THEN_SOME}+{LETTERS_AND_NUMBERS} |
4620 {LETTERS_AND_NUMBERS}+{APOSTROPHE} |
4622 {SINGLE_CHARACTER} { xuất từ }
4624 ({WHITE_SPACE}|{INVISIBLE}|{NEWLINE})+ { bỏ qua }
4625 \end{verbatim}
4627 \caption{Quy tắc tách token dùng flex}
4628 \label{fig:flex-token}
4629 \end{figure}
4632 \subsection{Tách câu}
4634 Trước hết, câu được tách thành token. Sau đó, các dấu ``\texttt{?!()[]:;.,}''
4635 sẽ được dùng để tách thành những đoạn nhỏ hơn --- những ``câu''. Hàm
4636 \verb@sentences_split()@ được dùng để thực hiện điều này.
4638 \section{Lưới từ}
4640 \subsection{Tạo lưới từ}
4641 \subsubsection{Tạo lưới từ Lattice}
4642 Lưới từ \verb@Lattice@ được tạo thông qua hàm
4643 \verb@Lattice::construct()@. Thực tế, \verb@construct()@ chỉ là vỏ bọc
4644 gọi đến ba hàm \verb@Lattice::pre_construct()@,
4645 \verb@mark_proper_name()@ và \verb@post_construct()@.
4647 \verb@pre_construct()@ thực hiện công đoạn đầu tiên để tạo lưới từ:
4648 phát sinh tất cả các từ có thể có dựa trên từ điển và so sánh mờ. Một
4649 thuật toán tương tự Viterbi được sử dụng để tạo lưới từ. Chương trình
4650 lần lượt quét qua các vị trí tiếng, từ một đến hết. Ở mỗi vị trí,
4651 chương trình cố gắng nối thêm tiếng mới vào danh sách những từ chưa
4652 hoàn chỉnh nếu được. Nếu từ hoàn chỉnh, từ sẽ được đưa vào danh sách
4653 (nhưng không bị xóa khỏi danh sách từ chưa hoàn chỉnh, vì có thể có
4654 những từ dài hơn). Nếu không thể gắn thêm tiếng mới vào từ, từ đó sẽ
4655 bị loại bỏ khỏi danh sách từ chưa hoàn chỉnh. Ngoài ra, mỗi khi chuyển
4656 sang tiếng mới, tiếng đó cũng được đưa vào danh sách từ chưa hoàn
4657 chỉnh như là những tiếng bắt
4658 đầu từ mới. Công việc được thực hiện cho đến khi quét hết chiều dài
4659 câu~(thuật toán~\vref{algo:pre_construct}).
4661 Cấu trúc \verb@WordState@ được dùng để lưu một từ chưa hoàn chỉnh
4662 trong danh sách các từ chưa hoàn chỉnh. Cấu trúc này bao gồm vị trí
4663 bắt đầu từ, mã \verb@fuzid@ của từ, và con trỏ đến nút của tiếng cuối cùng
4664 hiện thời của từ trong cây từ điển. Con trỏ này sẽ được
4665 \verb@WordState::get_next()@ dùng để tìm ra những tiếng kế tiếp giúp hình
4666 thành nên từ. Thành phần \verb@fuzid@ được cập nhật sau mỗi khi thêm
4667 tiếng mới vào từ, cho biết đó là tiếng chính xác trên câu, hay tiếng
4668 gần giống với tiếng trên câu (phát sinh nhờ so sánh mờ). Mỗi bit trong
4669 \verb@fuzid@ tượng trưng cho một tiếng trong từ.
4671 Việc tìm từ dựa trên lớp \verb@WordState@ với hai hàm chính là
4672 \verb@WordState::get_next()@ và \verb@WordState::collect_words()@. Hàm
4673 \verb@get_next()@ khi được gọi sẽ tạo ra các đối tượng
4674 \verb@WordState@ mới tương ứng với tiếng kế tiếp được nhận, sau đó tự
4675 hủy chính nó. \verb@collect_words@ sẽ thu thập tất cả các nút lá có
4676 thể có tại vị trí tiếng đang xét và đưa vào lưới từ. Các lớp dẫn xuất
4677 khác nhau từ \verb@WordState@ có các cách tìm kiếm từ khác nhau. Các
4678 lớp này sẽ được đề cập bên dưới.
4680 Mỗi lớp dẫn xuất \verb@WordState@ có một lớp dẫn xuất
4681 \verb@WordStateFactory@ tương ứng, được dùng để tạo ra đối tượng dẫn
4682 xuất \verb@WordState@. Hàm \verb@WordStateFactory::create_new()@ trong
4683 lớp dẫn xuất sẽ tạo ra đối tượng dẫn xuất \verb@WordState@ tương ứng
4684 với lớp đó. Danh sách các đối tượng \verb@WordStateFactory@ được
4685 chuyển cho \verb@pre_construct()@
4686 nhờ đó \verb@pre_construct()@ biết cần phải sử dụng những lớp nào.
4688 \begin{algo}
4689 \caption{Lattice::pre\_construct()}
4690 \label{algo:pre_construct}
4692 $states1$ và $states2$ chứa danh sách các \verb@WordState@, được
4693 khởi động là rỗng.
4695 \begin{enumerate}
4696 \item Duyệt $i$ từ tiếng đầu tiên đến hết câu.
4697 \begin{enumerate}
4698 \item Xóa $states2$.
4699 \item Thêm state mới (bắt đầu tại vị trí $i$) vào $states2$
4700 (\verb@WordStateFactory::create_new()@).
4701 \item Chuyển state cũ (trong $states1$) sang $states2$ mới (\verb@WordState::get_next()@).
4702 \item Tạo từ từ những state trong $states2$
4703 (\verb@WordState::collect_words()@), thêm vào \verb@WordEntry@ $we$.
4704 a \item Hoán vị $states1$ và $states2$.
4705 \end{enumerate}
4706 \item Xóa $states1$. Trả về $we$.
4707 \end{enumerate}
4708 \end{algo}
4711 \paragraph{Tìm từ chính xác} được thực hiện bởi lớp
4712 \verb@ExactWordState@. Lớp này sử dụng cid của các tiếng trong câu để
4713 tìm, không hề thực hiện các biến đổi nào trong quá trình tìm kiếm. Nút
4714 lá được dùng là nút \verb@<mainleaf>@.
4718 \paragraph{Tìm từ không phân biệt hoa thường} được thực hiện bởi lớp
4719 \verb@LowerWordState@. Lớp này so sánh dựa trên chữ viết thường của
4720 các tiếng trong câu. Nút lá được dùng là \verb@<mainleaf>@.
4723 \paragraph{Tìm từ viết hoa bị viết sai} được thực hiện bởi lớp
4724 \verb@UpperWordState@. Lớp này thực hiện tìm kiếm giống như
4725 \verb@LowerWordState@. Tuy nhiên sử dụng nút lá \verb@<caseleaf>@ thay
4726 \verb@<mainleaf>@. Trong quá trình tạo từ điển, các chữ viết hoa sẽ
4727 tạo ra các nút \verb@<caseleaf>@, trong đó đường đi đến
4728 \verb@<caseleaf>@ là chữ thường chữ không phải chữ viết hoa.
4731 \paragraph{Tìm từ phát âm tương tự} được thực hiện bởi lớp
4732 \verb@FuzzyWordState@. Lớp này thực hiện tìm kiếm dựa trên tất cả các
4733 tiếng có phát âm giống với tiếng tương ứng trong câu. Sau đó trả về
4734 các nút lá \verb@<mainleaf>@. Việc tìm tiếng giống phát âm dựa trên
4735 tập nhẫm lẫn được lấy thông qua hàm \verb@get_confusion_sets@. Xem
4736 thêm phần~\vref{sec:impl:fuzzy-cmp} để biết cách hoạt động của
4737 \verb@FuzzyWordState::get_next()@.
4739 Hàm \verb@post_construct()@ thực hiện nốt những gì còn lại để tạo nên
4740 lưới từ, bao gồm việc duyệt qua lưới từ, thêm các nút (như $UNK$)
4741 để bảo đảm đồ thị liên thông, đồng thời đưa danh sách toàn bộ các từ
4742 đã thu được vào lưới từ. Việc này được thực hiện bằng cách duyệt qua
4743 lưới từ, đánh dấu tất cả các tiếng được bao gồm trong các từ đã được
4744 tạo. Những tiếng chưa được đánh dấu là những tiếng không nằm trong bất
4745 cứ từ nào, do đó sẽ phá hủy tính liên thông của đồ thị. Trong trường
4746 hợp xấu nhất, ta sẽ tạo một từ $UNK$ chứa tiếng này.
4748 Lưới từ lưu danh sách từ trong mảng để đảm bảo hiệu suất, tuy nhiên
4749 kết quả trả về từ bước \verb@pre_construct()@
4750 lại là một tập hợp \verb@std::set@ chứ không phải một mảng. Mục đích
4751 của việc sử dụng tập hợp là để có thể truy xuất nhanh đến một phần từ
4752 trong lưới từ trong quá trình hiệu chỉnh lưới
4753 từ. \verb@post_construct()@ gọi hàm \verb@construct()@ (hàm override,
4754 không phải hàm \verb@construct()@ ban đầu) để điền các thông tin về
4755 \verb@WordInfos@ đảm bảo cho lưới từ có thể hoạt động.
4757 Sau khi hoàn tất tạo lưới từ, lưới từ xem như đã ổn định và sẽ không
4758 bao giờ thay đổi. Không một hiệu chỉnh nào được phép xảy ra sau khi đã
4759 hoàn tất tạo lưới từ. Chính vì vậy, việc tạo lưới từ được tách làm hai
4760 phần để tạo cơ hội can thiệp vào lưới từ ngay trong giai đoạn hình
4761 thành để có thể thêm các nút khác (phát sinh trong bước phục hồi
4762 lồi). Như đã nói, \verb@construct()@ gọi đến hàm
4763 \verb@mark_propername()@ hàm này tạo thêm những nút $PROP$ đại diện
4764 cho tên riêng. Các hàm khác có thể được gọi ở vị trí của hàm này nếu
4765 cần thay đổi lưới từ nhiều hơn.
4767 \subsubsection{Tạo lưới từ DAG}
4769 Lưới từ \verb@DAG@ được hình thành dựa trên lưới từ \verb@Lattice@. Có
4770 thể coi đây là một vỏ bọc để dễ truy cập đến lưới từ, thêm vào những
4771 nút head, tail~\ldots{} cho hoàn chỉnh. Các hàm trong \verb@DAG@ chỉ
4772 là vỏ bọc cho các hàm của \verb@Lattice@. Hai nút giả head, tail được
4773 tạo ra và thêm vào lưới từ. Đó là trường hợp của lưới từ cơ bản
4774 \verb@WordDAG@.
4776 Với lưới~2-từ \verb@WordDAG2@, công việc phức tạp hơn. Thuật toán mở
4777 rộng lưới từ thành lưới~2-từ được cài đặt trong constructor của
4778 \verb@WordDAG2@. Do mỗi nút của \verb@WordDAG2@ bao gồm hai nút của
4779 lưới từ cơ bản, ta cần lưu trữ mã các nút này trong
4780 \verb@WordDAG2::Node@ (các biến \verb@n1@ và \verb@n2@). Ngoài ra còn
4781 có biến \verb@id@ là mã nút của lưới~2-từ. Tất cả các nút của
4782 lưới~2-từ được lưu trong biến thành phần \verb@WordDAG2::nodes@. Hàm
4783 \verb@WordDAG2::demange()@ được dùng để chuyển mã từ mã nút trong
4784 lưới~2-từ thành mã nút trong lưới từ \verb@WordDAG@.
4788 \subsection{Bổ sung lưới từ}
4790 Bổ sung lưới từ dựa theo lỗi phát âm được thực hiện ngay trong
4791 \verb@pre_construct()@ thông qua lớp \verb@FuzzyWordState@~(xem thêm
4792 phần~\vref{sec:impl:phonetic-error}).
4795 Lớp \verb@PenaltyDAG@ được dẫn xuất từ lớp \verb@DAG@. Lớp này điều
4796 chỉnh lại hàm \verb@DAG::edge_value()@ để thay đổi độ dài cạnh nhằm
4797 tạo sự khác biệt giữa các cạnh phát sinh và cạnh gốc. Lớp nhận một đối
4798 tượng \verb@DAG@ khác, hoạt động như là một vỏ bọc cho đối tượng này.
4800 Lớp sử dụng thông tin \verb@WordEntry::fuzid@ để biết có bao nhiêu
4801 tiếng trong từ là tiếng phát sinh, sau đó giảm giá trị của cạnh theo
4802 một tỉ lệ tương ứng. Nếu có $n$ tiếng sai, giá trị cạnh sẽ bị mất đi
4803 một khoảng $nwV$
4804 với $V$ là giá trị ban đầu, $w$ là trọng số.
4806 %% Các hàm mới trong \verb@PenaltyDAG@:
4807 %% \begin{itemize}
4808 %% \item \verb@PenaltyDAG::set_weight()@: Đặt trọng số $w$ cho đối tượng.
4809 %% \item \verb@PenaltyDAG::get_weight()@: Lấy trọng số $w$ của đối tượng.
4810 %% \end{itemize}
4812 Giá trị $w$ được sử dụng trong chương trình minh hoạ là $0.05$.
4815 \subsection{Tìm cách tách từ tốt nhất}
4818 Thuật toán~\vref{algo:pfs} trình bày cài đặt PFS.
4819 Thuật toán~\vref{algo:bellman} trình bày cài đặt Bellman-Ford kèm chuẩn hoá.
4822 \begin{algo}
4823 \caption{Thuật toán tìm đường PFS}
4824 \label{algo:pfs}
4825 \begin{align*}
4826 last[head] &\leftarrow head\\
4827 val[head] &\leftarrow 0\\
4828 seen[head] &\leftarrow true\\
4829 candidates &\leftarrow \{ head \} (\text{candidates là một heap})
4830 \end{align*}
4832 \begin{enumerate}
4833 \item Nếu $candidates$ rỗng thì kết thúc thuật toán.
4834 \item Lấy một đỉnh $v$ ra khỏi $candidates$. $next\_nodes$ là tập điểm
4835 nối từ $v$ đến.
4836 \item Duyệt từng đỉnh $vv$ trong $next\_nodes$.
4837 \begin{enumerate}
4838 \item Nếu $seen[vv]$ là $false$.
4839 \begin{enumerate}
4840 \item Thêm $vv$ vào $candidates$.
4841 \item $seen[vv] \leftarrow true$
4842 \item $val[vv] \leftarrow val[v]+edge\_value(v,vv)$
4843 \item $last[vv] = v$
4844 \end{enumerate}
4845 \item Nếu $seen[vv]$ là $true$ và $val[vv] > val[v]+edge\_value(v,vv)$
4846 \begin{enumerate}
4847 \item $val[vv] \leftarrow val[v]+edge\_value(v,vv)$
4848 \item $last[vv] \leftarrow v$
4849 \item Sắp xếp lại $candidates$.
4850 \end{enumerate}
4851 \end{enumerate}
4852 \item Về bước 1.
4853 \end{enumerate}
4855 Lấy danh sách các nút.
4856 \begin{enumerate}
4857 \item $v \leftarrow tail$.
4858 \item Lưu $v$.
4859 \item $v \leftarrow last[v]$
4860 \item Nếu $v \ne last[v]$, lặp lại bước 2.
4861 \item Lưu $v$.
4862 \item Đảo ngược danh sách các nút đã lưu.
4863 \end{enumerate}
4864 \end{algo}
4867 \begin{algo}
4868 \caption{Thuật toán tìm đường Bellman-Ford kèm chuẩn hoá}
4869 \label{algo:bellman}
4870 \begin{align*}
4871 last[head] &\leftarrow head\\
4872 length[head] &\leftarrow 0\\
4873 node\_count[head] &\leftarrow 1\\
4874 nexts &\leftarrow \{head\}
4875 \end{align*}
4876 Lập danh sách cạnh.
4877 \begin{enumerate}
4878 \item $i \leftarrow 0$.
4879 \item $l \leftarrow size\_of(nexts)$
4880 \item Nếu $i >= l$, dừng.
4881 \item $v \leftarrow nexts[i]$. $i \leftarrow i+1$
4882 \item Nếu $done[v]$ là $true$ thì quay về bước 2. Nếu không thì
4883 $done[v] \leftarrow true$
4884 \item Thêm các nút kề $v$ vào phía sau $nexts$.
4885 \item Lặp $ii = l\ldots size\_of(nexts)$, thêm các cạnh
4886 $(v,nexts[ii])$ vào $edges$
4887 \item Quay về 2.
4888 \end{enumerate}
4889 Tìm đường
4890 \begin{enumerate}
4891 \item $cont \leftarrow true$. Duyệt lần lượt từ $0$ đến $n-1$ với điều kiện
4892 $cont$ vẫn còn là $true$.
4893 \item $cont \leftarrow false$. Duyệt lần lượt các cạnh trong $edges$, đặt đỉnh đầu, đỉnh cuối
4894 lần lượt là $i$ và $v$, bỏ qua các cạnh có $node\_count[i] = 0$.
4895 \item Nếu $node\_count[v] \ne 0$ và $length[v] > length[i] +
4896 \frac{edge\_value(i,v)-length[i]}{node\_count[i]+1}$
4897 \begin{enumerate}
4898 \item $length[v] \leftarrow length[i] +
4899 \frac{edge\_value(i,v)-length[i]}{node\_count[i]+1}$
4900 \item $last[v] \leftarrow i$
4901 \item $node\_count[v] \leftarrow node\_count[i]+1$
4902 \item $cont \leftarrow true$
4903 \end{enumerate}
4904 \end{enumerate}
4905 Lấy danh sách các nút tương tự như thuật toán~\vref{algo:pfs}.
4906 \end{algo}
4908 \subsection{Lỗi phát âm}
4909 \label{sec:impl:phonetic-error}
4910 \subsubsection{Phân tích cấu trúc âm tiết}
4912 Lớp \verb@Syllable@ được dùng để phân tích cú pháp âm tiết. Năm thành
4913 phần của âm tiết (âm đầu, âm đệm, âm chính, âm cuối, thanh điệu) được
4914 lưu trong mảng \verb@components@. Hàm \verb@Syllable::parse()@ nhận
4915 một chuỗi của một âm tiết, sau đó tách âm tiết này ra và điền thông
4916 tin vào \verb@Syllable::components@.
4918 \subsubsection{Tìm các tiếng phát âm tương tự}
4919 \label{sec:impl:fuzzy-cmp}
4920 Việc tìm các tiếng tương tự cách phát âm được cài đặt trong lớp
4921 \verb@Syllable@ và hàm
4922 \verb@FuzzyWordState::get_next()@. Lớp
4923 \verb@Syllable@ sẽ thực hiện các thao tác cơ bản liên quan đến âm
4924 tiết, bao gồm hai hàm \verb@match@ và \verb@apply@.
4926 \verb@Syllable::match@ so sánh âm tiết với một mẫu âm tiết. Một mẫu
4927 âm tiết bao gồm năm thành phần như âm tiết. Mỗi thành phần xác định
4928 những giá trị được phép đối với thành phần đó. Các thành phần có thể
4929 cho phép một giá trị, hoặc không quan tâm đến giá trị của nó, hoặc
4930 không được tồn tại thành phần đó, hoặc phải có thành phần đó. Các
4931 thành phần được liệt kê lần lượt theo thứ tự: âm đầu, âm đệm, âm
4932 chính, âm cuối, thanh điệu. Ví dụ, \verb@[?,?,a,i,?]@ sẽ
4933 khớp với bất cứ âm tiết nào có âm chính là `a' và âm cuối là
4934 `i'. \verb@[?,?,?,?,Hook]@ sẽ khớp với bất cứ âm nào dùng
4935 thanh hỏi.
4937 Các mẫu âm tiết này được tập hợp lại để tạo nên tập nhầm nhằng. Một
4938 tập nhập nhằng bao gồm nhiều mẫu âm tiết. Ví dụ, ta có tập nhập nhằng
4939 \verb@[?,?,ư,t,?]@ và \verb@[?,?,ư,c,?]@ thể
4940 hiện sự nhập nhằng giữa những âm tiết ``ưc'' và ``ưt''. Tập nhập nhằng
4941 có kiểu là \verb@confusion_set@. Tất cả các tập nhập nhằng được lưu
4942 vào một mảng, được truy cập thông qua hàm \verb@get_confusion_sets()@.
4944 Hàm \verb@Syllable::apply()@ dùng để áp mẫu vào âm tiết đã có. Các
4945 thành phần tường minh trong mẫu sẽ ghi đè các thành phần tương ứng
4946 trong âm tiết. Nhưng thành phần quy định không tồn tại trong mẫu sẽ bị
4947 loại bỏ khỏi âm tiết. Những thành phần không được quy định trong mẫu
4948 sẽ được giữ nguyên. Các thành phần quy định tồn tại sẽ tạo ra một tập
4949 các âm tiết khác nhau, mỗi âm tiết tương ứng với một giá trị có thể có
4950 của thành phần đó.
4952 Sử dụng hai hàm trên, hàm
4953 \verb@FuzzyWordState::get_next()@ làm phần việc còn
4954 lại là gắn kết \verb@match()@, \verb@apply()@ và tập nhầm lẫn để tìm
4955 ra các âm tiết phát âm gần giống. Hàm lần lượt duyệt qua các mẫu âm
4956 tiết trong từng tập nhầm lẫn. Nếu âm tiết đang xét khớp với một mẫu âm
4957 tiết trong tập nhầm lẫn (\verb@match()@), các âm tiết còn lại của tập
4958 nhầm lẫn sẽ được áp vào âm tiết đang xét (\verb@apply()@) để tạo ra
4959 các âm tương tự. Âm tiết mới sẽ lại được duyệt qua tập nhầm lẫn như âm
4960 tiết đã xét để tạo ra thêm các âm tiết tương tự khác. Quá trình này sẽ
4961 dừng lại khi không có âm tiết mới nào được phát sinh. Sau đó, các âm
4962 tiết sẽ được so sánh với từ điển tiếng để lọc bỏ những âm tiết không
4963 đúng.
4965 \subsection{Danh từ riêng}
4967 Một danh sách 8000 tên riêng được sử dụng để tạo một tập các chữ
4968 thường hình thành tên riêng.
4969 Những chữ liên tiếp nhau nằm trong danh sách này được coi là một tên
4970 riêng. Hàm \verb@mark_proper_name()@ bổ sung những nút $PROP$ vào lưới
4971 từ cho những tên riêng được tìm ra.
4973 Những từ viết hoa sai chính tả được bổ sung thêm vào lưới từ dựa vào
4974 lớp \verb@UpperWordState@.
4976 \subsection{Lỗi bàn phím}
4978 Lỗi bàn phím được cài đặt thông qua các lớp \verb@KeyRecover@,
4979 \verb@CharInserter@, \verb@CharEraser@, \verb@CharTransposer@ và
4980 hàm \verb@im_recover()@.
4982 %% Lớp \verb@KeyRecover@, cũng như các lớp Char\ldots{} khác, bao gồm ba hàm:
4983 %% \begin{itemize}
4984 %% \item \verb@init()@: khởi động đối tượng, nhận một chuỗi và số lỗi có
4985 %% thể có.
4986 %% \item \verb@step()@: trả về một chuỗi phát sinh từ lỗi bàn phím. Trả
4987 %% về \verb@false@ nếu không còn chuỗi nào nữa.
4988 %% \item \verb@done()@: hoàn tất sử dụng đối tượng, giải phóng các tài
4989 %% nguyên.
4990 %% \end{itemize}
4992 Hàm \verb@im_recover()@, gọi đến hai hàm \verb@vni_recover()@ và
4993 \verb@telex_recover()@ dùng để phục hồi phím từ hai kiểu gõ trên.
4995 Các hàm này được sử dụng trong hàm \verb@get_syllable_candidates()@.
4996 Các phần xử lý bàn phím khác cũng được xử lý trong hàm này.
4998 \section{Bắt lỗi chính tả}
5000 Trình bắt lỗi chính tả bao gồm hai lớp chính là lớp \verb@Text@. Lớp
5001 \verb@Text@ đại diện cho một đoạn văn bản trong toàn bộ văn bản. Lớp
5002 này thực hiện toàn bộ công đoạn tìm lỗi chính tả. Các chuỗi được sử
5003 dụng để giao tiếp giữa lớp này và các lớp khác là UTF-8.
5005 Các biến quan trọng trong lớp \verb@Text@:
5006 \begin{itemize}
5007 \item \verb@vspell@ trỏ đến đối tượng \verb@VSpell@ quản lý đối tượng
5008 này.
5009 \item \verb@offset@,\verb@length@: vị trí và độ dài của đoạn văn bản
5010 do đối tượng này xử lý, xét trong toàn bộ văn bản của \verb@vspell@.
5011 \end{itemize}
5013 Trong lớp \verb@Text@, hàm \verb@sentence_check()@ tiến hành kiểm
5014 tra chính tả một câu. Hàm này thực hiện hầu như toàn bộ công đoạn
5015 bắt lỗi chính tả, mô tả trong thuật toán~\vref{algo:Text::sentence_check}.
5016 Hàm \verb@syllable_check()@ kiểm lỗi tiếng~(thuật toán~\vref{algo:Text::syllable_check}).
5017 Hàm \verb@word_check()@ kiểm lỗi từ~(thuật toán~\vref{algo:Text::word_check}).
5019 %% Các hàm quan trọng trong lớp \verb@Text@:
5020 %% \begin{itemize}
5021 %% \item \verb@ui_syllable_check()@: Hàm ảo, được gọi khi đối tượng cần
5022 %% người dùng kiểm tra tính đúng sai của một tiếng.
5023 %% \item \verb@ui_word_check()@: Hàm ảo, được gọi khi đối tượng cần người
5024 %% dùng kiểm tra tính đúng sai của một từ.
5025 %% \item \verb@syllabel_check@: cho biết tiếng tại vị trí cho trước có
5026 %% đúng chính tả hay không.
5027 %% \item \verb@apply_separators()@: Áp dụng separator cho câu.
5028 %% \item \verb@get_separators()@: Lấy danh sách separator.
5029 %% \item \verb@sentence_check()@: Tiến hành kiểm tra chính tả một
5030 %% câu. Trả về \verb@true@ nếu không còn lỗi. Hàm này thực hiện hầu như
5031 %% toàn bộ công đoạn bắt lỗi chính tả, mô tả trong thuật
5032 %% toán~\vref{algo:Text::sentence_check}.
5033 %% \item \verb@syllable_check()@: Kiểm lỗi tiếng. Trả về \verb@true@ nếu
5034 %% không còn lỗi~(thuật toán~\vref{algo:Text::syllable_check}).
5035 %% \item \verb@word_check()@: Kiểm lỗi từ. Trả về \verb@true@ nếu
5036 %% không còn lỗi~(thuật toán~\vref{algo:Text::word_check}).
5037 %% \item \verb@replace()@: Thay thế một chuỗi con trong đoạn văn bản đang
5038 %% xét.
5039 %% \item \verb@substr()@: Lấy một chuỗi con trong đoạn văn bản đang xét.
5040 %% \end{itemize}
5042 \begin{algo}
5043 \caption{Text::sentence\_check()}
5044 \label{algo:Text::sentence_check}
5045 \begin{enumerate}
5046 \item Tách token.
5047 \item Chuẩn hoá các tiếng.
5048 \item Gọi \verb@syllable_check()@ để kiểm tra. Nếu có lỗi tiếng, gọi
5049 \verb@ui_syllable_check()@ để yêu cầu người dùng sửa lỗi, sau đó
5050 kết thúc (trả về \verb@false@ --- vẫn còn lỗi).
5051 \item Xây dựng lưới từ.
5052 \item Bổ sung lưới từ:
5053 \begin{itemize}
5054 \item Đánh dấu tên riêng.
5055 \item Áp dụng separator.
5056 \end{itemize}
5057 \item Xây dựng \verb@DAG@ tương ứng (tùy theo các thông số về
5058 tri\-gram, penalty~\ldots).
5059 \item Tìm cách tách từ tốt nhất.
5060 \begin{itemize}
5061 \item Nếu có chuẩn hoá, sử dụng Bellman-Ford.
5062 \item Nếu không có chuẩn hoá, sử dụng PFS.
5063 \end{itemize}
5064 \item Gọi \verb@word_check()@ để kiểm tra. Nếu có lỗi, gọi
5065 \verb@ui_word_check()@ để yêu cầu người dùng sửa lỗi, sau đó kết
5066 thúc (trả về \verb@false@ --- vẫn còn lỗi).
5067 \item Kết thúc, trả về \verb@true@ --- sạch lỗi.
5068 \end{enumerate}
5069 \end{algo}
5071 \begin{algo}
5072 \caption{Text::syllable\_check()}
5073 \label{algo:Text::syllable_check}
5074 \begin{enumerate}
5075 \item Duyệt lần lượt từng tiếng trong câu. Thực hiện:
5076 \begin{enumerate}
5077 \item Gọi \verb@VSpell::in_dict()@, kiểm tra $id$ xem tiếng đó có
5078 chưa. Nếu đã có, kết thúc (trả về \verb@true@ --- không có lỗi).
5079 \item Gọi \verb@StringArchive::in_dict()@, kiểm tra xem $cid$ của
5080 tiếng có trong từ điển tiếng không. Nếu có, phân tích tiếng, lấy
5081 dạng chữ thường, đúng quy cách bỏ dấu của tiếng. Kiểm tra xem tiếng
5082 mới có giống với tiếng cũ hay không (lỗi bỏ dấu sai vị trí). Nếu có,
5083 kết thúc (trả về \verb@true@ --- không có lỗi).
5084 \item Trả về \verb@false@ --- lỗi.
5085 \end{enumerate}
5086 \item Nếu trả về \verb@false@, đưa tiếng vào danh sách tiếng gặp
5087 lỗi. Tiếp tục duyệt các tiếng còn lại.
5088 \item Trả về \verb@true@ nếu danh sách các tiếng gặp lỗi là rỗng.
5089 \end{enumerate}
5090 \end{algo}
5092 \begin{algo}
5093 \caption{Text::word\_check()}
5094 \label{algo:Text::word_check}
5095 \begin{enumerate}
5096 \item Duyệt lần lượt các từ trong cách tách từ đã có.
5097 \item Lấy danh sách $id$ của các tiếng của từ --- \verb@sylls2@.
5098 \item Lấy danh sách $cid$ của các tiếng của từ --- \verb@sylls@.
5099 \item Nếu \verb@sylls@ không trùng khớp với các tiếng trong câu (dùng
5100 $cid$) và \verb@sylls2@ không có trong từ điển riêng của
5101 \verb@VSpell@, lưu từ vào danh sách từ gặp lỗi.
5102 \item Trả về \verb@true@ nếu danh sách các từ gặp lỗi là rỗng.
5103 \end{enumerate}
5104 \end{algo}
5106 Ta thấy \verb@Text@ là một lớp abstract. Một số hàm như
5107 \verb@ui_syllable_check()@, \verb@ui_word_check()@ cần phải được cài
5108 đặt trong lớp dẫn xuất. Đây là những hàm giao tiếp với người dùng. Tùy
5109 môi trường sử dụng mà các hàm này được cài đặt cho thích hợp. Dù cài
5110 đặt theo cách nào, nhiệm vụ của những hàm này vẫn như nhau: yêu cầu
5111 người dùng đưa ra quyết định. Sau khi lập danh sách từ đề nghị,
5112 \verb@Text@ sẽ gọi các hàm này. Các hàm này phải liệt kê danh sách từ
5113 đề nghị và chờ người dùng quyết định chọn từ nào.
5116 Lớp \verb@VSpell@ là lớp chính, đại diện cho mô hình bắt lỗi chính tả,
5117 được dùng để giao tiếp với chương trình sử dụng bắt lỗi chính tả. Lớp
5118 này sử dụng \verb@Text@ để tiến hành bắt lỗi chính tả.
5120 Lớp \verb@VSpell@ quản lý một từ điển riêng của chính nó, được bổ sung bởi
5121 người dùng. Do chương trình không thể đạt được một từ điển hoàn chỉnh,
5122 từ điển này được dùng để bổ sung cho từ điển đã có. Những ký hiệu, các
5123 từ nước ngoài~\ldots{} không được nhận diện bởi chương trình cũng sẽ
5124 được thêm vào từ điển này sau khi người dùng đã kiểm tra những từ đó
5125 và xác định rằng những từ đó là chính xác. \verb@VSpell@ bao gồm hai
5126 từ điển: từ điển từ (\verb@VSpell:words@) và từ điển tiếng
5127 (\verb@VSpell::syllables@).
5129 Ngoài ra \verb@VSpell@ còn duy trì một danh sách các separator
5130 (\verb@VSpell::sepaparators@). Hàm \verb@check()@ tiến hành kiểm lỗi chính tả cho một đoạn văn
5131 bản~(thuật toán~\vref{algo:VSpell::check}).
5133 %% Các hàm thường dùng trong \verb@VSpell@:
5134 %% \begin{itemize}
5135 %% \item \verb@init()@: Khởi động cơ chế bắt lỗi chính tả, nạp các tập
5136 %% tin liên quan~\ldots (bao gồm việc nạp từ điển, n\-gram, danh sách tên
5137 %% riêng).
5138 %% \item \verb@cleanup()@: Hủy bỏ toàn bộ dữ liệu của đối tượng, chuẩn bị để
5139 %% hủy bỏ đối tượng.
5140 %% \item \verb@check()@: tiến hành kiểm lỗi chính tả cho một đoạn văn
5141 %% bản~(thuật toán~\vref{algo:VSpell::check}). Văn bản được dùng ở dạng
5142 %% UTF-8.
5143 %% \item \verb@set_penalty()@: Đặt trọng số $w$ cho lớp \verb@PenaltyDAG@.
5144 %% \item \verb@get_penalty()@: Lấy trọng số $w$ của lớp
5145 %% \verb@PenaltyDAG@.
5146 %% \item \verb@set_normalization()@: Cho biết có áp dụng chuẩn hoá cách
5147 %% tách từ hay không.
5148 %% \item \verb@get_normalization()@: Như trên.
5149 %% \item \verb@set_trigram()@: Cho biết có áp dụng tri\-gram hay không.
5150 %% \item \verb@get_trigram()@: Như trên.
5151 %% \end{itemize}
5153 \begin{algo}
5154 \caption{VSpell::check()}
5155 \label{algo:VSpell::check}
5156 \begin{enumerate}
5157 \item Văn bản UTF-8 được lưu vào \verb@utf8_text@.
5158 \item Lặp
5159 \begin{enumerate}
5160 \item Chuyển văn bản từ UTF-8 sang VISCII, dùng
5161 \verb@viet_to_viscii_force@.
5162 \item Tách câu (\verb@sentences_split()@).
5163 \item Duyệt từng câu.
5164 \begin{enumerate}
5165 \item Tạo đối tượng \verb@Text@ mới
5166 (\verb@TextFactory::create()@).
5167 \item Đặt \verb@offset@,\verb@length@ cho đối tượng \verb@Text@.
5168 \item Gọi \verb@Text::sentence_check()@.
5169 \item Nếu trả về \verb@false@, ngừng duyệt các câu còn lại.
5170 \end{enumerate}
5171 \item Nếu \verb@sentence_check()@ trả về \verb@true@ với mọi câu,
5172 dừng lặp.
5173 \end{enumerate}
5174 \item Trả về \verb@true@.
5175 \end{enumerate}
5176 \end{algo}
5178 Lớp \verb@VSpell@ không sử dụng trực tiếp \verb@Text@ mà sử dụng lớp
5179 dẫn xuất từ \verb@Text@. Để tạo ra một đối tượng \verb@Text@,
5180 \verb@VSpell@ dựa vào đối tượng thuộc lớp \verb@TextFactory@. Đối
5181 tượng này có nhiệm vụ tạo ra đối tượng \verb@Text@ cho \verb@VSpell@.
5184 \subsection{Separator}
5186 Phần trên có đề cập đến ``separator''. Separator tồn tại vì bộ tách từ
5187 của chương trình không thể nào hoàn chỉnh. Separator giúp hỗ trợ
5188 trình tách từ tách đúng hơn. Separator là những dấu hiệu, chỉ ra rằng
5189 một vị trí nào đó trong câu là ranh giới từ, không thể tồn tại một từ
5190 đi ngang qua vị trí đó. Ví dụ, chương trình tách từ ``\mybox{ông}
5191 \mybox{quan tài} \mybox{thật} \mybox{đấy}''. Ta sẽ chen một separator vào
5192 giữa ``quan'' và ``tài''. Nhờ vậy, chương trình sẽ chọn ra một cách
5193 tách từ khác ``\mybox{ông} \mybox{quan} \mybox{tài} \mybox{thật}
5194 \mybox{đấy}''.
5196 Separator được sử dụng trong phần hiệu chỉnh lưới từ. Sau khi đã hoàn
5197 tất tạo lưới từ, thuật toán~\vref{algo:Text::apply_separators} sẽ duyệt qua toàn bộ lưới từ, loại bỏ bất
5198 cứ từ nào vi phạm separator.
5199 \begin{algo}
5200 \caption{Text::apply\_separators()}
5201 \label{algo:Text::apply_separators}
5202 \begin{enumerate}
5203 \item Sắp xếp danh sách separator theo thứ tự xuất hiện.
5204 \item Duyệt lần lượt từng separator, bắt đầu từ $0$.
5205 \begin{enumerate}
5206 \item Duyệt lần lượt tất cả các từ trong lưới từ.
5207 \item Loại bỏ những từ cắt ngang qua separator đang xét.
5208 \end{enumerate}
5209 \end{enumerate}
5210 \end{algo}
5212 \subsection{vspell-gtk}
5214 Như đã nói, các lớp trong \verb@VSpell@, \verb@Text@ chỉ tập trung vào
5215 phần xử lý văn bản. Phần giao tiếp được tách riêng (nằm trong hai hàm
5216 \verb@Text::ui_word_check()@ và
5217 \verb@Text::ui_syllable_check()@). Chương trình vspell-gtk được tạo ra
5218 nhằm mục đích minh hoạ cách cài đặt hai hàm này. Chương trình là một
5219 bộ bắt lỗi chính tả độc lập. Tuy nhiên, để chương trình thực sự hữu
5220 dụng, trình bắt lỗi chính tả nên được tích hợp với các chương trình
5221 liên quan đến xử lý văn bản như AbiWord, OpenOffice, GEdit,
5222 Evolution~\ldots
5224 Chương trình có giao diện như trong
5225 hình~\vref{fig:vspell-gtk-ui}. Sau khi nhập liệu, ta nhấn nút
5226 ``Check''. Chương trình kiểm lỗi hai giai đoạn: kiểm lỗi tiếng và kiểm
5227 lỗi từ. Phần được kiểm tra sẽ được tô sẫm. Các từ nhiều tiếng được
5228 gạch dưới. Những từ/tiếng bị sai được
5229 tô đậm. Từ đang được sửa sẽ được tô đỏ. Nhấn ``Ignore'' sẽ bỏ qua
5230 lỗi hiện tại, chuyển sang lỗi kế, lần lượt xoay vòng lỗi. Nhấn
5231 ``Ignore all'' sẽ bỏ qua hoàn toàn một giai đoạn kiểm lỗi (tiếng hoặc
5232 từ), chuyển qua giai đoạn kế (hoặc kết thúc quá trình kiểm tra). Để
5233 sửa lỗi, ta chọn từ trong khung ``Candidates'' hoặc tự nhập từ mới,
5234 sau đó nhấn nút ``Enter'' bên cạnh.
5235 \begin{figure}[htbp]
5236 \centering
5237 \includegraphics[width=\textwidth]{vspell-gtk}
5238 \caption{Giao diện vspell-gtk}
5239 \label{fig:vspell-gtk-ui}
5240 \end{figure}
5242 vspell-gtk tạo lớp \verb@MyText@ dẫn xuất từ \verb@Text@. Các hàm
5243 \verb@ui_syllable_check()@ và \verb@ui_word_check()@ được cài đặt như
5244 trong thuật toán~\vref{algo:MyText::ui_syllable_check}
5245 và~\vref{algo:MyText::ui_word_check}. \verb@MyText@ có thêm vài hàm phụ
5246 để hiển thị như \verb@show_wrong_syllables()@,
5247 \verb@show_wrong_words()@ và \verb@show_words()@.
5250 \begin{algo}
5251 \caption{MyText::ui\_syllable\_check()}
5252 \label{algo:MyText::ui_syllable_check}
5253 \begin{enumerate}
5254 \item Duyệt lần lượt từng tiếng bị sai trong danh sách tiếng sai.
5255 \item Hiện tiếng sai dùng hàm \verb@show_wrong_syllables()@.
5256 \item Lập danh sách tiếng đề nghị dùng
5257 \verb@get_syllable_candidates()@, hiện thị danh sách tiếng lên màn
5258 hình.
5259 \item Đặt \verb@processed@, \verb@ignore_all@, \verb@ignore@ là
5260 \verb@false@.
5261 \item Lặp liên tục (nhường quyền xử lý cho Gtk+) cho đến khi biến
5262 \verb@ignore@ hoặc \verb@ignore_all@ hoặc \verb@processed@ là
5263 \verb@true@. (Khi các nút tương ứng được nhấn, giá trị các biến này
5264 sẽ bị thay đổi).
5265 \item Nếu \verb@ignore@ là \verb@true@, quay lại từ đầu (chuyển qua từ bị sai
5266 kế tiếp).
5267 \item Nếu \verb@ignore_all@ là \verb@true@, kết thúc (trả về
5268 \verb@true@ --- ``sạch lỗi'' do người dùng không muốn kiểm tra lỗi
5269 tiếng nữa).
5270 \item Nếu \verb@processed@ là \verb@true@.
5271 \begin{enumerate}
5272 \item Lấy tiếng do người dùng chọn (hoặc nhập mới).
5273 \item Thay thế tiếng bị sai trong câu bằng tiếng của người dùng.
5274 \item Thêm tiếng này vào từ điển tiếng của \verb@VSpell@.
5275 \item Kết thúc, trả về \verb@false@ --- còn lỗi.
5276 \end{enumerate}
5277 \end{enumerate}
5278 \end{algo}
5280 \begin{algo}
5281 \caption{MyText::ui\_word\_check()}
5282 \label{algo:MyText::ui_word_check}
5283 \begin{enumerate}
5284 \item Duyệt lần lượt từng từ bị sai trong danh sách từ sai.
5285 \item Hiện từ sai dùng hàm \verb@show_wrong_words()@.
5286 \item Lập danh sách từ đề nghị dùng từ được dùng trong cách tách từ
5287 đùng khi áp dụng mô hình ngôn ngữ.
5288 % \verb@get_syllable_candidates()@, hiện thị danh sách tiếng lên màn
5289 % hình.
5290 \item Đặt \verb@processed@, \verb@ignore_all@, \verb@ignore@ là
5291 \verb@false@.
5292 \item Lặp liên tục (nhường quyền xử lý cho Gtk+) cho đến khi biến
5293 \verb@ignore@ hoặc \verb@ignore_all@ hoặc \verb@processed@ là
5294 \verb@true@. (Khi các nút tương ứng được nhấn, giá trị các biến này
5295 sẽ bị thay đổi).
5296 \item Nếu \verb@ignore@ là \verb@true@, quay lại từ đầu (chuyển qua từ bị sai
5297 kế tiếp).
5298 \item Nếu \verb@ignore_all@ là \verb@true@, kết thúc (trả về
5299 \verb@true@ --- ``sạch lỗi'' do người dùng không muốn kiểm tra lỗi
5300 từ nữa).
5301 \item Nếu \verb@processed@ là \verb@true@.
5302 \begin{enumerate}
5303 \item Lấy từ do người dùng chọn (hoặc nhập mới).
5304 \item Tìm ký tự `\verb@|@'. Các ký tự này đại diện cho
5305 separator. Nếu có, thêm những separator này vào \verb@VSpell@, kết thúc
5306 --- trả về \verb@false@.
5307 \item Thay thế từ bị sai trong câu bằng từ của người dùng.
5308 \item Thêm từ này vào từ điển từ của \verb@VSpell@.
5309 \item Kết thúc, trả về \verb@false@ --- còn lỗi.
5310 \end{enumerate}
5311 \end{enumerate}
5312 \end{algo}
5314 \section{Huấn luyện}
5316 \subsection{Dữ liệu huấn luyện}
5317 \label{sec:data-preprocessing}
5319 Dữ liệu gốc bao gồm: danh sách từ và các văn bản tiếng Việc thu thập
5320 từ mạng VnExpress\footnote{http://www.vnexpress.net}.
5322 Nhiệm vụ:
5323 \begin{itemize}
5324 \item Tạo danh sách tiếng, chuẩn hoá danh sách tiếng.
5325 \item Tiền xử lý ngữ liệu.
5326 \item Huấn luyện n\-gram, tạo ra dữ liệu n\-gram.
5327 \end{itemize}
5330 \subsection{Dữ liệu nguồn}
5331 \label{sec:data-source}
5333 Dữ liệu nguồn bao gồm danh sách từ và ngữ liệu tiếng Việt. Dữ liệu
5334 được lưu dưới dạng mã VISCII.
5335 \subsubsection{Danh sách từ}
5337 Đây là một tập tin văn bản lưu tất cả các từ được dùng trong tiếng
5338 Việt, mỗi từ một dòng. Các chữ cách bởi một khoảng trắng.
5341 \subsubsection{Ngữ liệu huấn luyện}
5343 Bao gồm một loạt các tập tin văn bản tiếng Việt. Mỗi dòng là một đoạn
5344 văn bản.
5346 %% \subsection{Danh sách tiếng}
5347 %% \label{sub:syllable-list}
5349 %% Danh sách tiếng chứa mọi tiếng thông dụng nhất được sử dụng trong
5350 %% tiếng Việt. Danh sách này được rút trích từ danh sách từ, sau đó được
5351 %% lưu ở dạng chuẩn hoá.
5353 %% Danh sách tiếng được rút trích tự động khi chương trình nạp danh sách
5354 %% từ.
5356 %Chương trình syllable-extract được dùng để tạo danh sách này. Cách
5357 %dùng:
5358 %\begin{verbatim}
5359 %$syllable-extract < word-list > syllable-list
5360 %\end{verbatim}
5363 \subsection{Tiền xử lý ngữ liệu huấn luyện}
5364 \label{sec:training-data-preprocessing}
5366 Dữ liệu thu được từ VnExpress bao gồm một loạt các file html, chia
5367 thành nhiều thư mục.
5369 htmltidy được sử dụng để chuyển dữ liệu html về dạng xhtml. Các file
5370 html của VnExpress không hoàn toàn tuân theo chuẩn html, bao gồm hai
5371 trường hợp:
5373 \begin{itemize}
5374 \item Sử dụng tag <vne>
5375 \item Không đóng tag <frame>
5376 \end{itemize}
5378 Hai lỗi này được tự động phát hiện và sửa chữa trước khi chuyển dữ
5379 liệu cho htmltidy.
5381 Sau khi chạy htmltidy, ta được dữ liệu xhtml hợp khuôn dạng. Phân tích
5382 các tài liệu này cho thấy phần nội dung chính thường nằm trong tag
5383 <vne>, hoặc trong tag <table> với thuộc tính id là
5384 ``CContainer''. XSLT được sử dụng để lọc ra phần nội dung nằm giữa hai
5385 tag này (\verb#z.xslt#).
5387 Trình \verb#convert.sh# sẽ thực hiện bước htmltidy và xslt ở trên. Cách sử
5388 dụng:
5389 \begin{verbatim}
5390 convert.sh < input > output
5391 \end{verbatim}
5393 Sau bước này, ta cần lọc bỏ các tag, loại bỏ các entity~\ldots{}{} để
5394 đưa dữ liệu về dạng văn bản thuần túy. Do số lượng tag được định nghĩa
5395 html rất nhiều nên chỉ xử lý những tag nào được sử dụng trong
5396 VnExpress (thông qua chương trình \verb#gettags.pl#). Các tag này được loại
5397 bỏ bằng \verb#html2text.pl#. Các mã utf-8 được sử dụng trong
5398 VnExpress (thông qua chương trình \verb#z.c#) được chuyển về mã VISCII
5399 qua \verb#z.cpp#. Các entity còn lại (lấy bằng \verb#list-entity.pl#)
5400 được xử lý trong \verb#html2text.pl#.
5402 \verb#html2text.pl# sử dụng các tag để tách dữ liệu thành các đoạn. Dữ
5403 liệu sau cùng là các tập tin văn bản, mỗi dòng là một đoạn.
5405 \subsection{Huấn luyện dữ liệu}
5406 \label{sub:training-data}
5408 Chương trình \verb#wfst-train# được dùng để huấn luyện dữ liệu. Thông
5409 tin nhập là danh sách từ, danh sách tiếng, n\-gram (nếu có). Thông tin
5410 xuất là n\-gram mới.
5412 Quy trình xử lý của trình huấn luyện được nêu trong thuật
5413 toán~\vref{algo:training}. Chương trình được lặp đi lặp lại nhiều lần.
5415 \begin{algo}
5416 \caption{Quy trình huấn luyện}
5417 \label{algo:training}
5418 \begin{enumerate}
5419 \item Đọc từng dòng.
5420 \item Tách câu.
5421 \item Táck token.
5422 \item Xây dựng lưới từ (\verb@Lattice::construct()@).
5423 \item Tìm cách tách từ tốt nhất.
5424 \item Thống kê n\-gram cho câu.
5425 \item Xử lý câu kế tiếp.
5426 \end{enumerate}
5427 \end{algo}
5429 \section{Linh tinh}
5431 \subsection{Xử lý bảng mã}
5433 Chương trình giao tiếp bằng Unicode UTF-8. Tuy nhiên, để tiện việc xử
5434 lý, nội bộ chương trình sử dụng mã VISCII. Do VISCII không thể bao
5435 quát hết Unicode, những ký tự Unicode không có trong VISCII sẽ được
5436 thay bằng một ký tự đặc biệt (coi như là ký tự không biết). Sau khi xử
5437 lý VISCII xong, chuỗi so sánh thật sự sẽ là chuỗi Unicode. Hầu hết các
5438 lớp sử dụng VISCII. Hai lớp sử dụng cả UTF-8 và VISCII là
5439 \verb@VSpell@ và \verb@Text@.
5441 \subsection{So sánh chuỗi}
5443 Do mọi chuỗi đều được lưu thành strid. Việc so sánh chuỗi không phân biệt
5444 hoa thường là không thể thực hiện được. Do vậy, ngoài strid ``id'' tham chiếu
5445 đến chuỗi gốc, ta sử dụng thêm ``cid'' tham chiếu đến chuỗi được dùng để
5446 so sánh chuỗi. ``cid'' mặc định trong câu tham chiếu đến chuỗi đã
5447 chuẩn hoá. Nếu cần, ``cid'' sẽ tham chiếu đến chuỗi chuẩn hoá, viết
5448 thường.
5450 Khi cần thiết phải so sánh chuỗi thật sự, chương trình sẽ dùng ``id''
5451 để truy ngược đến chuỗi gốc, sau đó thực hiện phép so sánh chuỗi thông thường.
5453 \subsection{Xử lý tiếng Việt}
5455 Một số hàm được tạo ra để hỗ trợ việc xử lý tiếng Việt, bao gồm:
5456 \begin{itemize}
5457 \item \verb@viet_toupper@, \verb@viet_tolower@, \verb@viet_isupper@, \verb@viet_islower@,
5458 \verb@viet_isalpha@, \verb@viet_isdigit@, \verb@viet_isxdigit@, \verb@viet_isspace@,
5459 \verb@viet_ispunct@: Các hàm tiếng Việt thay thế cho các hàm gốc (toupper,
5460 tolower~\ldots)
5461 \item \verb@viet_utf8_to_viscii()@: Chuyển từ UTF-8 sang VISCII. Trả
5462 về \verb@false@ nếu không thể chuyển đổi.
5463 \item \verb@viet_utf8_to_viscii()@: Chuyển từ UTF-8 sang VISCII. Những
5464 ký tự không thể chuyển được sẽ được thay bằng `z'.
5465 \item \verb@viet_viscii_to_utf8()@: Chuyển từ VISCII sang UTF-8.
5466 \end{itemize}
5470 \chapter{Đánh giá và kết luận}
5471 \tolerance=200%reset tolerance because i used infinitive tolerance in
5472 %the last chapter
5473 \label{cha:conclusion}
5474 %TOC
5475 \minitoc
5477 \section{Tóm tắt}
5479 Sau đây là tóm tắt các đặc điểm mô hình được đề nghị:
5480 \begin{itemize}
5481 \item Áp dụng mô hình tách từ mờ dựa trên n\-gram (bi\-gram và tri\-gram).
5482 \item Cấu trúc dữ liệu dựa trên lưới từ --- một dạng đồ thị có
5483 hướng không chu trình. Nhờ đó có thể áp dụng thuật toán tìm đường
5484 trên đồ thị có hướng để tìm ra cách tốt từ tốt nhất.
5485 \item Sử dụng lưới~2-từ cho tri\-gram, các thuật toán làm việc trên
5486 bi\-gram sẽ vẫn làm việc với tri\-gram thông qua lưới~2-từ.
5487 \item Đồ thị được hiệu chỉnh để tạo
5488 ra sự khác biệt giữa từ gốc và các từ phát sinh bằng cách điều chỉnh
5489 giá trị các cạnh nối đến từ phát sinh.
5490 \item Loại bỏ khả năng cách tách từ
5491 chứa ít từ hơn có khả năng được chọn cao hơn cách tách từ có nhiều từ
5492 hơn bằng cách chuẩn hoá các cách tách từ thông qua lưới từ động.
5493 \item Áp dụng đảo ngược lỗi để phục hồi lỗi phát âm và lỗi bàn
5494 phím. Lỗi bàn phím bao gồm lỗi gõ thiếu phím, dư phím, nhầm phím,
5495 nhầm thứ tự hai lần gõ. Ngoài ra còn có lỗi do bộ gõ như VNI và
5496 TELEX.
5497 \item Sử dụng soft-count để huấn luyện n\-gram nhằm tạo ra mô hình ngôn
5498 ngữ tốt hơn.
5499 \end{itemize}
5501 %% \subsection{Ưu điểm}
5503 %% \begin{itemize}
5504 %% \item
5505 %% \end{itemize}
5507 \section{Thử nghiệm}
5509 Chương trình được huấn luyện dựa trên ngữ liệu từ các bài báo của mạng
5510 VnExpress.net. Ngữ liệu sử dụng có kích thước 12283822 byte, bao gồm
5511 2602105 chữ, khoảng 379000
5512 câu\footnote{xem phần~\vref{sec:model:sentence-segmentation} để biết
5513 các quy tắc tách câu}. Trình huấn luyện chạy trong vòng 18 phút,
5514 trung bình khoảng 350 câu một giây. Dữ
5515 liệu xuất bao gồm 76682 uni\-gram, 561796 bi\-gram, 1729882 tri\-gram với
5516 kích thước tổng cộng 71084052 byte. Mô
5517 hình ngôn ngữ n\-gram-tiếng bao gồm 76224 uni\-gram và 324326 bi\-gram
5518 (8489570 byte). Dữ
5519 liệu tên riêng bao gồm 790 tiếng tạo thành tên người, rút trích từ
5520 7567 tên. Từ điển từ bao gồm 73940 từ, bao gồm 12332 tiếng.
5522 Chương trình được thử nghiệm dựa trên hai tập dữ liệu. Một tập được rút ra
5523 từ~\cite{LoiChinhTa}. Tập dữ liệu thứ hai sử dụng đoạn đầu luận văn này,
5524 sau đó phát sinh lỗi dựa trên tập những tiếng nhập nhằng. Các lỗi về
5525 nhập liệu không được kiểm tra ở đây mà chủ yếu tập trung vào lỗi phát âm.
5527 Chương trình được
5528 thử nghiệm với nhiều tham số khác nhau, bao gồm:
5529 \begin{itemize}
5530 \item Sử dụng tri\-gram hay bi\-gram (P).
5531 \item Chuẩn hoá độ dài câu hay không (C).
5532 \item Bắt lỗi chặt hay không (S).
5533 \item Áp dụng heuristic phát sinh từ dựa trên ngữ cảnh hay không (H).
5534 \end{itemize}
5536 Kết quả thử nghiệm tên tập dữ liệu 1 được thể hiện trong
5537 bảng~\vref{tab:result1}. Kết quả thử nghiệm tên tập dữ liệu 2 được thể
5538 hiện trong bảng~\vref{tab:result2}. Kết quả được phân thành ba nhóm:
5539 non-word, real-word và total. Nhóm non-word bao gồm những câu phạm cả
5540 lỗi non-word lẫn real-word. Nhóm real-word bao gồm những câu chỉ phạm
5541 lỗi real-word. Nhóm total tính trung bình cả hai trường hợp. Ba kết
5542 quả PE, NE, CE là:
5543 \begin{itemize}
5544 \item PE là tỉ lệ bắt đúng lỗi chính tả, và trong danh sách từ đề nghị
5545 có từ đúng.
5546 \item NE là số lần bắt nhầm lỗi chính tả trong câu.
5547 \item CE là tỉ lệ bắt đúng lỗi chính tả, nhưng trong danh sách từ đề
5548 nghị không có từ đúng.
5549 \end{itemize}
5551 \begin{sidewaystable}
5552 \centering
5553 \begin{tabular}{cccc|rrr|rrr|rrr}
5554 %Trigram&Chuẩn hóa&Bắt lỗi chặt&Heuristic&Đúng&Sai&Nhảm\\\hline
5555 \multicolumn{4}{c|}{Tham số}&\multicolumn{3}{c|}{Non-word}&\multicolumn{3}{c|}{Real-word}&\multicolumn{3}{c}{Total}\\
5556 T&C&S&H&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c|}{CE(\%)}&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c|}{CE(\%)}&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c}{CE(\%)}\\\hline\hline
5557 \input{result1.tab}
5558 \end{tabular}
5559 \caption{Kết quả thử nghiệm tập dữ liệu 1}
5560 \label{tab:result1}
5561 \end{sidewaystable}
5563 \begin{sidewaystable}
5564 \centering
5565 \begin{tabular}{cccc|rrr|rrr|rrr}
5566 %Trigram&Chuẩn hóa&Bắt lỗi chặt&Heuristic&Đúng&Sai&Nhảm\\\hline
5567 \multicolumn{4}{c|}{Tham số}&\multicolumn{3}{c|}{Non-word}&\multicolumn{3}{c|}{Real-word}&\multicolumn{3}{c}{Total}\\
5568 T&C&S&H&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c|}{CE(\%)}&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c|}{CE(\%)}&\multicolumn{1}{c}{PE(\%)}&\multicolumn{1}{c}{NE(\%)}&\multicolumn{1}{c}{CE(\%)}\\\hline\hline
5569 \input{result2.tab}
5570 \end{tabular}
5571 \caption{Kết quả tập thử nghiệm dữ liệu 2}
5572 \label{tab:result2}
5573 \end{sidewaystable}
5575 Với nhóm non-word, trong thực tế khi phạm lỗi non-word, chương trình
5576 sẽ yêu cầu người dùng sửa hết lỗi trước khi tìm lỗi real-word. Do chương
5577 trình kiểm tra chạy tự động nên bước yêu cầu người dùng sửa lỗi
5578 non-word được bỏ qua. Việc này làm giảm một phần độ chính xác so với
5579 thực tế.
5581 Kết quả này cho thấy hiệu suất của chương trình phụ thuộc vào loại văn
5582 bản cần kiểm tra. Với tập dữ liệu 1, xác suất bắt lỗi đúng cao nhất
5583 chỉ có thể đạt khoảng 53\% trong khi với tập dữ liệu 288\%. Độ
5584 chênh lệch này có thể do tập dữ liệu 1 sử dụng văn phong khác so với
5585 ngữ liệu huấn luyện (văn phong báo chí). Ngoài ra do tập dữ liệu 1 được dùng để
5586 làm bài tập bắt lỗi chính tả nên đưa ra những trường hợp lỗi tương đối khó.
5588 Việc thay đổi các tham số cũng ảnh hưởng đáng kể đến độ chính
5589 xác. Việc áp dụng chuẩn hóa độ dài câu, lẽ ra sẽ cải thiện kết quả,
5590 nhưng thực tế lại giảm độ chính xác đáng kể. Tham số S nhìn chung tăng
5591 PE, nhưng đồng thời cũng tăng NE. Việc tăng NE khi áp dụng S cho thấy
5592 mô hình ngôn ngữ chưa thật sự tốt, chưa tìm ra chính xác câu đúng mà
5593 có khuynh hướng tìm nhầm. Áp dụng H kèm với S giúp giảm bớt NE phần
5594 nào, nhưng đồng thời cũng giảm PE. Cuối cùng, việc sử dụng trigram
5595 nhìn chung giúp tăng độ chính xác. Tuy nhiên sử dụng trigram cũng làm
5596 giảm tính thực tế của chương trình vì dữ liệu trigram lớn hơn rất
5597 nhiều so với bigram (khoảng 6--7 lần).
5599 Như vậy, qua khảo sát, ta thấy nên áp dụng trigram, bắt lỗi chặt kèm
5600 heuristic. Độ chính xác real-word trong trường hợp này là 42,91\% và
5601 86,62\%. Ngoài ra tỉ lệ NE cũng không quá cao.
5603 \section{Đánh giá}
5605 So với các phương pháp khác đã được áp dụng để bắt lỗi chính tả tiếng
5606 Việt, phương pháp được tiến hành một cách có hệ thống, dựa trên ngữ
5607 liệu huấn luyện sẵn có (từ công trình Luận án Tiến sĩ Ngôn ngữ học của
5608 TS. Đinh Điền), bảo đảm tính chính xác khi hoạt động. Phương
5609 pháp được dùng trong~\cite{Tuoi} không khả thi do chưa thực hiện tách
5610 từ (dùng heuristic để đánh giá các cách tách từ). Phương pháp được dùng
5611 trong~\cite{vietdecisionlist} sử dụng mô hình Markov ẩn để tạo ngữ
5612 liệu tách từ từ ngữ liệu thô, do đó không bảo đảm tính chính xác của
5613 ngữ liệu huấn luyện. Phương pháp được dùng trong chương trình bắt lỗi
5614 chính tả VietSpell của tác giả Lưu Hà Xuyên chỉ sử dụng heuristic,
5615 không tách từ.
5617 Tuy nhiên, chương trình vẫn có một số hạn chế nhất định.
5618 Do chỉ sử dụng thông tin về xác
5619 suất xuất hiện của một chuỗi từ liên tục khi tách từ mở nên kết quả có phần hạn
5620 chế. Trong nhiều trường hợp ta có thể khử nhập nhằng bằng từ loại,
5621 bằng thông tin cú pháp, hoặc thông tin về ngữ nghĩa. Thông tin xác
5622 suất lẽ ra chỉ là giải pháp bổ trợ cho các thông tin trên. Khi những
5623 thông trên không hoàn chỉnh, không bao quát hết hoặc không thể khử
5624 nhập nhằng toàn bộ, khi đó ta mới dùng thống kê như một giải pháp dự
5625 phòng.
5627 Chính vì chỉ sử dụng n\-gram dựa trên từ, đôi khi chương trình sẽ chọn
5628 lầm cách tách từ, dẫn đến việc thông báo từ sai chính tả trong khi từ
5629 đó hoàn toàn đúng.
5631 Phần kiểm tra từ viết hoa vẫn còn là một vấn đề chưa thể giải quyết
5632 trọn vẹn do viết hoa đúng quy cách đôi khi đòi hỏi ta phải hiểu ý
5633 nghĩa của từ viết hoa. Điều này hiện tại không thể thực hiện được.
5635 %% \begin{itemize}
5636 %% \item Không sử dụng những thông tin cấp cao hơn.
5637 %% \item Có khả năng nó tự động sửa từ đúng thành từ sai, do từ sai
5638 %% ``hay'' được dùng trong câu đó hơn là từ đúng :-P
5639 %% \end{itemize}
5641 \section{Hướng phát triển}
5642 \label{sec:todo}
5645 Việc áp dụng mô hình ngôn ngữ để bắt lỗi chính tả không phải là lựa
5646 chọn duy nhất. Ta có thể áp dụng các mô hình khác để bắt lỗi chính
5647 tả. Tuy nhiên, phần này sẽ chỉ đề cập đến những hướng phát triển dự
5648 trên việc áp dụng mô hình ngôn ngữ.
5650 Việc đầu tiên có thể nghĩ đến để cải thiện chất lượng bắt lỗi chính tả
5651 là làm giàu nguồn tri thức được sử dụng. Trình bắt lỗi chính tả hiện
5652 thời chỉ sử dụng dữ liệu thô. Đây là một trong yếu tố làm giảm chất
5653 lượng chương trình. Ta có thể sử dụng mô hình ngôn ngữ dựa trên từ
5654 loại, đồng thời áp dụng mạng ngữ nghĩa hoặc thông tin cú pháp (được
5655 dùng trong các phương pháp Mật độ ngữ nghĩa và Văn phạm ràng
5656 buộc). Đây là một hướng phát triển lâu dài, đòi hỏi rất nhiều công
5657 sức.
5659 Ta có thể cải thiện tốc độ bằng cách cải tiến các heuristic được dùng
5660 để hiệu chỉnh lưới từ. Hai heuristic quan trọng là heuristic phân biệt
5661 từ gốc và từ phát sinh, và heuristic phân biệt các từ phát sinh với
5662 nhau (dựa vào ngữ cảnh từ gốc). Heuristic chỉ có thể được cải thiện
5663 bằng cách rút trích thông tin thực tế để biết được từ nào thường được
5664 phát sinh hơn từ nào (nói cách khác, những từ nào là lỗi sai thông
5665 dùng của từ nào). Heuristic phản ánh cách tìm lỗi chính tả của con
5666 người. Ở đây việc đánh giá những từ có khả năng sai chính tả dựa trên
5667 chuỗi n\-gram của các tiếng không phải là một giải pháp hoàn hảo. Ta
5668 cần tìm ra những phương pháp khác nhằm phát hiện từ có khả năng sai
5669 chính tả tốt hơn. Những giải pháp bắt lỗi chính tả cảm ngữ cảnh của
5670 tiếng Anh có thể là một khởi đầu để tìm cách giải quyết.
5672 Ngoài ra bắt lỗi chính tả cảm ngữ cảnh cũng là một cách tiếp cận. Vấn
5673 đề của bắt lỗi chính tả cảm ngữ cảnh là áp dụng trên một cách tách từ
5674 biết trước, không thay đổi. Hướng phát triển có thể là hiệu chỉnh để
5675 áp dụng bắt lỗi chính tả cảm ngữ cảnh trên lưới từ, thay vì trên một
5676 cách tách từ cố định. Một cách khác đơn giản hơn là áp dụng bắt lỗi
5677 chính tả cảm ngữ cảnh trên từng cách tách từ có thể có trên lưới từ
5678 rồi định lượng để phát hiện lỗi. Do số lượng cách tách từ trên lưới từ
5679 là rất lớn, có thể ta chỉ cần xét n cách tách từ tốt nhất mà thôi.
5683 %% Do số lượng từ ít, từ ngắn nên lỗi real-word nhiều hơn lỗi non-word --> CSS quan trọng!
5685 %% \begin{itemize}
5686 %% \item Loại bỏ SRILM.
5687 %% \item Các hướng cải tiến EM.
5688 %% \item Tư tưởng cơ bản hiện thời là phát sinh mọi trường hợp tương tự
5689 %% với trường hợp đang xét và hy vọng giải pháp đúng cũng nằm trong
5690 %% đó. Cách này có hai điểm cần bàn:
5691 %% \begin{itemize}
5692 %% \item Khi nào nên phát sinh, khi nào không? Nói cách khác, khi nào
5693 %% ta ``cảm thấy'' chỗ đó có thể bị sai? Statistic/Genetic approach?
5694 %% \item Khi phát sinh, nên đánh giá tầm quan trọng của các cách phát
5695 %% sinh cho hợp lý, không nên đánh đồng như hiện nay. How can i do
5696 %% that?
5697 %% \end{itemize}
5699 %% Tách từ không đúng thì bắt lỗi sai. Mà phát sinh quá nhiều thì có
5700 %% thể tách từ sẽ sai do có nhiều câu đúng trong đó (giả sử LM hoàn
5701 %% hảo).
5703 %% Chuyện phát sinh là chuyện hơi kẹt. Do hiện thời chỉ dựa trên lỗi
5704 %% phát âm nên số lượng ít. Nếu áp dụng thêm các lỗi khác (đặc biệt là
5705 %% lỗi bàn phím) thì số lượng sẽ tăng đáng kể và {\em xuất hiện những
5706 %% câu đúng mới} (giống như việc loại bỏ dấu, sau đó thêm dấu vô sẽ có
5707 %% nhiều câu hợp lý).
5708 %% \begin{itemize}
5709 %% \item Cách đầu tiên là chỉ phát sinh khi cần thiết ---
5710 %% khá khó vì làm sao biết chỗ nào cần phát sinh?
5711 %% \item Cách khác là lợi dụng đặc điểm của bắt lỗi chính tả. Khác với
5712 %% tách từ thuần túy, lưới từ bắt lỗi chính tả chứa nhiều từ cùng độ
5713 %% dài (cùng một ``khuôn''). Làm cách nào đó để nhóm những từ này
5714 %% lại, tránh lãng phí khi truy tìm nhiều cách trên cùng một khuôn.
5715 %% \end{itemize}
5716 %% \item Ngoài cách đang làm, còn hướng nào khác không? Liệu speech
5717 %% recognition/OCR có ý kiến nào hay không? Cần tìm hiểu mọi thứ liên
5718 %% quan đến ``error tolerance''
5719 %% \end{itemize}
5722 %% \section{Độ chính xác của tách từ}
5724 %% Tách từ dựa trên tư tưởng ``tìm ra câu đúng nhất''. Nếu ``câu đúng
5725 %% nhất'' được tìm ra không phải là câu đúng nhất thì dẫn đến tách từ
5726 %% sai. Vấn đề ở chỗ câu mà tách từ tìm ra và câu thực tế sai khác như
5727 %% thế nào. Do các từ thường ngăn (1--2 chữ) nên khả năng trùng nhau là
5728 %% rất lớn. Có mối quan hệ nào giữa việc tìm câu đúng sai và cho ra cách
5729 %% tách từ đúng hay không? $\rightarrow$ không biết.
5731 %% Giả định LM hoàn hảo. Nếu Lattice càng rộng thì khả năng tìm lộn sang
5732 %% câu khác càng lớn. Nên dùng Winnow để thêm dần các từ mới. Một trường
5733 %% hợp nữa là dùng Winnow để loại bỏ các từ không hợp lý, được không??
5734 %% Một Lattice lí tưởng sẽ cho ra kết quả lí tưởng.
5736 %% Giải pháp khác là áp dụng Winnow để sửa chữa cách tách từ sau
5737 %% cùng. Nghe hơi hoang tưởng?
5739 %% Sau khi chọn được cách tách từ thì nên dùng những từ trong cách tách
5740 %% từ đúng hay lại áp dụng Winnow? Rõ ràng hiện thời LM vẫn còn sai
5741 %% nhiều. Tuy nhiên, ``dường như'' các lỗi phát âm thường có chiều dài từ
5742 %% ngang nhau. Nghĩa là trong trường hợp tìm sai, khả năng tách từ đúng
5743 %% vẫn lớn. Vậy tốt hơn nên dùng Winnow?
5745 %% Ok. Winnow và loại bỏ các nút đáng ngờ trong lưới từ.
5748 %% \section{Khi nào cần phát sinh}
5750 %% Cách đầu tiên là dựa trên thông tin thống kê, tìm xem giá trị trung
5751 %% bình của liên kết giữa các từ là bao nhiêu. Nếu liên kết trong lưới từ
5752 %% thấp hơn ngưỡng này thì phát sinh từ mới.
5754 %% Áp dụng CSS để phát sinh thêm từ ???
5756 %% Trước hết, tạo lưới từ cơ sở. Sau đó duyệt qua từng cách tách từ, áp
5757 %% dụng CSS để tạo thêm một số từ liên quan.
5758 %% \begin{itemize}
5759 %% \item Thay thế từ bằng từ do CSS đề nghị --> ảnh hưởng đến CSS ở các
5760 %% chỗ khác. Giải pháp genetic hay phân nhánh. Tách làm hai lưới từ
5761 %% (một cũ, một mới) sau đó lại áp dụng CSS trên các cách khác ???
5762 %% \item Thêm vào thay vì thay thế --> ``càng rộng thì càng dễ sai''
5763 %% \end{itemize}
5765 %% Chọn đại một cách tách từ, sau đó giao cho CSS. CSS được mở rộng để không
5766 %% chỉ thay từ, mà thay cả ranh giới từ.
5768 %% \section{Áp dụng context-sensitive spelling checking}
5770 %% Các giải pháp spelling checking đều dựa trên câu tách từ sẵn. Xét theo
5771 %% quan điểm của lưới từ là chọn một đường đi, sau đó áp dụng spelling
5772 %% checking. Để áp dụng CSS ta có thể đưa nó vô lưới từ thay vì chỉ nằm
5773 %% trên một đường đi duy nhất trên lưới từ. Nói cách khác, ta chuyển từ
5774 %% đồ thì ``một đường'' thành một đồ thị đúng nghĩa.
5776 %% Với các phương pháp sử dụng từ ngữ cảnh, thay vì chỉ xét những từ nằm
5777 %% trên đường đi, ta xét những từ nằm trên các đường đi khác nhau --
5778 %% trong một phạm vi nhất định. Khi chọn được một từ thì cũng đồng nghĩa
5779 %% giới hạn số lưới từ có khả năng lại.
5781 %% Với các phương pháp dùng collocation, ta cũng có thể mở rộng ra lưới
5782 %% từ, tìm trên nhiều đường thay vì chỉ một đường.
5784 %% Vấn đề đối với việc áp dụng những phương pháp này là khả năng ``đoán
5785 %% sai''. Ví dụ, có một từ trong lưới từ có ảnh hưởng lớn đến quyết định
5786 %% chọn từ khác. Khi từ đó được sử dụng, nó sẽ loại bỏ các cách tách từ
5787 %% không chứ nó. Nếu từ đó {\em không} phải là từ đúng thì coi như ta đã
5788 %% suy luận dựa trên những chứng cớ không đáng tin cậy (độ tin cậy?).
5790 %% Có thể duyệt từng cách tách từ, áp dụng CSS. Sau đó làm sao biết nên
5791 %% dùng cách tách từ nào ??? Lại dùng n\-gram?
5793 %% Túm lại có ba vấn đề:
5794 %% \begin{itemize}
5795 %% \item Nếu duyệt từng cách tách từ, số lượng sẽ rất lớn. Cần có cách
5796 %% loại bớt những cách tách từ nhảm nhí.
5797 %% \item Nếu duyệt toàn bộ thì đối với mỗi cách tách từ sẽ có những phát
5798 %% hiện lỗi khác nhau. Cần LM hay cái gì đó khác để biết được nên dùng
5799 %% cách tách từ nào (hoặc dùng hết :)
5800 %% \item Cải tiến CSS bằng cách áp dụng lưới từ nhiều hơn, không bị buộc
5801 %% trên một đường đi nhất định.
5802 %% \end{itemize}
5804 %\eject\addcontentsline{toc}{chapter}{\bibname}
5805 \bibliographystyle{alpha}
5806 \bibliography{reference}
5808 \appendix\eject\addcontentsline{toc}{part}{Phụ lục}
5809 \chapter{Dữ liệu kiểm tra}
5810 {\small\input{test}}
5812 %% \begin{thebibliography}{}
5813 %% \bibitem{Ravishankar}Mosur K. Ravishankar. 1996. {\em Efficient Algorithms for
5814 %% Speech Recognition.} PhD thesis. %CMU-CS-96-143.ps
5815 %% \bibitem{Oflazer}Kemal Oflazer. 1996. {\em Error-tolerant Finite State
5816 %% Recognition with Applications to Morphological Analysis and Spelling
5817 %% Correction.} %oflazer96errortolerant.ps.gz
5818 %% \bibitem{LAH}Le An Ha. {\em A method for word segmentation in
5819 %% Vietnamese.} %Ha-03.pdf
5820 %% \bibitem{Chang}Chao-Huang Chang. {\em A New Approach for
5821 %% Automatic Chinese Spelling Correction.} %a-new-approach-for.ps
5822 %% \bibitem{Sproat}Richard Sproat, William Gale, Chilin Shih, Nancy
5823 %% Chang. {\em A Stochastic Finite-State Word-Segmentation Algorithm for
5824 %% Chinese.} ACL Vol 22 N3.%J96-3004.pdf
5825 %% \bibitem{Chunyu}Chunyu Kit, Zhiming Xu, Jonathan
5826 %% J. Webster. {\em Integrating N\-gram Model and Case-based Learning For
5827 %% Chinese Word Segmentation.}%tsdx.ps.gz
5828 %% \bibitem{softcount}Xianping Ge, Wanda Pratt,
5829 %% Padhraic Smyth. {\em Discovering Chinese Words from Unsegmented
5830 %% Text.}%mlwordsigir.ps
5831 %% \bibitem{text-tiling}Jianfeng Gao, Hai-Feng Wang, Mingjing Li, Kai-Fu
5832 %% Lee. {\em A Unified Approach to Statistical Language Modeling for
5833 %% Chinese.}%icassp00.pdf
5834 %% \bibitem{}Nianwen Xue.{\em Chinese Word Segmentation as Character
5835 %% Tagging.}%paper2.pdf
5836 %% \bibitem{self-supervised}Fuchun Peng and Dale Schuurmans. {\em Self-Supervised Chinese
5837 %% Word Segmentation.}%IDA01.pdf
5838 %% \bibitem{phonetex}Victoria J. Hodge, Jim Austin. {\em An Evaluation of
5839 %% Phonetic Spell Checkers}%an-evaluation-of-phonetic.ps.gz
5840 %% \bibitem{soundex}K. Kukich. 1992. {\em Techniques for Automatically Correcting
5841 %% Words in Text.}
5842 %% \bibitem{}Cláudio L. Lucchesi and Tomasz Kowaltowski. {\em Applications of
5843 %% Finite Automata Representing Large Vocabularies.}%lucchesi92applications.ps.gz
5844 %% \bibitem{}Bo-Hyun Yun, Min-Jeung Cho, Hae-Chang Rim. {\em Segmenting Korean
5845 %% Compound Nouns using Statistical Information and a Preference
5846 %% Rule. }%PACLING97.ps
5847 %% \bibitem{}Roger I. W. Spooner and Alistair D. N. Edwards. {\em User
5848 %% Modelling for Error Recovery: A Spelling Checker for Dyslexic
5849 %% Users}%spooner97user.ps.gz
5850 %% \bibitem{}Theppitak Karoonboonyanan, Virach Sornlertlamvanich,
5851 %% Surapant Meknavin. {\em A Thai Soundex System for Spelling Correction.}%tsdx.ps.gz
5852 %% \bibitem{}Justin Zobel and Philip Dart. {\em Finding Approximate Matches in
5853 %% Large Lexicons.}%zobel95finding.ps.gz
5854 %% \bibitem{}Sun Maosong, Shen Dayang, Huang Changning. {\em CSeg\&Tag1.0: A
5855 %% Practical Word Segmenter and POS Tagger for Chinese Texts.}%A97-1018.pdf
5856 %% \bibitem{wordseg}Đinh Điền, Hoàng Kiếm, Nguyễn Văn Toàn. {\em Vietnamese Word
5857 %% Segmentation.}%0047-02.pdf
5858 %% \bibitem{}Bidyut Baran Chaudhuri. {\em Reversed word dictionary and
5859 %% phonetically similar word grouping based spell-checker to Bangla
5860 %% text.}%bangla.pdf
5861 %% \bibitem{}Timothy Gambell, Charles D. Yang. {\em Scope and Limits of
5862 %% Statistical Learning in Word Segmentation.}%gambell_yang.pdf
5863 %% \bibitem{iccc}Andi Wu, George Heidorn, Zixin Jiang, Terence
5864 %% Peng. {\em Correction of Erroneous Characters in Chinese Sentence
5865 %% Analysis.}%ICCC-2001.pdf
5866 %% \bibitem{}Fuchun Peng, Xiangji Huang, Dale Schuurmans, Shaojun
5867 %% Wang. {\em Text Clasification in Asian Languages without Word
5868 %% Segmentation.}%IRAL2003.pdf
5869 %% \bibitem{}Yalin Wang, Ihsin T. Phillips, Robert
5870 %% Haralick. {\em Statistical-based Approach to Word Segmentation.}%wordicpr.pdf
5871 %% \bibitem{}{\em Combining Syntactical And Statistical Language Constraints
5872 %% in Context-dependent Language Models for Interactive Speech
5873 %% Applications.}%K026.pdf
5874 %% \bibitem{LoiChinhTa}TS. Lê Trung Hoa. 2002. {\em Lỗi chính tả và cách khắc phục. NXB Khoa
5875 %% học Xã hội.}
5876 %% \bibitem{LoiTuVung}PGS. Hồ Lê, TS. Trần Thị Ngọc Lang, Tô Đình Nghĩa. 2002. {\em Lỗi từ
5877 %% vựng và cách khắc phục.} NXB Khoa học Xã hội.
5878 %% \bibitem{Tuoi}PTS. Phan Thị Tươi, KS. Nguyễn Hứa Phùng, KS. Huỳnh Vụ
5879 %% Như Liên, KS. Phạm Quyết Thắng. 1998. {\em Bắt lỗi chinh tả tự động cho
5880 %% tiếng Việt bằng máy tính.}
5881 %% \bibitem{worddef}Đinh Điền. 2000. {\em Từ tiếng Việt.} VNU-HCMC.
5882 %% \bibitem{}Andrew R. Golding. 1995. {\em A Bayesian hybrid method for
5883 %% context-sensitive spelling correction}. Proceedings of the Third
5884 %% Workshop on Very Large Corpora, pages 39-53.
5885 %% \bibitem{}Andrew R. Golding and Dan Roth. 1999. {\em A Winnow-based
5886 %% approach to context-sensitive correction}. Machine Learning,
5887 %% Special issue on Machine Learning and Natural Language Processing,
5888 %% 34:107-130.
5889 %% \bibitem{}Andrew R. Golding and Yves Schabes. 1996. {\em Combining
5890 %% tri\-gram-based and feature-based methods for context-sensitive
5891 %% spelling correction}. Proceedings of the 34th Annual Meeting of
5892 %% the Association for Computational Linguistics.
5893 %% \end{thebibliography}
5895 \end{spacing}
5897 \end{document}
5900 Giả sử câu S có $n$ tiếng $c_1,c_2,\ldots{},c_n$, có $|S|$ cách tách từ
5901 $S_1,S_2,\ldots{},S_{|S|}$ và cách tách từ $S_i$ được
5902 tách thành $|S_i|$ từ $W_{i_1},W_{i_2},\ldots{},W_{i_{|S_i|}}$ với
5903 $W_i$ là một từ xác định bắt đầu ở tiếng thứ $i$ chứa $|W_i|$ tiếng, và
5904 $i_j$ là vị trí từ thứ $j$ trong cách tách câu $i$.
5906 Ta có:
5907 $$p(i)=\sum_{j=1}^{|S_i|}{p(W_{i_j})}$$
5909 Một câu sẽ được tách thành:
5910 $$P(W_i) = P_{i}^{left}p(W_{i})P_{i+|W_i|}^{right}$$
5912 $P_i^{left}$ là xác suất tất cả các tổ hợp từ có thể có từ
5913 tiếng thứ nhất đến tiếng thứ $i$.
5915 $P_{i}^{right}$ là xác suất tất cả các tổ hợp từ có thể có từ tiếng
5916 thứ $i$ đến hết câu.
5918 Dễ thấy, với mỗi từ $C$ trong câu $S$, fractional count W của từ sẽ là
5919 $\displaystyle\frac{P(W)}{\sum_i^{|S|}p(i)}$.
5921 $\displaystyle\sum_i^{|S|}p(i)$ cũng chính là $P_{n+1}^{left}$ theo
5922 định nghĩa $P_i^{left}$.
5924 Ta sẽ dùng quy hoạch động để tính $P_i^{left}$ và $P_i^{right}$
5927 P_i^{left} = \left\{
5928 \begin{array}{lr}
5929 1 & i=1\\
5930 p(W_i) & i=2\\
5931 \sum_{j=1}^{i-1}p(c_j\ldots{} c_{i-1})P_j^{left} & i>2
5932 \end{array}
5933 \right.
5937 p(c_i\ldots{} c_j) = \left\{
5938 \begin{array}{ll}
5939 p(W_i)&\text{nếu } c_i\ldots{} c_j \text{ tạo thành } W_i\\
5940 0&\text{ngược lại}
5941 \end{array}
5942 \right.
5945 Thuật toán tính $P^{left}$ như sau:
5946 \begin{enumerate}
5947 \item Đặt $P_1^{left} = 1$
5948 \item Đặt $P_i^{left} = 0\quad \forall i \in [2\ldots{} n+1]$
5949 \item Duyệt i từ 1 đến n, tìm tất cả các từ $W_i$ (do tại có thể có
5950 nhiều từ bắt đầu tại tiếng $i$).
5951 Với mỗi từ $W_i$ tìm được, cộng thêm $p(W_i)$ vào $P_{i+|W_i|}^{left}$
5952 \end{enumerate}
5954 Thuật toán tương tự được áp dụng để tính $P^{right}$.
5956 Sau khi tính được $P^{left}$ và $P^{right}$, ta có thể tính fractional
5957 count trong câu bằng cách duyệt tất cả các từ có thể có trong câu,
5958 cộng thêm vào $\displaystyle\frac{P(W)}{P_{n+1}^{left}}$ cho từ
5959 $C$. Thực tế, ta sẽ lồng bước này vào trong thuật toán tính
5960 $P^{right}$, vì thuật toán cũng phải duyệt qua tất cả các từ.
5962 Vậy thuật toán tính $P^{right}$ là:
5963 \begin{enumerate}
5964 \item Đặt $P_{n+1}^{right} = 1$
5965 \item Đặt $P_i^{right} = 0\quad \forall i \in [1\ldots{} n]$
5966 \item Duyệt i từ n+1 đến 1.
5967 \begin{enumerate}
5968 \item tìm tất cả các từ $W_j$ sao cho $j+|W_j|=i$.
5969 Với mỗi từ $W_j$ tìm được, cộng thêm $p(W_j)$ vào
5970 $P_j^{right}$
5971 \item Tính fractional count cho tất cả các từ $W_i$ ($i \le n$)
5972 \end{enumerate}
5973 \end{enumerate}
5976 Ví dụ: câu ``học sinh học sinh học'' có 8 cách tách từ
5977 \begin{verbatim}
5978 học-sinh học-sinh học
5979 học-sinh học sinh học
5980 học-sinh học sinh-học
5981 học sinh học sinh học
5982 học sinh học sinh-học
5983 học sinh học-sinh học
5984 học sinh-học sinh học
5985 học sinh-học sinh-học
5986 \end{verbatim}
5987 \def\Zhs{\text{học-sinh}}
5988 \def\Zsh{\text{sinh-học}}
5989 \def\Zh{\text{học}}
5990 \def\Zs{\text{sinh}}
5991 Ta có
5993 \begin{array}{rl}
5994 P_1^{left}(\Zhs) &= p(\Zhs_1/\phi)\\
5995 P_1^{left}(\Zh) &= p(\Zh_1/\phi)\\
5996 P_2^{left}(\Zs) &= p(\Zs_2/\Zh_1)P_1^{left}(\Zh)\\
5997 &=p(\Zs_2/\Zh_1)p(\Zh_1/\phi)\\
5998 P_2^{left}(\Zsh) &= p(\Zsh_2/\Zh_1)P_1^{left}(\Zh)\\
5999 &=p(\Zsh_2/\Zh_1)p(\Zh_1/\phi)\\
6000 P_3^{left}(\Zhs) &= p(\Zhs_3/\Zhs_1)P_1^{left}(\Zhs)+p(\Zhs_3/\Zs_2)P_2^{left}(\Zs)\\
6001 &=p(\Zhs_3/\Zhs_1)p(\Zhs_1/\phi)+p(\Zhs_3/\Zs_2)p(\Zs_2/\Zh_1)p(\Zh_1/\phi)\\
6002 &=p(\Zhs_1,\Zhs_3)+p(\Zh_1,\Zs_2,\Zhs_3)\\
6003 P_3^{left}(\Zh) &= p(\Zh_3/\Zs_2)P_2^{left}(\Zs)+p(\Zh_3/\Zhs_1)P_1^{left}(\Zhs)\\
6004 &=p(\Zh_3/\Zs_2)p(\Zs_2/\Zh_1)p(\Zh_1/\phi)+p(\Zh_3/\Zhs_1)p(\Zhs_1/\phi)\\
6005 &=p(\Zh_1,\Zs_2,\Zh_3)+p(\Zhs_1,\Zh_3)\\
6006 \end{array}
6010 \begin{array}{rl}
6011 P_5^{right}(\Zh) &= p(\Phi/\Zh_5)\\
6012 P_4^{right}(\Zsh) &= p(\Phi/\Zsh_4)\\
6013 P_4^{right}(\Zs) &= p(\Zh_5/\Zs_4)P_5^{right}(\Zh)\\
6014 &=p(\Zh_5/\Zs_4)p(\Phi/\Zh_5)\\
6015 P_3^{right}(\Zh) &= p(\Zsh_4/\Zh_3)P_4^{right}(\Zsh)+p(\Zs_4/\Zh_3)P_4^{right}(\Zs)\\
6016 &=p(\Zsh_4/\Zh_3)p(\Phi/\Zsh_4)+p(\Zs_4/\Zh_3)(\Zh_5/\Zs_4)p(\Phi/\Zh_5)\\
6017 &=p(\Zh_3,\Zsh_4)+p(\Zh_3,\Zs_4,\Zh_5)\\
6018 P_3^{right}(\Zhs) &= p(\Zh_5/\Zhs_3)P_5^{right}(\Zh)\\
6019 &=p(\Zh_5/\Zhs_3)p(\Phi/\Zh_5)\\
6020 &=p(\Zhs_3,\Zh_5)\\
6021 \end{array}
6025 \begin{array}{rl}
6026 P_3(\Zhs) &= P_3^{left}(\Zhs)P_3^{right}(\Zhs)\\
6027 &=[p(\Zhs_1,\Zhs_3)+p(\Zh_1,\Zs_2,\Zhs_3)]p(\Zhs_3,\Zh_5)\\
6028 &=p(\Zhs_1,\Zhs_3)p(\Zhs_3,\Zh_5)+p(\Zh_1,\Zs_2,\Zhs_3)p(\Zhs_3,\Zh_5)\\
6029 &=p(\Zhs_1,\Zhs_3,\Zh_5)+p(\Zh_1,\Zs_2,\Zhs_3,\Zh_5)
6030 \end{array}
6034 Với \cite{Tuoi} thì việc xử lý lỗi bao gồm:
6035 \begin{itemize}
6036 \item Từ không có trong từ điển thì bắt lỗi ở cấp từ vựng.
6037 \item Từ có trong từ điển thị bắt lỗi ở cấp cú pháp.
6038 \end{itemize}