fix mem leaks in *::get_next()
[vspell.git] / thesis / main.tex
blobdd8c383afc3a232578aaf97adebe2cba633cc3cb
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[hmargin={3cm,2cm}]{geometry}
8 \usepackage{graphicx}
9 \usepackage{amsmath}
10 \usepackage[vietnam]{minitoc}
11 \usepackage{tabularx}
12 \usepackage{footnote}
13 \usepackage{tipa}
14 %\usepackage{fancyvrb}
15 %\usepackage{subfigure}
16 %\usepackage{longtable}
18 %\usepackage{theorem}
19 %\theoremstyle{break}
20 %\newtheorem{algo}{Thuật toán}
22 \setlength{\parskip}{1.2ex plus 0.7ex minus 0.6ex}
24 \setcounter{minitocdepth}{4}
26 %\usepackage{tocloft}
27 %\newcommand{\listalgo}{Danh sách thuật toán}
28 %\newlistof{algo}{algo}{\listalgo}
29 \usepackage{float} % fancy floats
30 \floatstyle{boxed}
31 \newfloat{algo}{htbp}{loa}[chapter]
32 \floatname{algo}{Thuật toán}
34 \newcommand{\note}[1]{\underline{#1}}
35 \newcommand{\comment}[1]{}
37 \title{Chương trình bắt lỗi chính tả tiếng Việt}
38 \author{Nguyễn Thái Ngọc Duy\\0012020}
40 \begin{document}
41 \dominitoc
42 %\doparttoc
43 \maketitle
44 %\large
46 \begin{titlepage}
47 \begin{center}
48 \Large Lời cảm ơn
49 \end{center}
50 Xin chân thành cảm ơn TS. Đinh Điền đã tận tình hướng dẫn, giúp đỡ
51 trong quá trình làm luận văn. Ngoài ra xin cảm ơn các thành viên
52 trong nhóm VCL đã hỗ trợ, động viên hoàn thành luận văn này.
53 \vskip 1cm
54 \begin{flushright}
55 Nguyễn Thái Ngọc Duy
56 \end{flushright}
57 \end{titlepage}
59 \tableofcontents
61 %% \chapter{Giới thiệu}
62 %% \label{cha:intro}
63 %% \begin{center}
65 %% I kept the right ones out
67 %% And let the wrong ones in
69 %% Had an angel of mercy
71 %% To see me through all my sins
73 %% There were times in my life
75 %% When I was goin' insane
77 %% Tryin' to walk through the pain
79 %% ****
81 %% And when I lost my grip
83 %% And I hit the floor
85 %% Yeah, I thought I could leave
87 %% But couldn't get out the door
89 %% I was so sick n' tired
91 %% Of livin' a lie
93 %% I was wishing that I would die
95 %% ****
97 %% It's amazing
99 %% With the blink of an eye
101 %% You finally see the light
103 %% It's amazing
105 %% That when the moment arrives
107 %% You know you'll be alright
109 %% It's amazing
111 %% And I'm saying a prayer
113 %% To the desperate hearts tonight
116 %% ****
119 %% That one last shot's a Permanent Vacation
121 %% And a how high can you fly with broken wings
123 %% Life's a journey - not a destination
125 %% And I just can't tell just what tomorrow brings
128 %% ****
131 %% You have to learn to crawl
133 %% Before you learn to walk
135 %% But I just couldn't listen
137 %% To all that righteous talk
139 %% I was out on the street
141 %% Just tryin' to survive
143 %% Scratchin' to stay alive
146 %% ****
149 %% ``To all of you people out there
151 %% Wherever you are - remember:
153 %% The light at the end of the tunnel
155 %% May be you - goodnight''
156 %%\end{center}
158 \chapter{Tổng quan}
159 \label{cha:overview}
160 \minitoc
163 Ngôn ngữ là một phần quan trọng của đời sống, là phương tiện chuyển
164 tải thông tin trong đời sống. Trong thời đại bùng nổ thông tin hiện
165 nay thì ngôn ngữ đóng vai trò hết sức quan trọng, đặc biệt là ngôn ngữ
166 viết.
168 % Tại sao lại làm đề tài này? (Đặt vấn đề)
169 Khi viết, đôi khi ta mắc phải những lỗi sai chính tả. Chữ quốc ngữ
170 chịu ảnh hưởng mạnh của ngôn ngữ nói. Một số âm tiết lại rất dễ
171 lầ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
172 có những dị biệt riêng. Những dị biệt này rất dễ gây ra
173 những lỗi chính tả khi viết nếu người viết không hiểu rõ về tiếng
174 Việt.
176 Những thao tác chuyển thông tin ở dạng khác thành văn bản cũng có thể
177 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
178 sai chính tả. Khi ghi lại lời nói của người khác mà người đó sử dụng
179 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
180 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
181 có thể dẫn đến lỗi chính tả do chương trình nhận dạng nhầm lẫn~\ldots{}
183 Văn bản dễ bị sai chính tả do nhiều yếu tố khách quan. Để kiểm lỗi
184 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
185 biệt khi khối lượng văn bản bùng nổ như hiện nay. Do đó cần có một
186 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
187 tả và đề nghị cách khắc phục.
189 Trong thời đại tin học hoá, máy tính được tận dụng để giảm thiểu công
190 sức của con người, đồng thời tăng tính hiệu quả. Tin học đã được áp
191 dụng trong nhiều lĩnh vực khác nhau và chứng tỏ tính hiệu quả của
192 nó. Tuy nhiên, việc ứng dụng tin học nhằm hỗ trợ bắt lỗi
193 chính tả tiếng Việt chỉ mới được bắt đầu trong thời gian gần
194 đây. Những ứng dụng bắt lỗi chính tả hiện có vẫn còn khá đơn
195 giản, chưa đáp ứng được nhu cầu thực tế. Luận văn này đề ra một giải
196 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
197 lượng ứng dụng bắt lỗi chính tả tiếng Việt bằng máy tính.
199 \section{Nội dung bài toán}
201 Bài toán có thể được phát biểu như sau:
202 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
203 và đề nghị cách giải quyết lỗi nếu có.
205 % Phạm vi bài toán
207 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
208 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
209 chính tả trong các văn bản hành chính.
211 Chỉ sử dụng từ điển từ, từ điển tiếng và ngữ liệu thô làm đầu vào.
213 Khái niệm từ ở đây là ``từ từ điển'' --- tức là các từ đơn, từ ghép,
214 cụm từ được lưu trong từ điển.
216 Lỗi chính tả ở đây bao gồm chủ yếu hai loại lỗi sau:
217 \begin{itemize}
218 \item Lỗi nhập liệu sai: lỗi gõ thiếu chữ, gõ dư chữ, gõ nhầm vị trí
219 hai chữ liên tiếp nhau, gõ nhầm một chữ bằng một chữ khác, sai sót
220 do bộ gõ tiếng Việt~\ldots{}
221 \item Lỗi phát âm sai: chủ yếu là do đặc điểm phát âm của từng vùng,
222 dẫn đến sai chính tả khi viết.
223 \end{itemize}
225 Không xử lý lỗi từ vựng, lỗi cú pháp.
227 Giả định rằng, nếu từ bị sai chính tả, thì chỉ sai bởi một trong những
228 lý do nêu trên {\em một lần}. Nghĩa là không xét những trường hợp sai
229 chính tả, vừa gõ nhầm chữ này bằng chữ khác, vừa gõ dư chữ.
231 Giả định người dùng chỉ sử dụng một trong hai cách gõ tiếng Việt là
232 VNI hoặc TELEX.
234 Văn bản tiếng Việt được coi là thuần Việt. Không kiểm tra chính tả đối
235 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
236 bị coi là sai chính tả.
238 \section{Đặc điểm}
240 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ó
241 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
242 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
243 suy nghĩ, chuyển tải thông tin, nên nó chứa đựng một khối lượng tri
244 thức đồ sộ. Để xử lý ngôn ngữ tự nhiên một cách đúng đắn đòi hỏi một
245 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ả
246 bằng máy tính là hết sức khó khăn.
248 Bắt lỗi chính tả đôi khi được mở rộng để phát hiện những lỗi khác
249 trong văn bản như lỗi cú pháp, lỗi từ vựng~\ldots{} Điều này cũng dễ
250 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
251 bỏ tất cả các lỗi trong văn bản, không quan trọng lỗi đó thuộc loại
252 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
253 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ừ
254 vựng. Đây là một vấn đề khó vì để bắt lỗi từ vựng, đôi khi cần phải
255 hiểu nội dung cả văn bản.
257 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
258 bản chất của tiếng Việt. Đối với tiếng Việt, cũng như một số
259 ngôn ngữ châu Á khác, một từ chính tả có thể không tương ứng với một
260 ``từ'' trên văn bản. Đối với các thứ tiếng châu Âu, ta có thể dễ dàng
261 nhận ra một từ, do các từ được phân cách bằng khoảng trắng. Điều đó
262 không đúng với tiếng Việt. Trong tiếng Việt, các tiếng được phân cách
263 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
264 mới: tách từ trong tiếng Việt. Do tiếng Việt là ngôn ngữ nói sao viết
265 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à
266 lỗi sai từ, nên việc xác định đâu là từ cực kỳ quan trọng.
268 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
269 toán là tách từ tiếng Việt và kiểm tra chính tả. Thật sự là tách từ
270 tiếng Việt trước, sau đó bắt lỗi chính tả. Tuy nhiên, do khi tách từ
271 thường ngầm định là dữ liệu đúng chính xác. Nên khi phải tách từ trước
272 bước kiểm tra chính tả, ngầm định trên không còn đúng. Bài toán tách
273 từ trở thành một bài toán khác, phức tạp hơn.
275 Do tài nguyên ngữ liệu tiếng Việt, đặc biệt là ngữ liệu tiếng Việt
276 trên máy tính vẫn còn hạn chế, đề tài này chỉ sử dụng các cách hình
277 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
278 thô. Việc không thể áp dụng được những thông tin cấp cao hơn như từ
279 loại, cú pháp, ngữ nghĩa~\ldots{} sẽ làm hạn chế đáng kể khả năng của
280 chương trình.
282 %% Dùng sai từ là lỗi từ vựng
284 \section{Hướng giải quyết}
286 % Bối cảnh %%%%Nổ thêm về bối cảnh ở đây. Cố để lấn qua trang kế%%%
288 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ố
289 đều tập trung vào các ngôn ngữ phổ dụng ở châu Âu. Trong khi đó các ngôn
290 ngữ châu Á, đặc biệt là tiếng Việt, có những đặc trưng riêng, đặt ra
291 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
292 Á 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
293 chỉ bắt đầu được nghiên cứu gần đây.
295 Đố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ừ
296 điển. Nếu một từ trên văn bản không có trong từ điển nghĩa là từ đó
297 sai chính tả.
299 Đối với các ngôn ngữ như tiếng Trung Quốc, tiếng Nhật~\ldots{}, nhiều
300 giải pháp được đề ra để giải quyết bài toán. Tuy nhiên hầu hết các
301 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
302 từ gần đúng, sau đó sử dụng mô hình ngôn ngữ để định lượng, xác định
303 xem từ nào là đúng nhất.
306 Đề 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
307 từ điển. Nếu từ không có trong từ điển nghĩa là sai chính tả, từ đó
308 đưa ra những gợi ý thích hợp.
310 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
311 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
312 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
313 ngôn ngữ để tìm ra cách tách từ đúng nhất. Tập nhầm lẫn được phát sinh
314 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
315 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
316 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
317 tương ứng.
320 \section{Bố cục luận văn}
322 Luận văn được chia thành các chương sau:
323 \begin{itemize}
324 \item Chương 1 giới thiệu chung về luận văn, các vấn đề cần giải
325 quyết, đặc điểm, phạm vi của bài toán và hướng giải quyết.
326 \item Chương 2 trình bày cơ sở lý thuyết ngôn ngữ học.
327 \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
328 được áp dụng để giải quyết bài toán.
329 \item Chương 4 trình bày mô hình đề nghị cho bắt lỗi chính tả tiếng Việt.
330 \item Chương 5 trình bày các chi tiết khi cài đặt chương trình.
331 \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
332 đặc điểm của mô hình cũng như chương trình cài đặt, các hạn chế và
333 các hướng giải quyết trong tương lai.
334 \item Phần phụ lục trình bày các thông tin liên quan.
335 \end{itemize}
337 \chapter{Cơ sở lý thuyết ngôn ngữ}
338 \label{cha:vietnamese}
339 \minitoc
342 \section{Âm tiết}
344 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
345 là âm thanh, khi viết nó được thể hiện bằng chữ. Không phải chữ viết
346 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ố
347 được biểu diễn bằng những ký hiệu đặc biệt, gọi là phiên âm. Các ký
348 hiệu phiên âm thường đặt giữa \textipa{/\quad/} hoặc
349 \textipa{[\quad]}.
351 Âm thanh trong tự nhiên được tạo thành nhờ sự rung động của một vật
352 thể đàn hồi. Âm thanh của tiếng nói được hình thành nhờ ``bộ máy phát
353 âm'' của con người --- bao gồm môi, răng, lưỡi, khoang miệng, khoang
354 mũi, yết hầu, thanh hầu, phổi~\ldots{}. Ngoài ra, tai người chỉ có thể
355 tiếp nhận một khoảng âm thanh nhất định. Những chấn động không nghe
356 được gọi là siêu âm và âm ngoại.
358 Âm học phân biệt các âm thanh theo những đặc trưng khác nhau, bao gồm:
359 độ cao, độ mạnh, độ dài. Độ cao phụ thuộc vào tần số dao động. Tần số
360 dao động càng lớn thì âm thanh càng cao. Tai người có khả năng nhận
361 biết độ cao trong khoảng từ 16 đến 20.000 $H_z$. Độ mạnh~(cường độ)
362 phụ thuộc vào biên độ dao động. Biên độ càng lớn, âm thanh càng
363 to. Cường độ âm thanh trong ngôn ngữ đảm bảo sự xác minh trong giao tế
364 và là cơ sở để tạo thành các kiểu trọng âm khác nhau. Độ dài~(trường
365 độ) là khoảng thời gian kéo dài của âm thanh. Ngôn ngữ chỉ quan trọng
366 thời gian tương đối của âm thanh. Ví dụ, các nguyên âm có trọng âm
367 thường dài hơn nguyên âm không có trọng âm.
370 \subsection{Nguyên âm và phụ âm}
372 Các âm tố có thể chia thành nguyên âm và phụ âm, dựa vào các đặc điểm
373 âm học, cấu âm và vai trò trong cấu tạo âm tiết.
375 Nguyên âm có đặc điểm cấu tạo:
376 \begin{itemize}
377 \item Luồng hơi ra tự do, không bị cản trở, không có vị trí cấu âm.
378 \item Bộ máy phát âm căng thẳng toàn bộ.
379 \item Luồng hơi ra yếu.
380 \end{itemize}
382 Phụ âm có đặc điểm cấu tạo hoàn toàn trái ngược với nguyên âm:
383 \begin{itemize}
384 \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
385 luồng không khí, chướng ngại thường xuất hiện ở các khoang trên
386 thanh hầu do các khí quan tiếp xúc nhau hay nhích gần nhau mà thành,
387 điểm có chướng ngại được gọi là vị trí cấu âm của phụ âm.
388 \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
389 tập trung ở vị trí cấu âm.
390 \item Luồng hơi ra mạnh.
391 \end{itemize}
393 Nguyên âm và phụ âm có chức năng khác nhau trong cấu tạo âm tiết. Các
394 nguyên âm thường làm hạt nhân hay đỉnh của âm tiết, còn phụ âm thường
395 là yếu tố đi kèm, không tạo thành âm tiết~(trừ các âm phụ vang).
397 Những âm tố có đặc tính giống nguyên âm nhưng thường chỉ đi kèm, bản
398 thân không tạo thành âm tiết được gọi là {\em bán nguyên âm}. Ví dụ,
399 các âm tố viết là u, i trong các âm ``sau'', ``mai'' trong tiếng Việt.
402 \subsection{Âm vị}
404 Âm vị là đơn vị nhỏ nhất của cơ cấu âm thanh ngôn ngữ, dùng để cấu tạo
405 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ữ
406 --- từ và hình vị. Ví dụ, các từ ``tôi'' và ``đôi'', ``ta'' và ``đa''
407 được phân biệt bởi các âm vị \textipa{/t/}\textipa{/d/}.
409 Âm vị là đơn vị nhỏ nhất, vì về mặt tuyến tính nó không thể phân chia
410 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
411 cảnh ngữ âm sẽ làm cho từ thay đổi nghĩa hoặc mất nghĩa. Ví dụ, thay
412 âm \textipa{/t/} trong từ ``toàn'' bằng âm \textipa{/h/} sẽ được
413 ``hoàn'' có nghĩa khác, hoặc nếu thay bằng âm \textipa{/n/} sẽ được
414 ``noàn'' hoàn toàn vô nghĩa.
416 Âm vị có thể được so sánh như những viên gạch trong việc xây dựng mỗi
417 ngôn ngữ. Các viên gạch thường giống nhau, nhưng các âm vị về nguyên
418 tắc phải khác nhau, ít nhất ở một đặc trưng nào đó. Sự khác biệt này
419 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
420 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
421 năng cơ bản là {\em chức năng khu biệt}~(vỏ âm thanh của hình vị và
422 từ) và {\em chức năng cấu tạo}~(chất liệu để cấu tạo nên
423 những thành tố của những đơn vị có nghĩa).
426 \subsection{Âm tiết}
428 Chuỗi lời nói của con người được chia ra làm những khúc đoạn khác
429 nhau, từ lớn đến nhỏ. Âm tiết là đơn vị phát âm nhỏ nhất, được phân
430 định tự nhiên trong lời nói con người.
432 Về phương diện phát âm, dù lời nói chậm đến đâu cũng chỉ phân chia đến
433 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
434 tiết là một tổ hợp âm thanh, có thể gồm nhiều âm tố hoặc đôi khi chỉ
435 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
436 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
437 thành âm tiết. Âm tố âm tiết tính thường được phân bố ở đỉnh hay ở
438 trung tâm, làm hạt nhân âm tiết, thường là các nguyên âm. Các phụ âm
439 thường là các yếu tố đi kèm, đứng ngoài biên, hay ở ranh giới của âm
440 tiết. Đôi khi âm tiết chỉ gồm một nguyên âm.
442 Trong một số trường hợp, âm tiết có thể có hai hoặc ba nguyên âm. Tuy
443 nhiên trong số đó chỉ có một nguyên âm tạo đỉnh, các âm tố khác không
444 tạo thành âm tiết, gọi là bán nguyên âm.
446 Âm tiết có một số chức năng sau:
447 \begin{itemize}
448 \item Âm tiết có chức năng tổ chức chất liệu âm thanh của ngôn ngữ
449 bằng cách hợp nhất các âm tố trong một đơn vị phát âm nhỏ nhất.
450 \item Âm tiết là môi trường để hiện thực hoá các hiện tượng ngôn điệu
451 như trọng âm, âm điệu.
452 \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
453 năng này thể hiện rõ trong ngôn ngữ thơ.
454 \end{itemize}
456 Trong các ngôn ngữ âm tiết tính như tiếng Trung Quốc, tiếng Miến Điện,
457 tiếng Việt~\ldots{} nói chung âm tiết trùng với hình vị --- đơn vị cơ
458 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
459 nên một đơn vị đặc biệt, gọi là {\em hình tiết}.
461 Tính chất âm tiết của tiếng Việt đưa đến nhiều hệ quả quan trọng về
462 ngữ âm cũng như về ngữ pháp. Về mặt ngữ âm, do mỗi âm tiết là vỏ ngữ
463 âm của một hình vị, và cũng thường là vỏ ngữ âm của từ đơn, nên số
464 lượng các âm tiết là hữu hạn\footnote{Theo Nguyễn Phan Cảnh ``tiếng
465 Việt đưa ra hơn 17.000 âm tiết --- tín hiệu với tự cách là vỏ ngữ âm
466 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
467 thực'' (Nguyễn Phan Cảnh, ``Bản chất cấu trúc âm tiết tính của ngôn
468 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
469 Nam, tạp chí ngôn ngữ, H. 1978, số 2)}.
471 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
472 bao giờ cũng tương ứng với một ý nghĩa nhất định, nên việc phá vỡ cấu
473 trúc âm tiết trong ngữ lưu, tức xê dịch vị trí các âm tố (âm vị) của
474 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
475 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
476 âm tố (âm vị) có một vị trí nhất định trong âm tiết. Đứng đầu âm tiết
477 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
478 nguyên âm. Phụ âm cuối luôn luôn ở cuối âm tiết, không thể trở thành
479 âm đầu được. Do đó, phụ âm cuối và âm đầu làm thành hai đối hệ khác
480 nhau, có vị trí và chức năng khác nhau trong cấu trúc âm tiết.
482 Một đặc điểm khác của âm tiết tiếng Việt là mỗi âm tiết đều mang
483 một thanh điệu nhất định. Việc thể hiện thanh điệu đòi hỏi âm tiết
484 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
485 trong âm tiết, trừ phụ âm đầu, không có một trường độ cố định, mà đắp
486 đổi lẫn nhau, liên quan với nhau rất chặt chẽ.
489 \subsubsection{Cấu trúc âm tiết tiếng Việt}
491 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
492 Tiếng Việt được cấu tạo bởi ba thành tố độc lập là thanh điệu, phụ âm
493 đầu và phần còn lại.
495 Thanh điệu là yếu tố luôn có mặt trong mọi âm tiết tiếng Việt. Tính
496 chất độc lập về mặt ngữ âm của thanh điệu thể hiện ở chỗ nó có đường
497 nét và trường độ tương đối ổn định tùy thuộc vào các loại hình âm
498 tiết.
500 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
501 đầu thể hiện ở chỗ nó không tham gia vào việc đắp đổi về trường độ
502 giữa các yếu tố bên trong âm tiết.
504 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
505 âm chiếm vị trí trung gian giữa phụ âm đầu và phần còn lại, một nguyên
506 â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
507 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ố
508 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
509 khối. Để đảm bảo cho tính chất cố định về trường độ của âm tiết, các
510 yếu tố của phần còn lại có sự đắp đổi nhau về trường độ: nếu nguyên âm
511 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ì
512 â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ố
513 định, và do đó mức độ độc lập về mặt ngữ âm của chúng thấp hơn so với
514 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,
515 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ơ.
517 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
518 nhau, chia làm hai bậc:
520 \begin{itemize}
521 \item Bậc một là những yếu tố độc lập về mặt ngữ âm và có thể được
522 tách rời về mặt hình thái học. Đó là thanh điệu, âm đầu và vần.
523 \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
524 nguyên âm âm tiết tính (được gọi là âm đệm), nguyên âm âm tiết tính
525 (được gọi là âm chính), phụ âm hoặc bán nguyên âm cuối (được gọi là
526 â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
527 chất cố định về trường độ của âm tiết và chỉ được tách ra bằng những
528 ranh giới thuần túy ngữ âm học.
529 \end{itemize}
531 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
532 tố được trình bày trong hình~\ref{fig:cautrucamtiet}.
534 \begin{figure}[htbp]
535 \centering
536 \begin{tabular}{|c|c|c|c|}
537 \hline
538 \multicolumn{4}{|c|}{Thanh điệu}\\\hline
539 Âm đầu&\multicolumn{3}{c|}{Vần}\\\cline{2-4}
540 &Âm đệm&Âm chính&Âm cuối\\\hline
541 \end{tabular}
542 \caption{Cấu trúc âm tiết}
543 \label{fig:cautrucamtiet}
544 \end{figure}
546 %\subsection{Các hiện tượng liên quan đến âm tiết}
549 %\subsubsection{Nguyên âm đôi}
552 % Sự biến hoá ngữ âm
554 Khái niệm âm tiết liên quan mật thiết đến sự biến hoá ngữ âm. Vì các
555 â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
556 liên tục, cho nên các âm tố có thể ảnh hưởng lẫn nhau, đặc biệt là
557 những âm tố lân cận được phát âm trong cùng một âm tiết, hoặc ở những
558 âm tiết đi liền nhau. Một số hiện tượng biến hoá ngữ âm thường gặp
559 trong tiếng Việt:
560 \begin{itemize}
561 \item Sự thích nghi. Xuất hiện giữa phụ âm và nguyên âm đứng cạnh
562 nhau. Nếu âm tố sau biến đổi cho giống âm tố đi trước, đó là thích
563 nghi xuôi. Nếu âm tố trước biến đổi cho hợp với âm tố sau là thích
564 nghi ngược. Trong tiếng Việt, nguyên âm và phụ âm cuối kết hợp với
565 nhau rất chặt chẽ, tạo thành vần của âm tiết. Hiện tượng thích nghi
566 biểu hiện rõ rệt trong những vần có nguyên âm dòng trước và dòng sau
567 tròn môi kết hợp với phụ âm cuối ``ng'' và ``c''.
568 \item Sự đồng hoá (một yếu tố thay đổi để giống yếu tố kia). Ví dụ,
569 ``vỏn vẹn'' và ``vẻn vẹn''.
570 \item Sự dị hoá (hiện tượng rút gọn cho dễ phát âm). Ví dụ, ``ba mươi
571 mốt'' và ``băm mốt''.
572 \end{itemize}
574 \subsection{Phụ âm đầu}
576 Phụ âm đầu luôn gắn liền với vị trí và chức năng mở đầu âm tiết. Đi
577 sau âm đầu trong âm tiết là bán nguyên âm không thành âm tiết (hay còn
578 gọi là âm đệm).
580 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
581 được thể hiện trên chữ viết. Riêng những âm tiết như ``ăn'',
582 ``uống''~\ldots{} tuy không ghi phụ âm đầu, nhưng thực tế vẫn tồn tại
583 phụ âm đầu (âm tắt thanh hầu \textipa{/P/}). Trong từng phương ngữ,
584 một số đối lập có trên chữ viết có thể bị mất đi hoặc bị thay thế. Ví
585 dụ, trong tiếng Hà Nội không còn đối lập các phụ âm đầu giữa
586 ch--tr,x--s và gi,d với r. Trong tiếng miền Nam, \textipa{/v/}
587 \textipa{/z/} được thay bằng \textipa{/j/}.
589 Hiện nay, hệ thống phụ âm đầu được sử dụng thực tế trong nhà trường và
590 trên các văn bản, chung cho các phương ngữ, là hệ thống phụ âm đầu
591 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
592 ch--tr, x--s, g,gi--r gồm 22 phụ âm sau: \textipa{/b, m, f, v, t,
593 t\super{h}, d, n, s, z, l, \:t, \:s, \:z, c, \textltailn, k, N, x,
594 G, P, h/}\footnote{Phụ âm \textipa{/p/} gặp trong từ vay mượn hoặc
595 phiên âm tiếng nước ngoài, không được đưa vào hệ thống này}
597 Hệ thống phụ âm đầu của tiếng địa phương miền Bắc, mà cở sở là phát âm
598 Hà Nội có 19 phụ âm (kể cả âm tắc thanh hầu \textipa{/P/}). Trong phát
599 âm Hà Nội không có loạt phụ âm uốn lưỡi \textipa{/\:t, \:s, \:z/}. Các
600 phụ âm này đều được chuyển thành các âm đầu lưỡi hoặc mặt lưỡi tương
601 ứng \textipa{/c, s, z/}. Ví dụ,
602 \begin{itemize}
603 \item ``cha'' và ``tra'' đều phát âm thành ``cha'' \textipa{/ca/}
604 \item ``sa'' và ``xa'' đều phát âm thành ``xa'' \textipa{/sa/}
605 \item ``da'', ``gia'' và ``ra'' đều được phát âm thành ``da'' \textipa{/da/}
606 \end{itemize}
608 Trong các thổ ngữ vùng Bắc Trung Bộ (Nghệ Tĩnh --- Bình Trị Thiên) còn
609 giữ loạt các phụ âm cong lưỡi \textipa{/\:t, \:s, \:z/}. Ở một số nơi
610 thuộc Nghệ Tĩnh, phụ âm ``ph'' được phát âm như âm mặt lưỡi sau bật
611 hơi \textipa{/k\super{h}/}. Vì vậy hệ thống phụ âm đầu những nơi này
612 có thêm dãy âm bật hơi \textipa{/p\super{j}, \:t\super{h},
613 k\super{h}/}. Trong khi đó các thổ ngữ miền Bắc và miền Nam chỉ còn
614 lại một âm bật hơi \textipa{/t\super{h}/} mà thôi. Vùng Bình Trị Thiên
615 không có phụ âm ``nh''. Phụ âm này thường được phát âm thành
616 \textipa{/j/}. Ví dụ, ``nhà'' được phát âm thành ``dà''. Nếu coi hệ
617 thống phụ âm đầu vùng Vinh là đại diện cho phương ngự Bắc Trung Bộ thì
618 hệ thống này có 22 phụ âm đầu.
620 Hệ thống phụ âm đầu miền Nam (từ đèo Hải Vân trở vào) không có các phụ
621 âm xát hữu thanh \textipa{/v, z/}. Tương ứng với \textipa{/v, z/}
622 trong phát âm Hà Nội, phát âm miền Nam có phụ âm mặt lưỡi giữa
623 \textipa{/j/}. Đôi khi âm \textipa{/v/} được phát âm thành âm môi-môi,
624 xát, vang ngạc hoá \textipa{/Bj/}. Hiện nay các âm cong lưỡi đang
625 trong quá trình biến đổi trong tiếng miền Nam. Phụ âm \textipa{/\:s/}
626 là phụ âm ít bền vững nhất thường được phát âm thành
627 \textipa{/s/}. Các phụ âm cong lưỡi khác như \textipa{/\:t/}
628 \textipa{/\:z/} vẫn còn giữ lại, phân biệt với \textipa{/c/}
629 \textipa{/j/} nhưng không đều đặn ở các thổ ngữ. Trong phát âm miền
630 Nam có phụ âm đầu \textipa{/w/}\footnote{Giá trị âm vị học của
631 \textipa{/w/} là vấn đề còn đang bàn cãi} xát, môi-môi, tương ứng
632 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
633 đệm \textipa{/-u-/}. Ví dụ, ``qua'' \textipa{/wa/}, ``ngoại''
634 \textipa{/wai/}, hoa \textipa{/wa/}. Nếu lấy hệ thống phụ âm đầu của
635 tiếng thành phố Hồ Chí Minh làm cơ sở cho phương ngữ miền Nam thì hệ
636 thống này có 21 phụ âm đầu.
639 \subsubsection{Quan hệ phân bố giữa phụ âm đầu và âm đệm}
641 Âm đệm là thành tố đi sau phụ âm đầu trong âm tiết. Trong tiếng Việt
642 chỉ có một âm đệm là \textipa{/-u-/}, thể hiện trên chữ viết bằng hai
643 chữ ``u'' và ``o''. Ví dụ, ``hoa'', ``quế''. Trong phát âm, âm đệm chỉ
644 được thể hiện ở tiếng địa phương miền Bắc và Bắc Trung Bộ, còn trong
645 tiếng địa phương miền Nam thường không có âm đệm \textipa{/-u-/}.
647 Trong phát âm Hà Nội, hầu hết loạt phụ âm lưỡi và thanh hầu có thể
648 phân bố trước âm đệm. Ví dụ, ``toa'', ``đoán'', ``nhoà''~\ldots{} Riêng
649 loạt âm môi \textipa{/b, m, v, f/} không phân bố trước âm đệm
650 \textipa{/-u-/} vì chúng có cấu âm môi giống nhau. Trong tiếng Việt,
651 hễ những âm có cấu âm giống nhau hay tương tự nhau thì không phân bố
652 cạnh nhau.
654 Ngoài các âm môi, một vài phụ âm lưỡi như \textipa{/n, \:z, G/} cũng
655 rất ít xuất hiện trước âm đệm.
657 \subsection{Vần}
660 \subsubsection{Âm đệm}
662 Trong âm tiết, âm đệm \textipa{/-u-/} đứng sau phụ âm đầu và đứng
663 trước âm chính. Nó đóng vai trò một âm lướt trong kết cấu âm tiết. Về
664 mặt cấu âm, âm đệm \textipa{/-u-/} được phát âm giống như nguyên âm
665 \textipa{[u]} nhưng không làm đỉnh âm tiết. Đó là một bán nguyên âm
666 môi-ngạc mềm, được phiên âm là \textipa{[-u-]} hay
667 \textipa{[-w-]}. Động tác cấu âm này diễn ra đồng thời với các giai
668 đoạn phát âm của phụ âm đầu và phần vần đầu của nguyên âm làm âm
669 chính. Về mặt âm học, âm đệm \textipa{/-u-/} có tác dụng làm biến đổi
670 âm sắc của âm tiết, làm trầm hoá âm sắc của âm tiết.
672 Âm đệm \textipa{/-u-/}, với tính chất là một bán nguyên âm môi-ngạc
673 mềm, có độ mở rộng hay hẹp tương ứng với độ mở của nguyên âm đi sau
674 nó. Trước nguyên âm hẹp \textbf{i}, âm đệm \textipa{/-u-/} được thể
675 hiện bằng một bán âm hẹp tương ứng là \textipa{[u]}, ví dụ
676 ``tuy''. Trước các nguyên âm có độ mở trung bình \textbf{ê, ơ, â}, âm
677 đệm \textipa{/-u-/} được thể hiện bằng một bán âm độ mở vừa
678 \textipa{[o]}, ví dụ ``khuê'', ``huơ'', ``huân''. Trước các nguyên âm
679 có độ mở rộng \textbf{e, a, ă}, âm đệm \textipa{/-u-/} được thể hiện
680 bằng một bán âm có độ mở tương ứng là \textipa{[O]}, ví dụ ``khỏe'',
681 ``khoắn'', ``khoan''.
683 Âm đệm \textipa{/-u-/} xuất hiện phần lớn ở các từ gốc Hán như
684 ``thuyền'', ``loan'', ``uyên''. Về mặt phân bố, như đã nói, âm đệm có
685 thể xuất hiện sau hầu hết các phụ âm đầu, trừ các phụ âm môi
686 \textipa{/b, m, f, v/}. Sau các phụ âm môi, âm đệm chỉ có mặt trong
687 một ít từ phiên âm tiếng nước ngoài như ``buýt'', ``phuy'',
688 ``voan''. Ngoài ra, sau các phụ âm \textipa{/n, \:z, G/}, âm đệm
689 \textipa{/-u-/} cũng chỉ xuất hiện trong một vài từ như ``noãn'',
690 ``roa'', ``goá''.
692 Âm đệm \textipa{/-u-/} cũng không xuất hiện trước các nguyên âm tròn
693 môi \textbf{u, uô, ô, o}. Sự phân bố của âm đệm sau phụ âm đầu và
694 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
695 âm có cấu âm giống nhau hoặc gần gũi nhau không được phân bố cạnh
696 nhau.
698 Về mặt chữ viết, âm đệm \textipa{/-u-/} được ghi bằng con chữ ``o''
699 trước ba nguyên âm rộng \textbf{e, a, ă} và được ghi bằng con chữ
700 ``u'' trước các nguyên âm còn lại. Ví dụ, ``thuý'', ``thuê'', ``loe'',
701 ``loa''. Riêng trường hợp sau phụ âm đầu \textipa{/k-/}, âm đệm
702 \textipa{/-u-/} luôn được ghi bằng con chữ ``u'' dù sau nó là nguyên
703 âm rộng. Ví dụ: ``quạ'', ``quý'' (trong những trường hợp này âm
704 \textipa{/k-/} được ghi bằng con chữ ``q'')\footnote{Do đó về mặt chữ
705 viết, sau con chữ ``q'', con chữ ``u'' luôn luôn có giá trị là một
706 âm đệm. Điều này giúp ta phân biệt ``ua'' là một nguyên âm đôi trong
707 từ ``của'' với ``ua'' trong tổ hợp âm đệm+nguyên âm trong
708 ``quả''. Riêng trường hợp ``quốc'' thì ``uô'' là nguyên âm đôi nhưng
709 \textipa{/k-/} vẫn được ghi bằng ``q''. Sự phân biệt về mặt con chữ ở
710 đây có giá trị phân biệt nghĩa hai từ đồng âm ``cuốc'' và ``quốc'' đều
711 được phát âm là \textipa{/kuok/}.}.
713 Âm đệm \textipa{/-u-/}, vốn là yếu tố có mặt trong phương ngữ Bắc và
714 Bắc Trung Bộ, lại hoàn toàn vắng mặt trong phương ngữ Nam Bộ. Do đó,
715 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:
716 âm đầu, âm chính, âm cuối.
718 Sự vắng mặt của âm đệm trong phương ngữ Nam Bộ có thể đưa đến một số
719 biến đổi ở âm đầu và âm chính. Đáng chú ý là sự biến đổi của các phụ
720 âm mặt lưỡi sau và thanh hầu, thành các phụ âm môi. Ví dụ, ``hoa''
721 thành ``wa'', khuya thành ``phia''.
723 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
724 đệm sau các phụ âm đầu lưỡi, mặt lưỡi giữa và mặt lưỡi sau trong cách
725 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
726 thanh hầu \textipa{/h-,P-/} và phụ âm mặt lưỡi sau \textipa{/k-/}, vẫn
727 được phát âm thành \textipa{[w-]} trong các từ ``hoa'', ``oa'',
728 ``qua'' (đều phát âm là \textipa{[wa]}).
730 \subsubsection{Âm chính}
732 Âm chính trong âm tiết tiếng Việt có thể là một nguyên âm đơn hoặc một
733 nguyên âm đôi.
736 \paragraph{Nguyên âm đơn}
738 Tiếng Việt có 11 nguyên âm đơn làm âm chính. Căn cứ vào vị trí lưỡi,
739 hình dáng môi, các nguyên âm đơn được chia ra:
740 \begin{itemize}
741 \item Các nguyên âm giòng trước không tròn môi: \textipa{/i, e, E/}.
742 \item Các nguyên âm giòng sau không tròn môi: \textipa{/W, 7, \v{7},
743 a, \v{a}/}.
744 \item Các nguyên âm giòng sau tròn môi: \textipa{/u, o, O/}.
745 \end{itemize}
747 Căn cứ vào độ mở miệng, có thể chia thành:
748 \begin{itemize}
749 \item Các nguyên âm có độ mở miệng hẹp: \textipa{/i, W, u/}.
750 \item Các nguyên âm có độ mở trung bình: \textipa{/e, 7, \v{7}, o/}.
751 \item Các nguyên âm có độ mở rộng: \textipa{/E, a, \v{a}, O/}.
752 \end{itemize}
754 Căn cứ vào âm sắc, có thể chia ra:
755 \begin{itemize}
756 \item Các nguyên âm bổng: \textipa{/i, e, E/}.
757 \item Các nguyên âm trung bình: \textipa{/W, 7, \v{7}, a, \v{a}/}.
758 \item Các nguyên âm trầm: \textipa{/u, o, O/}.
759 \end{itemize}
761 Căn cứ vào trường độ, có thể chia ra:
762 \begin{itemize}
763 \item Các nguyên âm dài: \textipa{/i, e, E, W, 7, a, u, o, O/}.
764 \item Các nguyên âm ngắn: \textipa{/\v{7}, \v{a}/}.
765 \end{itemize}
768 \paragraph{Nguyên âm đôi}
770 Ngoài 11 nguyên âm đơn, còn có 3 nguyên âm đôi âm vị tính là
771 \textipa{/ie, W7, uo/}.
773 \subsubsection{Âm cuối}
775 Â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ó
776 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
777 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
778 trong trường hợp này là hai bán nguyên âm \textipa{/-u/}
779 \textipa{/-i/}. Âm tiết tiếng Việt còn có thể kết thúc bằng động tác
780 khép của bộ máy phát âm với một phụ âm tắc (mũi hoặc miệng).
782 Hệ thống âm cuối trong tiếng Việt gồm có 2 bán nguyên âm và 6 phụ
783 âm. Sau phụ âm bao gồm: \textipa{/m, p, n, t, N, k/}.
786 \subsubsection{Quy luật phân bố của các âm cuối sau âm chính}
788 Về mặt phân bố, các bán nguyên âm cuối \textipa{/-u/}
789 \textipa{/-i/} chỉ xuất hiện sau các nguyên âm không cùng âm sắc với
790 nó. Bán nguyên âm cuối \textipa{/-i/} chỉ xuất hiện sau các bán nguyên
791 âm không phải giòng trước. Bán nguyên âm cuối \textipa{/-u/} chỉ xuất
792 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
793 và bán nguyên âm cuối, giống như sự kết hợp giữa âm đệm và nguyên âm
794 làm âm chính, tuân theo quy luật dị hoá. Theo đó, các âm có cấu âm
795 giống nhau hoặc gần nhau không bao giờ được phân bố cạnh nhau.
797 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
798 bán nguyên âm cuối \textipa{/-i/}\textipa{/-u/} như sau:
799 \begin{itemize}
800 \item Các nguyên âm có thể đứng trước bán nguyên âm \textipa{/-i/} bao
801 gồm các âm biểu hiện bởi các chữ: ư, ươ, ơ, â, a, ă, u, uô, ô, o.
802 \item Các nguyên âm có thể đứng trước bán nguyên âm \textipa{/-u/} bao
803 gồm các âm biểu hiện bởi các chữ: i, iê, ê, e, ư, ươ, ơ, â, a, ă.
804 \end{itemize}
806 Các phụ âm cuối khác, nói chung được phân bố đều đặn sau các nguyên
807 âm, trừ hai âm cuối mũi \textipa{/-m, -p/} không xuất hiện sau
808 \textipa{/W/}.
811 \subsubsection{Sự thể hiện của nguyên âm và phụ âm trong các tiếng địa
812 phương}
814 Trong phương ngữ Nam Bộ, các nguyên âm đôi \textipa{/ie, W7, uo/} khi
815 kết hợp với các âm cuối \textipa{/-i, -u, -m, -p/} được thể hiện thành
816 các nguyên âm đơn \textipa{/i, W, u/}. Ví dụ, ``chuối'' --- ``chúi'',
817 ``bưởi'' --- ``bửi'', ``tiếp'' --- ``típ''.
819 Ở một vài địa phương thuộc phương ngữ Trung Bộ, các nguyên âm đôi được
820 thể hiện bằng các nguyên âm cùng dòng, độ mở rộng. Ví dụ, ``người''
821 --- ``ngài'', ``ruột'' --- ``rọt'', ``miếng'' --- ``méng''.
823 Hai phụ âm cuối \textipa{/-n, -t/} được thể hiện thành \textipa{/-N,
824 -k/} trong phương ngữ Nam Bộ, khi chúng đi sau các nguyên âm đơn và
825 đôi, trừ \textipa{/i, e/} là hai nguyên âm giòng trước, độ mở hẹp và
826 trung bình. Ví dụ, ``đen'' -- ``đeng'', ``đét'' --- ``đéc''.
828 Sau ba nguyên âm giòng trước \textipa{/i, e, E/}, hai phụ âm
829 \textipa{/-N, -k/} được thể hiện trong các phương ngữ Nam Bộ thành
830 \textipa{/-n, -t/}, đồng thời các nguyên âm này có cấu âm lui về phía
831 sau nhiều hơn so với các nguyên âm trong phương ngữ Bắc Bộ, trở thành
832 các nguyên âm giòng giữa nghe gần giống như ư, ơ (hoặc â) và ă.
834 Điểm đáng lưu ý là trong phương ngữ Nam Bộ, sau \textipa{/i, e/} hai
835 âm cuối \textipa{/-n, -t/} vẫn được phát âm không đổi. Sự khác biệt
836 trong các vần này giữa phương ngữ Bắc Bộ và Nam Bộ xảy ra ở nguyên âm.
838 Trong phương ngữ Nam Bộ không có các âm cuối \textipa{/-\textltailn,
839 -c/}. Âm cuối này được phát âm thành \textipa{/-n, -t/}.
841 \subsection{Thanh điệu}
843 Thanh điệu là đặc trưng ngôn điệu của âm tiết. Người ta gọi thanh điệu
844 là âm vị siêu đoạn tính. Số lượng thanh điệu trong tiếng Việt khác
845 nhau giữa các tiếng địa phương. Số lượng nhiều nhất là 6 thanh trong
846 phát âm Hà Nội, hay trong các tiếng Bắc nói chung, và được phản ánh
847 trên chữ viết. Đó là các thanh: sắc, huyền, ngã, hỏi, nặng, và thanh
848 không dấu.
850 Trong các tiếng địa phương từ Thanh Hoá trở vào Nam thường chỉ có năm
851 thanh, thanh ngã trùng với thanh hỏi (trong một số vùng Thanh Hoá,
852 tiếng Bình Trị Thiên, Nam Trung Bộ và Nam Bộ), hoặc thanh ngã trùng
853 với thanh nặng (trong tiếng vùng Nghệ An, Hà Tĩnh). Ngoài ra trong một
854 vài thổ ngữ lẻ tẻ ở Nghệ An và Quảng Bình chỉ có 4 thanh điệu.
857 \subsubsection{Sự phân bố của thanh điệu}
859 Như đã biết, thanh điệu là đặc tính siêu đoạn của âm tiết. Các đặc
860 trưng của thanh điệu được thể hiện đồng thời với các thành phần cấu
861 trúc khác của âm tiết. Vì vậy, trong chừng mực nào đó nó bị chế định
862 bởi các thành phần này.
864 Về mặt âm vị học, âm tiết tiếng Việt trước hết được chia thành hai đơn
865 vị là phụ âm đầu và vần. Phần vần, trong đó có nguyên âm, là phân luôn
866 luôn mang thanh tính của âm tiết. Các đặc điểm về âm vực và âm điệu
867 của thanh điệu chỉ được biểu hiện trong phần mang thanh tính mà
868 thôi. Vì vậy, trong sự đối lập và thống nhất các thanh điệu, phần vần
869 đóng vai trò quan trọng. Phụ âm đầu hầu như không đóng vai trò gì
870 trong sự đối lập các thanh. Về mặt ngữ âm, đặc tính của thanh điệu
871 cũng hầu như không lan truyền lên phụ âm đầu, hoặc có chăng (trong
872 trường hợp phụ âm đầu hữu thanh) thì trong đoạn đầu của âm tiết, các
873 đặc trưng khu biệt của thanh điệu cũng chưa thể hiện rõ.
875 Phần vần có thể bao gồm âm đệm, một âm chính và có thể có bán nguyên
876 âm hoặc phụ âm cuối. Sự khác nhau của thanh điệu biểu hiện tập trung ở
877 giữa và cuối vần (tức phần nguyên âm và phụ âm cuối).
880 Trong các vần không có âm cuối, có âm cuối là bán nguyên âm hoặc phụ
881 âm vang, các đặc trưng của thanh điệu được thể hiện dễ dàng.
882 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
883 trưng của thanh được biểu hiện rất hạn chế.
884 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
885 âm tiết, thanh điệu bị sự chế định rõ ràng nhất của âm cuối. Vì vậy sự
886 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
887 âm tiết.
889 Số lượng các thanh điệu xuất hiện trong những âm tiết kết thúc bằng
890 phụ âm cuối vô thanh rất hạn chế, thường chỉ có thể có thanh sắc hoặc
891 thanh nặng.
893 Thanh sắc và thanh nặng trong những âm tiết có âm cuối vô thanh có
894 những đặc điểm riêng về độ dài và đường nét âm điệu khác với thanh sắc
895 và thanh nặng trong các âm tiết còn lại. Vì vậy trước đây đã từng có
896 quan niệm cho rằng các thanh điệu trong các âm tiết có âm cuối vô
897 thanh là những thanh điệu đặc biệt, tạo thành hệ thống 8 thanh điệu:
898 tan, tàn, tãn, tản, tán, tạn, tát, tạt.
903 \section{Từ}
905 Khái niệm từ, mặc dù nghe qua rất thông dụng, dễ hiểu, nhưng định
906 nghĩa chính xác thế nào là từ không đơn giản. Từ trước đến nay đã có
907 nhiều định nghĩa về từ được đưa ra. Các định nghĩa đều đúng, tuy nhưng
908 không hoàn chỉnh. Viện sĩ L. V. Sherba thừa nhận rằng: ``Trong thực
909 tế, từ là gì? Thiết nghĩ rằng trong các ngôn ngữ khác nhau, từ sẽ khác
910 nhau. Do đó, tất sẽ không có khái niệm từ nói chung''\footnote{Nguyễn
911 Kim Thản, {\em Nghiên cứu ngữ pháp tiếng Việt}. NXB GD, 1997. Trang 28}.
912 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
913 chối bỏ khái niệm từ, hoặc né tránh định nghĩa từ một cách chính
914 thức. Nhà ngôn ngữ học Ferdinand de Saussure đã nhận xét: ``\ldots{}
915 Ngôn ngữ có tính chất kỳ lạ và đáng kinh ngạc là không có những thực
916 thể thoạt nhìn có thể thấy ngay được, thế nhưng người ta vẫn biết chắc
917 là nó tồn tại, và chính sự giao lưu giữa những thực thể đó đã làm
918 thành ngôn ngữ. Trong số những thực thể đó có cái mà ngôn ngữ học vẫn
919 gọi là từ.''. Theo ông thì ``\ldots{} Từ là một đơn vị luôn luôn ám ảnh
920 toàn bộ tư tưởng chúng ta như một cái gì đó trọng tâm trong toàn bộ cơ
921 cấu ngôn ngữ, mặc dù khái niệm này khó định nghĩa''.
924 \subsection{Định nghĩa từ}
926 Thời Hy Lạp cổ đại, trường phái ngôn ngữ Alexandri đã định nghĩa: ``\textit{Từ
927 là đơn vị nhỏ nhất trong chuỗi lời nói}''. Ngoài ra A. Meillet trong
928 \textit{Ngôn ngữ học lịch sử và ngôn ngữ học đại cương} đã định nghĩa: ``\textit{Từ
929 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
930 tố nhất định, có thể có một công dụng ngữ pháp nhất định}''.
932 Theo E. Sapir thì ``\textit{Từ là một đoạn nhỏ nhất có ý nghĩa, hoàn toàn có
933 khả năng độc lập và bản thân có thể làm thành câu tối giản}''.
935 Theo L. Bloomfield thì từ là ``\textit{một hình thái tự do nhất}''.
937 Theo B. Golovin thì từ là ``\textit{đơn vị nhỏ nhất có ý nghĩa của ngôn ngữ,
938 đượ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
939 câu}''.
941 Theo Solncev thì ``\textit{Từ là đơn vị ngôn ngữ có tính hai mặt: âm và
942 nghĩa. Từ có khả năng độc lập về cú pháp khi sử dụng trong lời}''.
944 Theo B. Trơ-nơ-ka thì ``\textit{Từ là đơn vị nhỏ nhất có ý nghĩa, được cấu tạo
945 bằng âm vị và có khả năng thay đổi vị trí và thay thế lẫn nhau trong
946 câu}''.
948 Theo Lục Chí Vỹ thì ``\textit{Từ là đơn vị nhỏ nhất có thể vận dụng tự do
949 trong câu}''.
950 Theo một số tác giả khác của Trung Quốc thì ``\textit{Từ là đơn vị từ vựng, là
951 đơ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ó
952 khả năng vận dụng tư do trong lời nói}''.
954 Theo V. G. Admoni thì ``\textit{Từ là đơn vị ngữ pháp, do hình vị cấu tạo nên,
955 dùng để biểu thị đối tượng, quá trình, tính chất và những mối quan hệ
956 trong hiện thực, có tính đặc thù rõ rệt và có khả năng kiến lập nhiều
957 mối quan hệ đa dạng với nhau}''.
959 Theo R. A. Bunđagôp thì ``\textit{Từ là đơn vị nhỏ nhất và độc lập, có hình
960 thức vật chất (vỏ âm thanh và hình thức) và có nghĩa, có tính chất
961 biện chứng và lịch sử}''.
963 Đối với tiếng Việt, cũng có một số định nghĩa từ được đưa ra. Theo
964 M. B. Émeneau thì ``\textit{Từ bao giờ cũng tự do về mặt âm vị học, nghĩa là
965 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
966 những thanh điệu}''\footnote{Nguyễn Thiện Giáp. {\em Từ và nhận diện từ
967 tiếng Việt}. NXB GD, Hà Nội 1996. Trang 17}. Émeneau đã dựa trên mặt
968 ngữ âm để định nghĩa từ, xem mỗi từ trước hết là những âm tiết. Với
969 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à
970 trong thực tế thì người Việt luôn có khuynh hướng mong đợi mỗi tiếng
971 như vậy sẽ mang một nghĩa nào đó và coi đó như ``từ''.
973 Theo Trương Văn Trình và Nguyễn Hiến Lê thì ``\textit{Từ là âm có nghĩa, dùng
974 trong ngôn ngữ để diễn tả một ý đơn giản nhất, nghĩa là ý không thể
975 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
976 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ừ
977 có tính võ đoán và tính thành ngữ.
979 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
980 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
981 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
982 đơn vị tách rời và có một ý nghĩa hiểu được}''\footnote{Nguyễn
983 Kim Thản, {\em Nghiên cứu ngữ pháp tiếng Việt}. NXB GD, 1997. Trang
984 30}. Định nghĩa này dựa vào cả ba mặt: ngữ âm, chữ viết và ý
985 nghĩa. Tuy nhiên định nghĩa này mâu thuẫn với định nghĩa từ ghép của
986 chính tác giả, vì tác giả định nghĩa từ ghép dựa trên chức năng ngữ
987 pháp và gồm nhiều âm tiết.
989 Theo Phan Khôi thì ``\textit{Từ là một lời để tỏ ra một khái niệm trong khi
990 nói}''. Theo Nguyễn Lân thì ``\textit{Từ là những tiếng có nghĩa, tức là mỗi khi
991 nghe thấy, trong óc chúng ta đều có một khái niệm}''. Nếu xem từ tương
992 đương với khái niệm thì những từ hình thái như à, ư, nhỉ, nhé~\ldots{}
993 hay những hư từ như cũng, với, bởi~\ldots{} sẽ mang khái niệm gì? Trên
994 thực tế, từ và khái niệm không tương ứng 1-1 với nhau. Có những khái
995 niệm có thể biểu thị bằng nhiều từ.
997 Theo Nguyễn Kim Thản thì ``\textit{Từ là đơn vị cơ bản của ngôn ngữ, có thể
998 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à
999 là một khối hoàn chỉnh về mặt ý nghĩa (từ vựng hay ngữ pháp) và cấu
1000 tạo}''. Quan niệm của ông về ``đơn vị cơ bản'' là những đơn vị có số
1001 lượng hữu hạn để thông báo, trao đổi tư tưởng cho nhau. Đơn vị này
1002 phải có nghĩa, và khi sử dụng, người sử dụng phải có ý thức về
1003 nó. Chính vì vậy mà đơn vị cơ bản này không thể là câu (vì số lượng
1004 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ó
1005 nghĩa và khi sử dụng, người sử dụng không ý thức về nó). Vậy đơn vị cơ
1006 bản là cái gì đó nhỏ hơn câu và lớn hơn âm tiết.
1008 Theo Hồ Lê thì ``\textit{Từ là đơn vị ngữ ngôn có chức năng định danh phi liên
1009 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
1010 tự do, có tính vững chắc về cấu tạo và tính nhất thể về ý
1011 nghĩa}''. Theo ông, từ khác với âm tiết chủ yếu về mặt ý nghĩa. Từ có
1012 ý nghĩa ngữ ngôn, còn âm tiết thì chỉ có ý nghĩa tiền ngữ ngôn. Từ
1013 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
1014 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ừ
1015 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
1016 chức năng định danh phi liên kết hiện thực. Từ khác cụm từ cố định
1017 (thành ngữ, ngạn ngữ) chủ yếu bởi chức năng định danh phi liên kết
1018 hiện thực của nó.
1020 Đái Xuân Ninh chủ trương không định nghĩa từ, vì ``từ trước đến nay,
1021 trong ngôn ngữ học đại cương cũng như trong tiếng nói cụ thể như tiếng
1022 Việt, chưa có một định nghĩa nào thỏa đáng cả''. Theo ông thì ``đứng
1023 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ừ
1024 và mối quan hệ của nó với các đơn vị khác trong tiếng nói''. Ông cho
1025 rằng ta có thể nhận diện từ một cách khái quát như sau: ``\textit{Từ
1026 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ó
1027 được cấu tạo bằng một hay nhiều đơn vị ở hàng ngay sau nó tức là
1028 hình vị và lập thành một khối hoàn chỉnh}''.
1031 Nguyễn Tài Cẩn, tuy không định nghĩa trực tiếp từ tiếng Việt, nhưng
1032 ông đã chứng minh những tính chất đặc biệt của ``tiếng'', một đơn vị
1033 mà ông coi chính là hình vị và có tính năng rất gần với ``từ'', nó
1034 cũng chính là ``từ đơn'' và là thành tố trực tiếp để tạo nên ``từ
1035 ghép''. Theo ông, mọi đặc thù về từ pháp của tiếng Việt bắt nguồn từ
1036 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ị
1037 đặc biệt, đó chính là tiếng. Quan điểm này cũng được Cao Xuân Hạo đồng
1038 tình.
1040 Kế thừa quan điểm coi tiếng gần trùng với từ. Nguyễn Thiện Giáp đã
1041 phát triển tư tưởng này lên đến mực cực đoan là coi tiếng trong tiếng
1042 Việt chính là từ trong các ngôn ngữ Ấn-Âu. Theo ông ``\textit{Nếu quan
1043 niệm từ không chỉ là đơn vị ngôn ngữ học mà còn là đơn vị tâm
1044 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
1045 từ trong từng ngôn ngữ, nếu nhận diện từ căn cứ vào những quan hệ
1046 đối lập trong nội bộ từng ngôn ngữ thì cái đơn vị gọi là ``tiếng''
1047 của Việt ngữ có đủ tư cách để được gọi là ``từ''}''. Như vậy Nguyễn
1048 Thiện Giáp đã không sử dụng đến khái niệm hình vị trong tiếng Việt
1049 (đơn vị dùng để cấu tạo từ trong các ngôn ngữ Ấn-Âu). Trong quan niệm
1050 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ề
1051 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
1052 về ngữ pháp.
1054 \subsection{Đặc điểm của từ}
1056 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
1057 chung như sau:
1058 \begin{itemize}
1059 \item Về hình thức, từ phải là một khối về cấu tạo (chính tả, ngữ
1060 âm~\ldots{}).
1061 \item Về nội dung, từ phải có ý nghĩa hoàn chỉnh.
1062 \item Về khả năng, từ có khả năng hoạt động tự do và độc lập về cú
1063 pháp.
1064 \end{itemize}
1066 Đối với từ tiếng Việt, ta có thể rút ra những đặc điểm của từ tiếng
1067 Việt so với các ngôn ngữ thuộc loại hình khác.
1068 Tiếng Việt là một ngôn ngữ đơn lập với các đặc điểm chính như sau:
1069 \begin{itemize}
1070 \item Trong hoạt động ngôn ngữ, từ không biến đổi hình thái. Ý nghĩa
1071 ngữ pháp nằm ở ngoài từ.
1072 \item Phương thức ngữ pháp chủ yếu là trật tự từ và từ hư.
1073 \item Tồn tại một đơn vị đặc biệt là hình tiết mà vỏ ngữ âm của nó
1074 trùng khít với âm tiết. Đơn vị đó còn được gọi là tiếng.
1075 \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
1076 gốc từ.
1077 \end{itemize}
1079 %% Khái niệm ``đơn vị cơ bản'' trong ngôn ngữ phải giống như trong các
1080 %% ngành khác. Đó là những đơn vị mang đầy đủ các đòi hỏi về những tính
1081 %% chất phải có trong khái niệm ``cơ bản''. Chính vì vậy, trong ngôn ngữ
1082 %% học, khi nói đến ``đơn vị cơ bản'' thì số lượng đơn vị ấy phải không
1083 %% được quá nhiều mà của không được quá ít. Chiều dài của ``đơn vị cơ
1084 %% bản'' cũng không thể quá dài hoặc quá ngắn. Tuy nhiên đây chỉ là điều
1085 %% kiện ban đầu để xem xét đơn vị cơ bản. Đơn vị cơ bản cần phải thoả mãn
1086 %% nhiều điều kiện khác như kết cấu, nội dung~\ldots{}
1088 %% Xét về hình thức đơn vị ``tiếng'' trong tiếng Việt, ta thấy đơn vị này
1089 %% 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
1090 %% như chiều dài. Số lượng tiếng thường dùng khoảng 8.200 tiếng, tối đa
1091 %% 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
1092 %% chữ cái, tối đa khoảng 7 chữ cái.
1094 \subsection{Các quan niệm về hình vị và từ trong tiếng Việt}
1096 Đối với từ trong tiếng Việt, đến nay có một số quan điểm như sau:
1097 \begin{itemize}
1098 \item Coi mọi tiếng đều là từ (Nguyễn Thiện Giáp). Điều này thuận tiện
1099 trong xử lý nhưng không đúng với tiêu chí ngôn ngữ học đại cương vì
1100 có nhiều tiếng không có nghĩa, như ``phê'' trong ``cà phê'', ``bù''
1101 trong ``bù nhìn''~\ldots{}
1102 \item Coi tiếng chưa hẳn là từ (đa số các nhà Việt ngữ học). Trong số
1103 này chia thành ba nhóm sau:
1104 \begin{itemize}
1105 \item Xem tiếng là hình vị. Quan niệm có thể chấp nhận được nếu coi
1106 hình vị là hình vị tiếng Việt (gồm tha hình vị và á hình vị)
1107 \item Xem tiếng lớn hơn hình vị (Trần Ngọc Thêm, Lưu Văn
1108 Lang~\ldots{}) cho là tiếng có những hình vị (khuôn vần).
1109 \item Xem tiếng nhỏ hơn hoặc bằng hình vị. Đa số các tiếng đều là
1110 hình vị, ngoại trừ ``hấu'' trong ``dưa hấu'', ``bù'' trong ``bù
1111 nhìn''~\ldots{} vì những tiếng này không có nghĩa. Quan điểm này được
1112 nhiều người chấp nhận.
1113 \end{itemize}
1114 \item Xem tiếng châu Âu (Anh, Pháp~\ldots{}) cái nào là từ thì trong
1115 tiếng Việt cái đó là từ. Quan điểm này chưa xét đến sự khác biệt về
1116 sự từ vựng hoá giữa hai ngôn ngữ do khác biệt về văn hoá.
1117 \end{itemize}
1119 Theo quan điểm ngôn ngữ học đại cương, từ được cấu tạo bởi các hình
1120 vị, và hình vị chính là các đơn vị có nghĩa nhỏ nhất. Vì vậy, từ trong
1121 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ó
1122 đ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
1123 niệm hình vị của ngôn ngữ học đại cương, mà là ``hình vị tiếng Việt''
1124 hay còn gọi là ``hình tiết'' (hình vị + âm tiết) hay ``tiếng'' (vì chỉ
1125 tiếng Việt mới có đơn vị tiếng đặc biệt như vậy).
1129 \section{Từ láy}
1131 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ệ
1132 ngữ âm. Số lượng từ láy trong tiếng Việt rất lớn, khoảng 4000 từ. Quan
1133 hệ ngữ âm trong từ láy thể hiện ở hai mặt:
1134 \begin{itemize}
1135 \item Tương ứng về yếu tố siêu đoạn tính (thanh điệu)
1136 \item Tương ứng về yếu tố âm đoạn tính (phụ âm đầu, vần và các yếu tố
1137 trong vần)
1138 \end{itemize}
1142 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:
1143 hoặc thuộc âm vực cao (ngang, hỏi, sắc), hoặc thuộc âm vực thấp
1144 (huyền, ngã, nặng)\footnote{Trong tiếng Việt hiện đại, thanh ngã thuộc
1145 âm vực cao, thanh hỏi thuộc âm vực thấp. Tuy nhiên về mặt lịch sử,
1146 thanh hỏi trước kia thuộc âm vực cao còn thanh ngã lại thuộc âm vực
1147 thấp (A.G. Haudricourt, 1954)}
1149 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,
1150 láy phụ âm đầu). Luật hài thanh của mỗi kiểu láy có đặc điểm riêng:
1151 \begin{itemize}
1152 \item Trong các từ láy toàn bộ, âm tiết đầu thường là một trong các
1153 thanh bằng (1, 2) còn âm tiết thứ hai thường là một trong các thanh
1154 trắc (3, 4, 5, 6) cùng âm vực với nó.
1155 \item Trong các từ điệp vận, thường có xu hướng thống nhất các thanh
1156 điệu ở cả hai âm tiết. Theo thống kê của Nguyễn Thiện Giáp, có 81\%
1157 số từ láy vần có thanh điệu hai âm tiết giống nhau hoàn toàn. Trong
1158 một số trường hợp, sự kết hợp của thanh điệu trong từ láy không theo
1159 đúng luật hài thanh (như \textit{khe khẽ, se sẽ, xốp xộp~\ldots}) có
1160 thể giải thích bằng sự thay đổi lịch sử của thanh ngã từ âm vực thấp
1161 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
1162 với nó, hoặc do quan hệ với cơ chế láy ba.
1163 \item Trong các từ láy phụ âm đầu, thanh điệu của hai âm tiết không
1164 bắt buộc phải giống nhau, chỉ cần hai thanh điệu ở hai âm tiết cùng
1165 âm vực là được.
1166 \end{itemize}
1168 Sự phân bố thanh điệu trong các từ láy tiếng Việt tuân theo luật
1169 phù-trầm. Luật hài hoà thanh điệu này bị chế định rõ rệt trong kiểu
1170 láy vần do mối quan hệ chặt chẽ giữa vần và thanh điệu.
1172 %% \section{Từ ghép}
1174 %% XXX
1176 \section{Chính tả tiếng Việt}
1179 \subsection{Tổng quan về chữ viết tiếng Việt}
1182 % Nổ một tí về chữ quốc ngữ
1184 Chữ viết là một trong những phương tiện giao tiếp hiệu quả. Chữ viết
1185 cho phép vượt qua những giới hạn về không gian và thời gian của tiếng
1186 nói. Nhờ đặc điểm này, chữ viết được sử dụng rộng rãi trong nhiều lĩnh
1187 vực khác nhau của đời sống.
1189 Có nhiều hệ thống chữ viết khác nhau được sử dụng trên thế giới, nhưng
1190 nhìn chung có thể phân thành hai loại chữ viết sau:
1191 \begin{description}
1192 \item[Chữ viết ghi ý] Đây là loại chữ viết biểu hiện từ bằng một ký
1193 hiệu duy nhất, không liên quan gì đến những âm thanh cấu tạo nên
1194 từ. Ký hiệu này liên quan với cả từ và do đó cũng gián tiếp có quan
1195 hệ với ý niệm mà từ đó biểu hiện. Loại này bao gồm chữ Trung Quốc, chữ Ai
1196 Cập~\ldots{}
1198 Vì các ký hiệu chữ viết không phản ánh mặt âm thanh và hình thức ngữ
1199 pháp của từ mà phản ánh mặt ý nghĩa, nên trong tiếng Trung Quốc
1200 những từ đồng âm được biểu hiện bằng những chữ hoàn toàn khác nhau.
1202 \item[Chữ viết ghi âm] Đây là loại chữ viết nhằm tái hiện chuỗi âm
1203 thanh nối tiếp nhau trong từ. Các hệ thống chữ viết ngữ âm học có
1204 thể ghi âm tiết hay âm tố.
1205 \begin{description}
1206 \item[Chữ ghi âm tiết] Mỗi ký hiệu ghi một âm tiết. Dẫn chứng cho
1207 loại chữ viết này là hệ thống chữ Nhật Hiragana và Katakana.
1209 \item[Chữ ghi âm tố] Mỗi ký hiệu ghi một âm tố (hay âm vị). Ví dụ
1210 như chữ Anh, chữ Pháp, chữ Nga~\ldots{}
1212 \end{description}
1213 \end{description}
1215 Hệ thống chữ viết được sử dụng hiện nay của nước ta là chữ quốc
1216 ngữ. Nước ta trước đây vẫn dùng chữ Hán và chữ Nôm. Chữ quốc ngữ được
1217 hình thành từ thời Pháp đô hộ nước ta, được người Pháp sử dụng
1218 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.
1220 Chữ quốc ngữ ra đời cách nay khoảng ba thế kỷ. Đó là công trình của
1221 một nhóm các cố đạo người châu Âu cộng tác cùng một số người
1222 Việt. Người để lại nhiều tác phẩm có giá trị trong giai đoạn đầu của
1223 chữ quốc ngữ là Alexandre de Rhodes.
1225 % Đặc điểm chữ quốc ngữ
1227 Chữ quốc ngữ là một lối chữ ghi âm, dùng chữ cái Latin. Nó dùng những
1228 ký hiệu (tức là những con chữ, mượn từ chữ cái Latin, có thêm các dấu
1229 phụ) để ghi lại những âm vị, âm tố và các thanh điệu tiếng Việt. Chữ
1230 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ữ
1231 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 ý,
1232 tuy có nhiều thành phần ghi âm.
1234 So với chữ Nôm, chữ quốc ngữ có tiến bộ rất lớn vì nó là chữ ghi âm
1235 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
1236 được hệ thống âm thanh tiếng Việt.
1238 So với các hệ thống chữ ghi âm khác như chữ Anh, chữ Pháp thì chữ quốc
1239 ngữ là một hệ thống ``chữ viết trẻ'', mới được dùng phổ biến hơn
1240 một thế kỷ nay, nên giữa chữ và âm tương đối có sự phù hợp.
1242 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,
1243 có nghĩa là ``phát âm thế nào thì viết thế ấy'', nên có sự tương ứng
1244 khá lớn giữa chữ viết và phát âm.
1249 \subsection{Chính tả tiếng Việt}
1252 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
1253 thực hành chữ viết, bao gồm:
1254 \begin{enumerate}
1255 \item Những luật dùng các con chữ của bảng chữ cái để viết các từ.
1256 \item Luật viết các từ độc lập với những chữ cái khi viết chúng.
1258 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{}
1259 \end{enumerate}
1261 Chuẩn mực của cách viết thường tuân theo những nguyên tắc khác nhau.
1263 Đối với những luật chính tả liên quan đến việc sử dụng các con
1264 chữ của bảng chữ cái ghi âm, có thể kể đến các nguyên tắc cơ bản sau
1265 đây:
1267 \begin{description}
1268 \item[Nguyên tắc âm vị học] Mỗi âm vị được thể hiện bằng một
1269 chữ cái, không phụ thuộc vào vị trí của nó trong các từ và tổ hợp
1270 từ.
1271 \item[Nguyên tắc ngữ âm học] Chữ cái phản ánh phát âm của âm vị ở
1272 những vị trí hay bối cảnh khác nhau.
1273 \item[Nguyên tắc từ nguyên] Nguyên tắc viết theo lịch sử, truyền
1274 thống. Phản ánh trên chữ viết không phải là trạng thái hiện tại mà
1275 là trạng thái quá khứ của hệ thống âm thanh.
1276 \end{description}
1278 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
1279 nguyên tắc khác nhau. Nhưng mỗi hệ thống chữ viết có những nguyên tắc
1280 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
1281 và ngữ âm học. Ngược lại, chữ Pháp và chữ Anh chủ yếu dùng nguyên tắc
1282 từ nguyên, viết theo truyền thống lịch sử.
1284 % Cấu trúc âm tiết:
1285 Âm tiết trong tiếng Việt có 5 thành phần, đó là thanh điệu, âm đầu, âm
1286 đệm, âm chính và âm cuối.
1288 Âm đầu các âm vị phụ âm đảm nhiệm. Các âm tiết mà có chữ trên chữ viết
1289 không ghi phụ âm đầu có thể có âm đầu là âm tắt thanh hầu \textipa{/P/}.
1291 Âm đệm do các âm vị bán nguyên âm \textipa{/-u-/} đảm nhiệm.
1293 Âm chính do các âm vị nguyêm âm đảm nhiệm như trong bảng~\ref{tab:nguyenam}.
1295 %\begin{savenotes}
1296 \begin{table}[htbp]
1297 \centering
1299 \begin{tabular}{cc|cc}
1300 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1301 \textipa{/i/}&i,y&\textipa{/o/}&ô,ôô\\
1302 \textipa{/e/}&ê&\textipa{/O/}&o,oo\\
1303 \textipa{/E/}&e,a&\textipa{/\v{7}/}&â\\
1304 \textipa{/W/}&ư&\textipa{/\v{a}/}&a,ă\\
1305 \textipa{/7/}&ơ&\textipa{/ie/}&iê,ia,yê,y\\
1306 \textipa{/a/}&a&\textipa{/uo/}&uô,ua\\
1307 \textipa{/u/}&u&\textipa{/W7/}&ươ,ưa\\
1308 \end{tabular}
1310 \caption{Bảng nguyên âm}
1311 \label{tab:nguyenam}
1312 \end{table}
1313 %\end{savenotes}
1315 Âm cuối do các âm vị phụ âm bán nguyên âm đảm nhiệm như trong
1316 bảng~\ref{tab:amcuoi}.
1318 \begin{table}[htbp]
1319 \centering
1321 \begin{tabular}{cc|cc}
1322 \multicolumn{2}{c|}{Phụ âm cuối}&\multicolumn{2}{c}{Bán nguyên âm cuối}\\
1323 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1324 \textipa{/-p/}&p&\textipa{/-u/}&u,o\\
1325 \textipa{/-t/}&t&\textipa{/-i/}&i,y\\
1326 \textipa{/-k/}&c,ch\\
1327 \textipa{/-m/}&m\\
1328 \textipa{/-n/}&n\\
1329 \textipa{/-N/}&ng,nh\\
1330 \end{tabular}
1332 \caption{Bảng phụ âm và bán nguyên âm cuối}
1333 \label{tab:amcuoi}
1334 \end{table}
1336 Trên chữ viết, các âm vị âm đầu được thể hiện như trong bảng~\ref{tab:phuamdau}
1338 %\begin{savenotes}
1339 \begin{table}[htbp]
1340 \centering
1341 \begin{minipage}[htbp]{0.6\textwidth}
1342 \def\thefootnote{\alph{mpfootnote}}
1343 \centering
1345 \begin{tabular}{cc|cc}
1346 Âm vị&Chữ cái&Âm vị&Chữ cái\\
1347 \textipa{/b/}&b&\textipa{/m/}&m\\
1348 \textipa{/f/}&ph&\textipa{/v/}&v\\
1349 \textipa{/t\super{h}/}&th&\textipa{/t/}&t\\
1350 \textipa{/d/}&đ&\textipa{/n/}&n\\
1351 \textipa{/s/}&x&\textipa{/z/}&d,gi\footnote{Dựa vào nguyên tắc từ nguyên để phân biệt}\\
1352 \textipa{/l/}&l&\textipa{/\:t/}&tr\\
1353 \textipa{/\:s/}&s&\textipa{/\:z/}&r\\
1354 \textipa{/c/}&ch&\textipa{/\textltailn/}&nh\\
1355 \textipa{/k/}&
1356 q\footnote{Dùng khi đứng trước bán nguyên âm \textipa{/-u-/}},
1357 k\footnote{Dùng khi đứng trước các nguyên âm \textipa{/i,e,E,ie/}},
1359 \textipa{/N/}&ngh\footnotemark, ng\\
1360 \textipa{/x/}&kh&\textipa{/G/}&gh\footnotemark, g\\
1361 \textipa{/h/}&h&\textipa{/P/}&khuyết\\
1362 \end{tabular}
1364 \caption{Bảng phụ âm đầu}
1365 \label{tab:phuamdau}
1367 \end{minipage}
1368 \end{table}
1369 %\end{savenotes}
1371 Một số âm như k và q, gh và g, ngh và ng là cùng âm vị. Tuy nhiên, do
1372 khi hình thành chữ quốc ngữ, ngữ âm tiếng Việt chưa được nghiên cứu
1373 đầy đủ, nên các giáo sĩ đã phải mượn nhiều con chữ ghép trong chữ Bồ
1374 Đào Nha, Hi Lạp, Pháp, Ý~\ldots{} dẫn đến sự không đồng nhất khi biểu
1375 diễn âm vị.
1377 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
1378 nguyên âm dài, 2 nguyên âm ngắn, 3 nguyên âm đôi. Tóm gọn các cách
1379 biểu diễn nguyên âm chính gồm: i, y, ê, e, a, ư, ơ, a, u, ô, o, â, ă,
1380 iê, ia, yê, y, uô, y, uô, ươ, ưa.
1382 Các phụ âm cuối được ghi bằng ``ch'' khi đứng sau các nguyên âm i, y,
1383 ê, e, a. Ví dụ: {\em minh, mênh, manh}. Trong các trường hợp khác lại
1384 được ghi bằng ``ng''. Ví dụ: {\em mang, vâng, hồng, xuống}.
1386 Các bán nguyên âm cuối /-u/ ghi bằng ``o'' khi đứng sau các nguyên âm đơn
1387 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
1388 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
1389 nguyên âm này được ghi bằng ``u''.
1391 Các bán nguyên âm cuối /-i/ được ghi bằng ``y'' khi đứng sau các
1392 nguyên âm ngắn ă, a, â. Trong các trường hợp khác nó được ghi bằng
1393 ``i''.
1395 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,
1396 m, n, ng, nh, u, o, i, y.
1398 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.
1400 Về việc bỏ dấu, có ba nguyên tắc bỏ dấu sau:
1401 \begin{description}
1402 \item[Nguyên tắc bỏ dấu khoa học] Dấu thanh được đặt ở âm chính của
1403 vần, tức là đặt trên hoặc dưới nguyên âm có vai trò quyết định âm
1404 sắc chủ yếu của âm tiết.
1405 \item[Nguyên tắc thẩm mỹ] (nguyên tắc thứ yếu) Dấu thanh được đặt ở vị
1406 tri cân đối trong âm tiết. Nguyên tắc này trước đây hay dùng nhưng
1407 nay trong một số trường hợp nếu đặt dấu thanh sai sẽ làm cho phát âm
1408 không đúng và hiểu sai nghĩa từ.
1409 \item[Nguyên tắc thực dụng] Dấu thanh thường được đặt vào một con chữ
1410 nguyên âm chứ không đặt ở giữa hai con chữ, để tiện việc in ấn.
1411 \begin{itemize}
1412 \item Nếu âm chính là một nguyên âm đơn thì dấu thanh luôn luôn được
1413 ghi ở trên hoặc ở dưới âm chính.
1414 \item Nếu âm chính là một nguyên âm đôi thì tùy trường hợp có thể bỏ
1415 đấu thanh ở yếu tố thứ nhất hoặc yếu tố thứ hai của âm chính.
1416 \end{itemize}
1417 \end{description}
1419 %XXX \subsection{Những qui định về chính tả tiếng Việt}
1422 \subsection{Lỗi chính tả}
1424 % Lỗi chính tả là gì?
1426 Theo~\cite{LoiChinhTa} thì:
1427 \begin{verse}
1428 Chữ viết là hệ thống ký hiệu bằng đường nét đặt ra để ghi tiếng nói
1429 và có những qui tắc, qui định riêng. Muốn viết đúng chính tả tiếng
1430 Việt, ta phải tuân theo những qui định, qui tắc đã được xác lập.
1432 Chính tả là cách viết chữ được xem là chuẩn, tức là viết đúng âm
1433 đầu, đúng vần, đúng dấu (thanh), đúng quy định về viết hoa, viết
1434 tắt, viết thuật ngữ.
1435 \end{verse}
1437 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
1438 sai (lỗi hỏi-ngã, lỗi sai âm đầu, sai âm chính, sai âm cuối). Ngoài ra
1439 còn các loại lỗi khác như viết hoa không đúng qui cách, viết tên
1440 riêng, thuật ngữ, tên tiếng nước ngoài không đúng qui cách.
1442 %% 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
1443 %% hai thanh hỏi và ngã. Loại lỗi này rất phổ biến, kể cả ở những người
1444 %% có trình độ văn hoá cao. Nguyên nhân là do các phương ngữ Trung và Nam
1445 %% Bộ không có thanh ngã. Ngoài ra số tiếng mang hai thanh này khá lớn
1446 %% (khoảng 1900 tiếng mang thanh hỏi và 900 tiếng mang thanh ngã)
1448 %% Về âm đầu, các âm sau thường bị lẫn lộn: C/K, G/Gh, Ng/Ngh,
1449 %% Ch/Tr, S/X, V/D/Gi/R, W/Hw/Ngw/Qu.
1451 %% Về âm chính thường lẫn lộn các âm sau: ai/ay/ây,
1452 %% ao/au/âu, ăm/âm, ăp/âp, iu/iêu/êu, im/iêm/em, ip/iêp/êp/ep,
1453 %% oi/ôi/ơi, om/ôm/ơm, op/ôp/ơp, ong/ông, oc/ôc, ui/uôi, um/uôm, up/(uôp),
1454 %% ưi/ươi, ưu/ươu, ưm/ươm, (ưp)/ươp.
1456 %% Về âm cuối thường lẫn lộn chữ ghi các âm cuối trong các vần sau:
1457 %% an/ang, at/ac, ăn/ăng, ăt/ăc, ân/âng, ât/âc, en/eng, et/ec, ên/ênh,
1458 %% êt/êch, in/inh, it/ich, iên/iêng, iêt/iêc, ơn/(ơng), ơt/(ơc),
1459 %% un/ung, ut/uc, uôn/uông, uôt/uôc, ưn/ưng, ưt/ưc, ươn/ương, ươt/ươc.
1461 %% Sai quy cách viết hoa do chưa thống nhất quy cách viết hoa (hoặc thống
1462 %% nhất quá trễ)
1465 %% XXX
1467 \chapter{Cơ sở tin học}
1468 \label{cha:math}
1469 \minitoc
1471 % typographic errors
1473 %% Lỗi gõ sai được xử lý bằng thuật toán soundex~\cite{soundex}. Ý tưởng
1474 %% 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
1475 %% lỗi. Theo~\cite{soundex}, có bốn nguyên nhân gây ra lỗi loại này:
1476 %% \begin{itemize}
1477 %% \item Chèn một ký tự đơn.
1478 %% \item Xoá một ký tự đơn.
1479 %% \item Thay một ký tự bằng một ký tự khác.
1480 %% \item Hoán đổi vị trí hay ký tự kề nhau.
1481 %% \end{itemize}
1482 %% Thuật toán này
1484 \section{Bắt lỗi chính tả}
1486 Trình bắt lỗi chính tả có thể được đánh giá theo nhiều cách khác
1487 nhau. Nhưng chủ yếu vẫn được phân loại từ quan điểm người dùng: khả
1488 năng phát hiện lỗi sai, và khả năng đề nghị những từ thay thế cho lỗi
1489 sai đó.
1491 \subsection{Phân loại lỗi chính tả}
1493 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
1494 chương trình bắt lỗi chính tả thì lỗi chính tả có thể phân làm hai
1495 loại là lỗi non-word và lỗi real-word (được sử dụng trong~\cite{Tuoi}):
1496 \begin{itemize}
1497 \item Lỗi non-word là lỗi tạo ra từ sai, hoàn toàn không có trong từ
1498 điển. Đây là loại lỗi dễ phát hiện. (Ví dụ, ``hoa2'',
1499 ``nhưg''~\ldots)
1500 \item Lỗi real-word là lỗi chính tả mà từ/tiếng đó có trong từ điển. Nếu
1501 không dựa vào ngữ cảnh chung quanh thì không thể xác định đó có phải
1502 là lỗi chính tả hay không. (Ví dụ, ``Anh ta là một người bàng
1503 quang'' --- từ ``bàng quang'' không đúng, nhưng vẫn có trong từ
1504 điển). Đây là loại lỗi rất khó nhận ra và xử lý.
1505 \end{itemize}
1507 Ngoài ra có thể phân loại lỗi theo nguồn gốc phát sinh lỗi. Theo cách
1508 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
1509 nhập sai.
1510 \begin{itemize}
1511 \item Lỗi phát âm sai.
1512 Lỗi này do sự nhầm lẫn giữa cách đọc và cách
1513 viết giữa những từ đồng âm hoặc gần với nhau. Với tiếng Việt, do có
1514 nhiều khác biệt cách phát âm giữa các vùng trong khi hệ thống chữ
1515 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
1516 sai loại này.
1518 \item Lỗi nhập sai.
1519 Lỗi gây ra do gõ sai phím, gõ sót phím hoặc dư phím.
1521 \item Các lỗi khác.
1522 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
1523 chính tả. Một trong những nguyên nhân đó là lỗi dùng từ sai (do hiểu
1524 sai, hoặc không hiểu rõ cách dùng từ). Đây thực chất thuộc về lỗi từ
1525 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
1526 tìm ra những lỗi này.
1528 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
1529 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
1530 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
1531 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ố
1532 ngôn ngữ như tiếng Anh --- mỗi từ gồm nhiều âm tiết --- thì có thể gây
1533 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
1534 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
1535 cũng được cài đặt một trình bắt lỗi chính tả tự động (dạng đơn giản
1536 hoặc phức tạp) nhằm giảm thiểu các lỗi chính tả.
1537 \end{itemize}
1539 %\subsection{Phân loại lỗi}
1541 \noindent Theo \cite{Chang} thì lỗi bao gồm:
1542 \begin{itemize}
1543 \item Giống phiên âm
1544 \item Giống hình dạng chữ viết
1545 \item Giống nghĩa
1546 \item Giống cách gõ
1547 \end{itemize}
1549 \subsection{Phát hiện lỗi chính tả}
1551 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ữ
1552 liệu để lưu tất cả các từ đã biết (được lưu trong từ điển). Nếu từ
1553 không có trong từ điển nghĩa là từ đó bị sai. Giải pháp này cần thêm
1554 một số heuristic để tránh không xem các con số, ngày tháng~\ldots{}
1555 lỗi sai.
1557 Đố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
1558 rất quan trọng. Từ điển có thể được lưu theo các dạng
1559 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ể
1560 được sử dụng~\cite{McIlroy,Peterson}
1562 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
1563 khác phức tạp hơn để phát hiện (chi tiết trong
1564 phần~\ref{sec:context-spelling}).
1566 \subsection{Các sai lầm của trình bắt lỗi chính tả}
1568 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ó
1569 thể phân ra làm hai loại sai lầm: sai lầm tích cực\footnote{false
1570 positive} và sai lầm tiêu cực\footnote{false negative}.
1572 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
1573 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
1574 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
1575 từ sai chính tả này không sai. Sai lầm tích cực có thể tránh được nhờ
1576 tăng kích thước từ điển. Tuy nhiên đây không phải là giải pháp hoàn
1577 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ư
1578 công sức bỏ ra để xây dựng từ điển). Hơn nữa, càng có nhiều
1579 từ thì việc đề nghị các từ thay thế càng trở nên kém hiệu quả do bị
1580 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
1581 phổ biến.
1583 Sai lầm tiêu cực có thể xem là lỗi không phát hiện được. Phần nhiều
1584 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
1585 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
1586 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
1587 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
1588 lỗi chính tả cảm ngữ cảnh (xem phần~\ref{sec:context-spelling}).
1590 %~\cite{Golding95,Golding96,Golding99}
1592 Trong hai loại sai lầm thì sai lầm tích cực thường gây khó chịu cho
1593 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
1594 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
1595 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
1596 hiệu quả.
1598 \subsection{Vấn đề chữ hoa, chữ thường}
1600 Vấn đề chữ hoa/chữ thường gây nhiều khó khăn cho trình bắt lỗi chính
1601 tả. Trong từ điển, hầu hết các từ là chữ thường. Tuy nhiên cũng có chữ
1602 hoa (tên riêng, từ viết tắt~\ldots{}). Các quy tắc chính tả về viết hoa
1603 cũng khá phức tạp. Ngoài ra, đôi khi các chữ được viết hoa hoàn toàn
1604 để nhấn mạnh, để làm tiêu đề~\ldots{}
1606 Thuật toán để xử lý trường hợp chữ hoa, chữ thường có thể được mô tả
1607 như trong thuật toán~\ref{algo:capital}.
1608 \begin{algo}
1609 \caption{Xử lý chữ hoa, chữ thường}
1610 \label{algo:capital}
1611 \begin{enumerate}
1612 \item Đặt $w_t$ là chữ viết thường của $w$.
1613 \item Đặt $c$ là kết quả tìm kiếm $w_t$.
1614 \item Nếu không tìm được $c$, từ bị sai chính tả.
1615 \item Nếu $c$ giống $w$, từ đúng.
1616 \item Đặt $c_c$ là chữ thường, viết hoa chữ cái đầu tiên của $w$. Nếu
1617 $c$ giống $c_c$, từ đúng.
1618 \item Đặt $c_u$ là chữ hoa của $w$. Nếu $c$ giống $c_u$, từ đúng.
1619 \item Ngược lại, từ $w$ sai.
1620 \end{enumerate}
1621 \end{algo}
1625 \section{Lập danh sách từ đề nghị}
1626 \label{sec:candidate-list}
1628 Sau khi phát hiện ra từ bị sai chính tả, ta cần đưa ra một số từ ``gần
1629 giống'' có khả năng thay thế từ bị sai chính tả. Trong trường hợp lý
1630 tưởng, ta nên đưa ra {\em duy nhất một từ}, đó chính là từ đúng
1631 chính tả, lẽ ra cần phải được dùng thay cho từ bị sai chính tả.
1633 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
1634 không dễ dàng, ngay cả với con người. Khi gặp một từ sai chính tả, ta
1635 thường phải suy nghĩ nhiều, chọn ra một số từ có khả năng thay thế,
1636 kiểm nghiệm xem từ nào là từ thích hợp nhất. Quá trình kiểm nghiệm xem
1637 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
1638 đang xem (đối với con người). Đối với máy tính, việc hiểu văn bản, đến
1639 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
1640 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
1641 \ref{sec:context-spelling}). Việc tìm ra chỉ một kết quả duy nhất đưa
1642 đế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
1643 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
1644 chính tả) tự động. Việc tạo ra một chương trình bắt lỗi chính tả tự
1645 độ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
1646 giảm đáng kể công sức của con người.
1648 Trong trường hợp không thể đưa ra duy nhất một đề nghị, ta có thể đưa
1649 ra một danh sách các từ ``có khả năng'' để người dùng chọn lựa. Yêu
1650 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
1651 nữa là từ đúng nên được đặt trên cùng danh sách để gây sự chú ý của
1652 người dùng (chi tiết trong phần \ref{sec:sort-candidates}). Để đảm
1653 bảo từ đúng nằm trong danh sách, ta cần tìm hiểu nguyên nhân dẫn đến
1654 lỗi, sau đó cố gắng phục hồi lỗi để tạo lại những từ có khả năng. Do
1655 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
1656 cách khác nhau để phát sinh danh sách từ đề nghị.
1659 \subsection{Lỗi phát âm sai}
1661 Đối với các ngôn ngữ như tiếng Việt --- vốn ``nói sao viết vậy'', giải
1662 pháp khá đơn giản. Ta có thể phân tích cấu trúc tiếng trong tiếng
1663 Việt, sau đó dựa vào các cách phát âm giống nhau để tạo ra danh sách
1664 các tiếng phát âm giống nhau.
1666 Đối với các ngôn ngữ như tiếng Anh --- cách viết không còn tương ứng
1667 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
1668 cách nào đó để chuyển từ được viết thành một dạng phiên âm, sau đó áp
1669 dụng như bình thường. Một số heuristic được đưa ra để giải quyết vấn
1670 đề này. Thuật toán cơ bản là Soundex~\cite{knuth73}. Nhiều thuật toán
1671 khác được đưa ra để cải tiến Soundex như Double
1672 Metaphone\footnote{http://aspell.sourceforge.net/metaphone/},
1673 Phonetex~\cite{phonetex}. Soundex cũng được cải tiến để áp dụng cho
1674 các ngôn ngữ khác, như tiếng Thái~\cite{tsdx}. Nói chung, các kỹ thuật
1675 này biến đổi về cơ bản thay thế các ký tự trong từ bằng như ký tự khác
1676 chung hơn, với mục đích làm cho sau khi biến đổi, các từ có cách đọc
1677 giống nhau sẽ trở nên giống nhau. Ví dụ như trong Soundex:
1678 \begin{itemize}
1679 \item Các ký tự ``aeiouhwy'' được thay bằng ``0''.
1680 \item ``bpfv'' được thay bằng ``1''.
1681 \item ``cgjkqsxz'' được thay bằng ``2''.
1682 \item ``dt'' được thay bằng ``3''.
1683 \item ``l'' được thay bằng ``4''.
1684 \item ``mn'' được thay bằng ``5''.
1685 \item ``r'' được thay bằng ``6''.
1686 \end{itemize}
1687 Cách thay thế khác nhau tùy vào từng thuật giải. Ngoài ra, các
1688 thuật giải có thể giữ lại một số ký tự mà không thay thế.
1690 \subsection{Lỗi nhập sai}
1692 Lỗi nhập liệu xảy ra khi gõ không
1693 đúng phím cần gõ trên bàn phím. Damerau~\cite{Damerau} xác định bốn thao
1694 tác có thể gây ra lỗi như sau:
1695 \begin{itemize}
1696 \item Tráo đổi một cặp ký tự.
1697 \item Xóa một ký tự đã có.
1698 \item Chèn một ký tự lạ.
1699 \item Thay một ký tự bằng một ký tự khác.
1700 \end{itemize}
1702 Damerau cho rằng 80\% các lỗi là do thực hiện thao tác trên một lần
1703 (một trong bốn thao tác trên).
1705 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
1706 giản được dùng bởi~\cite{Petersonb}. Nếu phát hiện một từ bị sai
1707 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ừ
1708 bị sai chính tả. Những từ được phát sinh, nếu có trong từ điển, sẽ
1709 được lưu vào danh sách những từ đề nghị. Kỹ thuật này thường được gọi
1710 là Đảo ngược lỗi\footnote{Error reversal}.
1712 \subsection{Các lỗi khác}
1714 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
1715 chính tả. Một trong những nguyên nhân đó là lỗi dùng từ sai (do hiểu
1716 sai, hoặc không hiểu rõ cách dùng từ). Đây thực chất thuộc về lỗi từ
1717 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
1718 tìm ra những lỗi này.
1720 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
1721 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
1722 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
1723 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ố
1724 ngôn ngữ như tiếng Anh --- mỗi từ gồm nhiều âm tiết --- thì có thể gây
1725 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
1726 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
1727 cũng được cài đặt một trình bắt lỗi chính tả tự động (dạng đơn giản
1728 hoặc phức tạp) nhằm giảm thiểu các lỗi chính tả.
1730 \section{Sắp xếp danh sách từ đề nghị}
1731 \label{sec:sort-candidates}
1734 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ễ
1735 dàng. \cite{Agirre} mô tả cách lựa chọn trong trường hợp
1736 này, có thể chia làm các nhóm như sau:
1738 \begin{itemize}
1739 \item Sử dụng phân tích cú pháp để loại bỏ những từ sai từ loại, hoặc
1740 sai các đặc trưng hình thái (số đếm, chữ hoa/chữ thường~\ldots{})
1741 \item Khử nhập nhằng ngữ nghĩa để chọn từ phù hợp với ngữ cảnh nhất.
1742 \item Dùng thống kê để chọn từ thường xuất hiện nhất.
1743 \item Những từ có cách viết hoa/thường khác với từ bị sai sẽ bị loại
1744 (ví dụ, nếu từ viết sai là chữ thường thì các từ đề nghị viết hoa sẽ
1745 bị loại)
1746 \end{itemize}
1749 Một số kỹ thuật để sắp xếp danh sách từ được chọn sẽ được mô tả ngắn
1750 gọn bên dưới.
1751 %%% Giải thích cụ thể hơn.
1753 \subsection{Văn phạm ràng buộc}
1755 %-% Constraint Grammar a Language independent system for parsing
1756 %-% unrestricted text.
1758 Văn phạm ràng buộc\footnote{Constraint Grammar} (CG) được thiết kế
1759 độ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
1760 bản không giới hạn~\cite{cg}.
1762 CG có thể được xem như một tập hợp các luật mẫu-hành
1763 động\footnote{pattern-action rule}, không quá một luật với mỗi tag có nhập
1764 nhằng. Mỗi luật xác định một hoặc nhiều mẫu (các ``ràng buộc'') xác
1765 định khi nào tag đó không hợp lệ. Nếu thỏa một mẫu trong số các mẫu
1766 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
1767 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
1768 nhằng. Thuật toán sẽ được chạy vài lần để giảm nhập nhằng từ từ, nhờ đó
1769 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
1770 kiện khử nhập nhằng những từ khác.
1772 Mô tả cú pháp và hình thái được mã hoá bằng tag thay vì cấu trúc đóng
1773 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
1774 năng cú pháp\footnote{syntactic function tag}, quy định mô tả phụ
1775 thuộc về mặc chức năng.
1777 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
1778 giải pháp đúng. Do đó CG chỉ giúp giảm số lượng các nhập nhằng. Văn
1779 phạm ràng buộc tiếng Anh (EngCG) đã giúp cải thiện đáng kể chất
1780 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ỏ
1781 hầu hết các nhập nhằng có thể được.
1783 % XXX vd
1786 Việc áp dụng CG để khử nhập nhằng cho trình bắt lỗi chính tả là một
1787 công việc khó khăn vì hiện nay CG cho tiếng Việt vẫn chưa được xây
1788 dựng.
1790 \subsection{Mật độ quan niệm}
1791 %-% Word Sense disambiguation using conceptual density 96.
1794 Đây thực chất là áp dụng khử nhập nhằng ngữ nghĩa dùng
1795 WordNet và độ đo khoảng cách giữa các khái niệm trong WordNet. Cách
1796 này được áp dụng cho danh từ.
1798 WordNet là một mạng ngữ nghĩa về từ vựng tiếng Anh, bao gồm các mối
1799 liên hệ khác nhau giữa các từ tiếng Anh. WordNet định nghĩa các quan
1800 hệ khác nhau cho mỗi từ loại. Đối với danh từ thì hai loại quan hệ
1801 quan trọng nhất là hypernym và hyponym.
1803 A được xem là hyponym của B
1804 (và B là hypernym của A) nếu ta có thể nói ``A là một loại đặc biệt
1805 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
1806 vật (và thực vật là hypernym của cây)
1808 WordNet được tổ chức theo đơn vị là các synset. Synset
1809 (Synonym set) là một nhóm các từ đồng nghĩa có thể dùng thay thế cho
1810 nhau. Mỗi từ có thể thuộc nhiều synset khác nhau. Trong trường hợp đó,
1811 các syset được gọi là sense của từ đó. Phần danh từ trong WordNet có
1812 thể xem như một đồ thị của các synset và các liên kết hypernym/hyponym
1813 giữa các synset đó.
1815 Độ đo khái niệm\footnote{conceptual distance} cung cấp một nền tảng để
1816 đo độ giống nhau về mặt nghĩa của các từ. Độ đo khái niệm được định
1817 nghĩa bởi \cite{Rada} là độ dài đường đi ngắn nhất liên kết các khái
1818 niệm trong mạng ngữ nghĩa phân cấp.
1820 Cho một khái niệm $c$ nằm trên đỉnh cây con và $nhyp$ là số hypernym
1821 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
1822 nó chứa $m$ sense của từ đó như sau:
1824 $$CD(c,m)=\frac{\displaystyle\sum^{m-1}_{i=0}nhyp^{i^{0.20}}}{descendants_c}$$
1826 Trong công thức trên, tham số $0,20$ được dùng để làm trơn hệ số mũ
1827 $i$ khi $m$ chạy từ 1 đến số sense tổng cộng trong WordNet. Nhiều giá
1828 trị đã được thử cho tham số này và tham số gần $0,20$ là tốt nhất.
1831 Thuật toán khử nhập nhằng dựa trên CD như sau: Cho cửa sổ với kích
1832 thước nhất định, chương trình di chuyển cửa sổ mỗi
1833 danh từ một lần, từ đầu câu cho đến hết, khử nhập nhằng cho danh từ ở
1834 chính giữa cửa sổ, xem các danh từ còn lại trong cửa sổ là ngữ
1835 cảnh. Đặt cửa sổ các danh từ là $W$ và danh từ chính giữa cửa sổ là
1836 $w$, ta có thuật toán~\ref{algo:CD}.
1838 \begin{algo}
1839 \caption{Khử nhập nhằng danh từ dùng CD}
1840 \label{algo:CD}
1841 \begin{enumerate}
1842 \item tree := compute\_tree(words\_in\_window).
1844 Loop
1845 \item tree := compute\_conceptual\_distance(tree)
1846 \item concept := select\_concept\_width\_highest\_weight(tree)
1848 if concept = null then exitloop
1849 \item tree := mark\_disambiguated\_senses(tree,concept)
1851 endloop
1852 \item output\_disambiguation\_result(tree)
1853 \end{enumerate}
1854 \end{algo}
1856 Đầu tiên, thuật toán thể hiện một dàn các danh từ trong cửa sổ, các
1857 sense và hypernym của chúng (bước 1). Sau đó thuật toán tính
1858 CD cho mỗi khái niệm trong WordNet tương ứng với sense
1859 nó chứa trong cây con của nó (bước 2). Thuật toán chọn khái niệm $c$
1860 với CD cao nhất (bước 3) và chọn sense đúng bên dưới
1861 cho những từ tương ứng (bước 4).
1863 Thuật toán tiến hành tính CD cho những sense còn lại trong dàn, tiếp
1864 tục khử nhập nhằng những danh từ còn lại trong cửa sổ (quay lại bước
1865 2, 3, 4). Khi không thể khử nhập nhằng được nữa, những sense còn lại
1866 của $w$ được xử lý và xuất kết quả ra (bước 5).
1868 Giải pháp CD có hạn chế là chỉ áp dụng đối với danh từ. Những loại từ
1869 khác, do có các mối quan hệ phức tạp hơn nhiều so với quan hệ hypernym
1870 của danh từ nên rất khó áp dụng. CD đôi khi không thể khử nhập nhằng
1871 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
1872 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
1873 cho trình bắt lỗi chính tả.
1875 Hạn chế quan trọng của CD khi áp dụng cho
1876 tiếng Việt là thiếu WordNet dành cho tiếng Việt. Việc xây dựng một
1877 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
1878 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
1879 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ệ
1880 đã được sử dụng trong WordNet hay không, hay cần phải loại bỏ và thêm
1881 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
1882 là một giải pháp hay tuy nhiên không thể áp dụng trong điều kiện hiện
1883 tại. Gần đây có nhiều đề tài nghiên cứu xây dựng WordNet tiếng
1884 Việt. Hy vọng có thể áp dụng CD và các giải pháp dựa trên WordNet khác
1885 cho tiếng Việt trong tương lai không xa.
1888 \section{Tự động phát hiện và sửa lỗi chính tả}
1889 \label{sec:context-spelling}
1891 Tự động phát hiện và sửa lỗi chính tả được đặt ra để cải tiến các
1892 chương trình bắt lỗi chính tả. Các chương trình bắt lỗi chính tả
1893 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ừ
1894 sai, nhưng lại có trong từ điển. Ví dụ, ``give me a peace of cake''
1895 (lẽ ra phải là ``give me a piece of cake'') hoặc ``anh ấy là một người
1896 bàng quang'' (trong khi phải là ``anh ấy là một người bàng
1897 quan''). Hướng giải quyết là dựa vào tập nhầm lẫn để tìm ra những từ
1898 có khả năng viết sai (ví dụ, ``peace-piece'' và ``bàng quang-bàng
1899 quan'') sau đó dựa vào ngữ cảnh để xác định xem đang xét có phù hợp
1900 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
1901 chính tả cảm ngữ cảnh\footnote{context-sensitive spelling
1902 checking}.
1903 %% Đa số các thuật toán thường chuyển câu đang xét thành một
1904 %% 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
1905 %% ngôn ngữ để đánh giá.
1907 \subsection{Mô hình TBL}
1908 \label{sec:tbl-spell}
1911 TBL\footnote{Transformation-based Learning} là mô hình học có giám sát,
1912 được Eric Brill đưa ra vào năm 1993. Đây là mô hình học luật dựa trên
1913 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
1914 dụng các luật trước đó. TBL được áp dụng để tự động phát hiện và sửa
1915 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ủ
1916 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
1917 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
1918 liệu~\ldots{}) không được xử lý bởi TBL. Phương pháp này được áp dụng
1919 bởi Lidia Mangu và Eric Brill~\cite{tbl} cho kết quả rất cao
1920 (93,15\%).
1922 TBL hoạt động như một bộ luật sửa lỗi. Dữ liệu ban đầu cần được một
1923 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
1924 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
1925 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
1926 sửa bởi TBL. Các luật học được từ quá trình huấn luyện TBL sẽ được áp
1927 dụng lần lượt theo thứ tự, sửa chữa các lỗi của do chương trình
1928 baseline gây ra cũng như các lỗi do chính việc áp dụng luật TBL gây
1929 ra. Kết quả là số lỗi sai chính tả sẽ giảm đáng kể.
1931 Các luật trong TBL là các luật dạng mẫu-hành
1932 động\footnote{pattern-action rule} sử dụng nhiều loại thông tin khác
1933 nhau để xác định ngữ cảnh. Hành động trong luật thường là thay thế
1934 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
1935 vị trí tương đối của các từ so với từ đang xét, từ loại, từ~\ldots{} Ba
1936 loại mẫu được dùng trong~\cite{tbl} là:
1937 \begin{itemize}
1938 \item Từ $W$ xuất hiện trong phạm vi $\pm k$ từ chung quanh từ $w$
1939 đang xét.
1940 \item Một mẫu xác định gồm $l$ từ/từ loại liên tiếp nhau xuất hiện
1941 chung quanh $w$.
1942 \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
1943 quanh $w$.
1944 \end{itemize}
1946 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
1947 ngữ liệu đã được đánh dấu (từ đúng/từ sai --- nếu từ sai thì đi kèm
1948 với từ đúng). Thực hiện các bước sau:
1949 \begin{enumerate}
1950 \item Gỡ bỏ các đánh dấu trong ngữ liệu, đưa trở về dạng ngữ liệu thô.
1951 \item Đánh baseline cho ngữ liệu thô.
1952 \item Dựa vào các mẫu luật, phát sinh các luật.
1953 \item Lần lượt áp dụng các luật lên ngữ liệu.
1954 \item Tính điểm cho ngữ liệu dựa trên ngữ liệu đã đánh dấu ban đầu,
1955 sau khi áp dụng từng luật lên ngữ liệu. Điểm tăng nghĩa là kết quả
1956 đúng nhiều hơn so với khi chưa áp dụng luật. Điểm âm nghĩa là kết
1957 quả sai nhiều hơn.
1958 \item Nếu điểm âm, bỏ qua luật này.
1959 \item Nếu điểm dương, đưa luật vào danh sách luật.
1960 \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.
1961 \item Quay lại bước 4.
1962 \end{enumerate}
1964 Sau khi chấm dứt thuật toán, ta chọn khoảng $n$ luật đầu tiên. Những
1965 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
1966 quá trình huấn luyện theo mô hình TBL.
1968 Việc áp dụng TBL đòi hỏi phải có ngữ liệu đã đánh dấu (ngữ liệu vàng),
1969 một hàm tính điểm (được dùng trong bước 5), trình đánh dấu baseline,
1970 và các mẫu luật. Ngoài ra còn có một số tham số (ngưỡng dừng thuật
1971 toán, các tham số $n$, $k$, $l$~\ldots{} đã nêu trên). Việc chọn mẫu
1972 luật và các tham số thích hợp ảnh hưởng nhiều đến hiệu quả của TBL.
1974 Ngữ liệu đánh dấu có thể được tạo ra từ tập nhầm
1975 lẫn\footnote{confusion set}. Tập nhầm lẫn xác định những từ thường bị
1976 nhầm lẫn (Ví dụ, ``their'' và ``there'' hay ``đã'' và ``đả''~\ldots{})
1977 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ữ
1978 liệu sai chính tả. Để thực hiện đều này cần có tập nhầm lẫn.
1980 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ừ
1981 đơn) mà cả nhập nhằng về từ (Ví dụ ``bàn quan'' và ``bàng quang'') thì
1982 cần phải có thêm một bộ tách từ.
1984 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
1985 thì khả năng sửa lỗi chính tả bằng TBL càng cao. Tuy nhiên, tập nhầm
1986 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
1987 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
1988 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
1989 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
1990 dụng trở nên không an toàn.
1993 %\subsection{Mô hình n-gram}
1994 %%% Mays et al 91 -> trigram
1997 \subsection{Mô hình Winnow}
1999 Bài toán bắt lỗi chính tả được xem như là bài toán khử nhập nhằng
2000 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
2001 = \{W_1,\ldots{},W_n\}$ nghĩa là mỗi từ $W_i$ trong tập $C$ có thể bị
2002 dùng lẫn lộn với các từ còn lại trong $C$.
2003 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
2004 bài toán như là một danh sách các đặc trưng tích cực\footnote{active
2005 feature}. Mỗi đặc trưng tích cực thể hiện cho một ngữ cảnh cụ
2006 thể. Hai loại đặc trưng được dùng là từ ngữ cảnh\footnote{context
2007 word} và collocation. Từ ngữ cảnh là một tập các từ nằm xung quanh
2008 từ đang xét (giới hạn trong khoảng $\pm k$ từ tính từ từ đang
2009 xét). Collocation là một mẫu $l$ từ/từ loại liên tiếp nhau xung quanh
2010 từ đang xét.
2012 Một bộ rút trích đặc trưng\footnote{feature extractor} được sử dụng để
2013 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
2014 trích đặc trưng phải được huấn luyện trước, để chỉ lọc ra những đặc
2015 trưng nhất định (đặc trưng tích cực), thay vì tất cả các đặc trưng.
2017 Để huấn luyện bộ rút trích đặc trưng, ta cho chạy bộ rút trích đặc
2018 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ể
2019 có, đồng thời thống kê số lượng của mỗi đặc trưng. Sau khi chạy xong,
2020 danh sách đặc trưng này sẽ bị cắt bớt theo một tiêu chí cho trước, chỉ
2021 chừa lại những đặc trưng được xem là tích cực. Có thể thu gọn danh
2022 sách đặc trưng theo nhiều tiêu chí khác nhau. Tuy nhiên cách đơn giản
2023 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
2024 xuất hiện ít hơn một ngưỡng nào đó thì đặc trưng đó bị loại bỏ.
2026 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
2027 về câu đang xét hay không. Mỗi bộ phân lớp chạy thuật toán Winnow. Bộ
2028 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),
2029 trả về giá trị nhị phân cho biết từ $W_i$ có thuộc về câu đang xét hay
2030 không. Đặt $F$ là tập các đặc trưng tích cực. Với mỗi $f\in F$, đặt
2031 $w_f$ là trong số của cung nối $f$ với bộ phân lớp. Thuật toán Winnow
2032 trả về giá trị 1 khi và chỉ khi $$\sum_{f\in F}w_f > \theta$$ trong đó
2033 $\theta$ là tham số ngưỡng.
2035 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
2036 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
2037 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
2038 tích cực) cùng với từ $W_c$ trong tập nhầm lẫn. $W_c$ là từ đúng cho
2039 câu trong mẫu huấn luyện đối với các mẫu khẳng định\footnote{positive
2040 example} và là từ sai trong các mẫu phủ định\footnote{negative
2041 example}.
2043 Quá trình huấn luyện được tiến hành theo như sau: lần lượt mỗi mẫu
2044 được đưa vào hệ thống, các bộ phân lớp được cập nhật, sau đó mẫu bị
2045 hủy.
2047 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
2048 giữa bộ phân lớp và các đặc trưng tích cực $F$ trong mẫu. Nếu đặc
2049 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à
2050 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
2051 đó và bộ phân lớp với giá trị trọng số khởi đầu là $0,1$. Chú ý rằng
2052 không có gì xảy ra với các mẫu phủ định.
2054 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
2055 hiện nhờ vào luật cập nhật Winnow, chỉ cập nhật trọng số khi xảy ra
2056 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à
2057 lẽ ra bộ phân lớp phải dự đoán là 1), trong số sẽ được tăng:
2058 $$\forall f \in F, w_f \leftarrow \alpha \cdot w_f$$
2059 trong đó $\alpha > 1$ là tham số cho trước. Nếu bộ phân lớp dự đoán 1
2060 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
2061 số sẽ được giảm:
2062 $$\forall f \in F, w_f \leftarrow \beta \cdot w_f$$
2063 với $0 < \beta < 1$ là tham số cho trước. \cite{Golding99} đề nghị
2064 $\alpha$ là $1,5$ và $\beta$ là $0,5$ đến $0,9$. Như vậy, trọng số của
2065 các đặc trưng không tích cực sẽ giữ nguyên, không thay đổi. Thời gian
2066 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.
2068 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
2069 quả trả về của nhiều bộ phân lớp đồng thời. Mô hình Weighted Majority
2070 đượ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
2071 đồ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
2072 mỗi bộ phân lớp được theo dõi. Trọng số được tính toán để phản ánh độ
2073 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
2074 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.
2076 Mô hình này được áp dụng trong~\cite{Golding99}.
2078 \subsection{Mô hình Danh sách quyết định}
2079 %%% Yarowsky 94 -> decision lists
2081 Mô hình Danh sách quyết định được Yarowsky đưa ra để giải quyết bài
2082 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
2083 trọng để nhận dạng. Ngoài ra kết xuất của mô hình rất đơn giản, dễ
2084 hiểu, tạo thuận lợi trong nghiên cứu, cải tiến mô hình. Phương pháp
2085 này được~\cite{vietdecisionlist} áp dụng để bắt lỗi chính tả tiếng
2086 Việt.
2088 Mô hình có thể sử dụng nhiều loại đặc trưng khác nhau. Hai đặc trưng
2089 thường được áp dụng là từ ngữ cảnh và collocation.
2091 Thuật toán của mô hình như sau:
2092 \begin{enumerate}
2093 \item Xét mỗi từ trong câu, có tập nhầm lẫn tương ứng là $S$.
2094 \item Với mỗi từ $w \in S$:
2095 \begin{enumerate}
2096 \item Xác định tập đặc trưng $C_w$ không chứa các đặc trưng xung đột
2097 với các đặc trưng đã được chấp nhận trước đó.
2098 \item Tím điểm của từ:$$Score(w)=\underset{f\in C_w}{max}P(w|f)$$
2099 và xác định $$f_w = \underset{f\in C_w}{argmax}P(w|f)$$
2100 \end{enumerate}
2101 \item Từ được chọn là $$a=\underset{w\in S}{argmax}Score(w)$$ Ghi nhớ
2102 thuộc tính $f_w$ để kiểm tra xung đột ở các vị trí khác.
2103 \end{enumerate}
2105 Quá trình huấn luyện mô hình như sau.
2106 \begin{itemize}
2107 \item Bộ rút trích đặc trưng (tương tự
2108 như trong mô hình Winnow) được sử dụng để rút ra các đặc trưng tích
2109 cực từ các câu trong ngữ liệu huấn luyện.
2110 \item Đếm tần số xuất hiện của mỗi
2111 đặc trưng.
2112 \item Loại bỏ các đặc trưng không đáng tin cậy (Ví dụ, tần số
2113 quá thấp).
2114 \item Sắp xếp các đặc trưng theo thứ tự giảm dần khả năng quyết định.
2115 \end{itemize}
2117 \subsection{Mô hình Trigram và Bayes}
2119 Mô hình sửa lỗi bằng Trigram rất đơn giản. Đối với mỗi câu, các từ
2120 trong tập nhầm lẫn được thay thế cho từ tương ứng trong câu, sau đó
2121 tính xác suất trigram của toàn bộ câu. Từ tương ứng với câu có xác
2122 suất lớn nhất sẽ là từ được chọn. Cho câu $W =
2123 w_1\ldots{} w_k\ldots{} w_n$, $w_k'$ là từ được dùng để thay thế cho
2124 $w_k$, tạo ra câu mới $W'$. Nếu $P(W') > P(W)$ thì $w_k'$ sẽ được
2125 chọn, với $P(W)$ và $P(W')$ lần lượt là xác suất trigram của câu $W$
2126 và $W'$.
2128 Một cải tiến của phương pháp này là
2129 áp dụng trigram dựa trên từ loại thay vì trigram từ. Từ câu $W$, ta
2130 tạo ra các chuỗi từ loại. Xác suất cuối cùng là:
2131 \begin{align*}
2132 P(W) &=\sum_T P(W,T)\\
2133 P(W,T)&=P(W|T)P(T)\\
2134 &=\prod_i P(w_i|t_i)\prod_i P(t_i|t_{i-2}t_{i-1})
2135 \end{align*}
2136 với $T$ là một chuỗi từ loại của $W$, $T=t_1\ldots{} t_n$ và
2137 $P(t_i|t_{i-2}t_{i-1})$ là xác suất trigram từ loại.
2139 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
2140 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
2141 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à
2142 các từ khác trong tập nhầm lẫn trong cùng ngữ cảnh. Tập đặc trưng
2143 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
2144 đang xét. Các đặc trưng và cách rút trích đặc trưng tương tự như trong
2145 mô hình Winnow.
2147 Mô hình Trigram và Bayes, mỗi cái có điểm mạnh riêng. Mô hình trigram
2148 hoạt động tốt nếu những từ trong tập nhầm lẫn không cùng từ
2149 loại. Ngược lại, khi không thể phân biệt dựa trên từ loại, mô hình
2150 Bayes sẽ hoạt động tốt hơn do dựa vào các thông tin về cú pháp, ngữ
2151 cảnh xung quanh. Do đó, giải pháp tốt nhất là kết hợp hai mô hình này
2152 với nhau. Đầu tiên ta áp dụng mô hình Trigram. Trong quá trình xử lý,
2153 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ô
2154 hình Bayes. Ngược lại, ta sẽ chấp nhận kết quả của mô hình
2155 Trigram. Giải pháp này được áp dụng trong~\cite{Golding96}, tạo ra mô
2156 hình Tribayes.
2159 \subsection{Mô hình Bayes và Danh sách quyết định}
2160 %%% Golding 95 -> hybrid method
2161 Mô hình Danh sách quyết định là một mô hình mạnh. Tuy nhiên, có một
2162 đ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
2163 để 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
2164 để phân loại. Không có lý do gì để chỉ sử dụng một đặc trưng, trong
2165 khi ta vẫn có thể khai thác các đặc trưng khác. Đây là nơi có thể cải
2166 tiến bằng cách sử dụng bộ phân lớp Bayes.
2168 Bộ phân lớp Bayes cũng sử
2169 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
2170 lớp Bayes phân loại từ đang xét bằng cách sử dụng các đặc trưng. Tuy
2171 nhiên, thay vì dừng lại sau khi áp dụng đặc trưng đầu tiên có thể sử
2172 dụng, Bayes duyệt qua tất cả các đặc trưng, kết hợp tất cả các đặc
2173 trưng, và giải quyết các xung đột giữa các đặc trưng nếu có, để đưa ra
2174 kết quả sau cùng. Ta giả sử chỉ sử dụng các đặc trưng loại từ ngữ cảnh
2175 và collocation. Nếu hai đặc trưng cần xét đều là từ ngữ cảnh,
2176 vậy sẽ không có xung đột. Nếu hai đặc trung đang xét đều
2177 là collocation và chồng lên nhau, nghĩa là có xung đột. Đặc trưng xung
2178 đột với đặc trưng đã xét trước đó sẽ bị bỏ qua, không được xem
2179 xét.
2181 Phương pháp này được đề nghị bởi~\cite{Golding95}.
2183 \section{Bắt lỗi chính tả các ngôn ngữ châu Á}
2186 Đ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
2187 Á, như tiếng Trung Quốc, tiếng Nhật, tiếng Hàn Quốc~\ldots{}, là ranh
2188 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
2189 khoảng trắng cũng là từ, do đó việc tách từ rất dễ dàng (chỉ phải
2190 xử lý các trường hợp đặc biệt như dấu `-'~\ldots{}). Đối với các tiếng
2191 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ì
2192 một ``từ'' như quan niệm châu Âu chỉ là một phần từ (một âm tiết trong
2193 tiếng Việt) trong các ngôn ngữ châu Á. Điều này đặt ra một vấn đề mà
2194 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
2195 phải: phân ranh giới từ.
2197 Do các phương pháp dựa trên tiếng Anh đều ngầm định có thể tìm được
2198 ranh giới từ ngay tức thì, nên khi áp dụng cho tiếng Trung Quốc,
2199 tiếng Việt~\ldots{}{} không dễ dàng. Điểm khó khăn ở đây là nếu ta thay
2200 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ừ
2201 trước đó, thì toàn bộ ranh giới từ phía sau sẽ bị thay đổi. Nói cách
2202 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
2203 chuỗi các từ) khi thay đổi một từ trong câu.
2205 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 đó
2206 mới bắt lỗi chính tả, thì khó khăn lại đè nặng lên phần tách từ.
2207 Bài toán tìm ranh giới từ vốn đã phức tạp
2208 (trong một số trường hợp, nếu không dựa vào thông tin ngữ nghĩa thì
2209 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
2210 toán bắt lỗi chính tả, vì khi đó ta phải tìm ranh giới từ khi {\em các
2211 từ/tiếng đầu vào có thể không đúng}. Nói cách khác, ta phải thực hiện
2212 tách từ trong điều kiện dữ liệu đầu vào không hoàn toàn chính xác:
2213 tách từ mờ. Các kỹ thuật tách từ, nếu bỏ qua
2214 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
2215 đị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
2216 lỗi chính tả trở nên đơn giản. Ta có thể áp dụng các kỹ thuật đã được
2217 áp dụng trên bắt lỗi chính tả các ngôn ngữ châu Âu dễ dàng.
2219 Với tiếng Việt, do độ dài mỗi tiếng ngắn (khoảng năm chữ cái). Tuy
2220 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
2221 thành phần (không kể thanh điệu) là âm đầu, âm đệm, âm chính và âm
2222 cuối. Mỗi thành phần đều được thể hiện bằng một cụm chữ cái riêng
2223 biệt, có thể coi như là một đơn vị tương đương chữ cái. Vậy nên, xét
2224 một mặt nào đó, có thể xem mỗi tiếng trong tiếng Việt chỉ gồm tối đa
2225 bốn ``chữ cái''. Do độ dài tiếng quá ngắn nên số lượng nhập nhằng của
2226 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
2227 từ đồng âm.
2229 Trình bắt lỗi tiếng Việt đã được nghiên cứu trong những năm gần
2230 đây~\cite{Tuoi,vietdecisionlist}. Giải pháp được đề nghị
2231 trong~\cite{Tuoi} sử dụng phân tích cú pháp để đánh giá các cách tách
2232 từ. Trong khi đó \cite{vietdecisionlist} sử dụng danh sách quyết định
2233 để khử nhập nhằng cho từng từ một.
2236 %%% Bắt lỗi chính tả không tách từ, có không?
2238 \section{Tách từ}
2240 %% \subsection{Tách từ}
2242 %% \cite{Sproat} sử dụng WFST để tách từ, huấn luyện bằng EM dựa trên
2243 %% cách tách từ đúng nhất.
2245 %% \cite{wordseg} sử dụng giải pháp tương tự như \cite{Sproat} nhưng cải
2246 %% tiến bằng cách cáp dụng Neural Networks để giải quyết nhập nhằng dựa
2247 %% vào POS. Nghiên cứu đề cập đến một số vấn đề tiền xử lý tiếng Việt như
2248 %% xác định tên riêng, từ láy, phân tích hình thái.
2250 %% \cite{Ravishankar} đề nghị tạo ra lưới từ\footnote{word lattice} sau
2251 %% đó sử dụng thuật toán tìm đường đi ngắn nhất để tìm cách tách từ tốt
2252 %% nhất dựa trên 2-gram hoặc 3-gram.
2254 %% \cite{LAH} sử dụng n-gram và quy hoạch động để tách từ,
2255 %% không dùng từ điển. Giải pháp này tương tự như \cite{softcount}, tuy
2256 %% 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
2257 %% suất mọi cách tách từ như trong \cite{softcount}.
2259 %% \cite{Chunyu} kết hợp ngram, lập trình quy hoạch động để tách từ. Xài
2260 %% soft-count thay vì ``hard-count'' như \cite{Chang}. \cite{Chunyu} còn
2261 %% đề nghị dùng case-based learning.
2263 %\note{Liệt kê các phương pháp tách từ}
2264 Bài toán tách từ cho ngôn ngữ đơn lập đã được đặt ra từ lâu, chủ yếu
2265 để 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ể
2266 được phân loại như sau:
2268 \begin{description}
2269 \item[Dựa theo luật] Bao gồm các cách sau:
2271 \begin{itemize}
2272 \item Longest Matching, Greedy Matching Models (Yuen Poowarawan, 1986;
2273 Sampan Rarurom, 1991)
2274 \item Mô hình khớp tối đa\footnote{Maximal Matching Model}. Mô hình
2275 này được chia thành ``khớp tối đa tiến''\footnote{forward maximum
2276 match} và ``khớp tối đa lùi''\footnote{backward maximum match}. Đối
2277 với phương pháp này thì một từ điển hoàn chỉnh là không thể
2278 thiếu. Một từ điển không hoàn chỉnh sẽ giảm hiệu suất của thuật
2279 toán. Tuy nhiên, dễ thấy là khó có thể có một từ điển hoàn chỉnh
2280 (đặc biệt khi các ngôn ngữ vẫn còn được tiếp tục phát triển hằng
2281 ngày trong thời đại ngày nay). Mô hình này tùy thuộc nhiều vào từ
2282 điển.
2283 %% \begin{itemize}
2284 %% \item Thai, Sornlertlamvanich (1993).
2285 %% \item Chinese, Chih-Hao Tsai (1996), MMSeg 2000.
2286 %% \end{itemize}
2287 \end{itemize}
2288 \item[Dùng thống kê]
2289 Giải pháp này dựa vào ngữ cảnh từ xung quanh để đưa ra quyết định
2290 thích hợp. Có hai vấn đề cần được giải quyết đối với giải pháp này:
2291 độ rộng ngữ cảnh, và cách áp dụng thống kê. Ngữ cảnh càng rộng thì
2292 thuật toán càng phức tạp.
2294 Cho dù độ rộng ngữ cảnh thế nào, luôn có thể áp dụng mô hình
2295 first-order HMM. Tuy nhiên giải pháp này phụ thuộc rất nhiều vào ngữ
2296 liệu huấn luyện. Kết quả huấn luyện trên ngữ liệu chính trị khó có
2297 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ó
2298 những từ có xác suất rất cao, nhưng chỉ có chứng năng về mặt ngữ
2299 pháp, làm giảm vai trò của xác suất.
2300 %% \begin{itemize}
2301 %% \item HMM dựa trên thuật toán Viterbi. (Asanee Kawtraku, 1995;
2302 %% Surapant,1995).
2303 %% \item EM. Xianping, 1996.
2304 %% \end{itemize}
2305 \item[Các cách khác]
2306 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à
2307 các mô hình ngôn ngữ học như WFST, TBL. Thời gian xử lý
2308 các giải pháp loại này trở nên đáng kể, nhưng độ chính xác đạt được
2309 khá cao.
2311 Tri thức về ngôn ngữ, thường được áp dụng cho các mô hình dựa trên
2312 luật, hiếm khi được áp dụng cho những mô hình trên.
2313 \end{description}
2315 Một số phương pháp tách từ được mô tả ngắn gọn bên dưới.
2317 \subsection{Khớp tối đa}
2319 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
2320 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
2321 từ nhất (so khớp được nhiều nhất). Thuật toán được áp dụng để xây dựng
2322 chương trình tách từ tiếng Trung Quốc
2323 MMSEG\footnote{http://casper.beckman.uiuc.edu/~c-tsai4/chinese/wordseg/mmseg.zip}.
2324 Thuật toán này có nhiều biến thể khác nhau.
2327 \begin{itemize}
2328 \item Dạng đơn giản, được dùng để giải quyết nhập nhằng từ đơn. Giả sử
2329 có một chuỗi ký tự (tương đương với chuỗi tiếng trong tiếng Việt)
2330 $C_1, C_2, \ldots{} C_n$. Ta bắt đầu từ đầu chuỗi. Đầu tiên, kiểm
2331 tra xem $C_1$ có phải là từ hay không, sau đó kiểm tra xem $C_1C_2$
2332 có phải là từ hay không. Tiếp tục tìm cho đến khi tìm được từ dài
2333 nhất. Từ có vẻ hợp lý nhất sẽ là từ dài nhất. Chọn từ đó, sau đó tìm
2334 tiếp như trên trên những từ còn lại cho đến khi xác định được toàn
2335 bộ chuỗi từ.
2336 \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ý
2337 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
2338 đơ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ụ,
2339 $C_1$ là từ và $C_1C_2$ cũng là từ), ta xem các chữ kế tiếp để tìm
2340 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í
2341 dụ ta được những đoạn sau:
2342 \begin{itemize}
2343 \item $C_1\quad C_2\quad C_3C_4$
2344 \item $C_1C_2\quad C_3C_4\quad C_5$
2345 \item $C_1C_2\quad C_3C_4\quad C_5C_6$
2346 \end{itemize}
2347 Chuỗi dài nhất sẽ là chuỗi thứ ba. Vậy từ
2348 đầu tiên của chuỗi thứ ba ($C_1C_2$) sẽ được chọn. Thực hiện lại các
2349 bước cho đến khi được chuỗi từ hoàn chỉnh. Cách này đạt được độ
2350 chính xác 99.69\%~\cite{ChenLiu}.
2351 \end{itemize}
2355 \subsection{Mô hình HMM}
2357 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
2358 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
2359 xem như tìm kiếm chuỗi lớp từ $C=c_1,\ldots{},c_n$ từ một chuỗi từ
2360 $W=w_1,\ldots{},w_n$. Mục tiêu là tìm $W$ và $C$ từ câu $S$ cho trước,
2361 sao cho tối đại xác suất$$\underset{W,C}{argmax}P(W|C)P(C)$$
2362 Giả định rằng xác suất $P(W|C)$ chỉ phụ thuộc vào lớp từ của nó, và
2363 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
2364 suất này có thể được ước lượng bằng thuật toán Baum-Welch dùng ngữ
2365 liệu huấn luyện. Tiến trình học dựa trên thuật toán Baum-Welch và
2366 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
2367 được xác định trước và xác suất khởi đầu được gán ngẫu nhiên.
2369 %% \subsection{Mô hình HHMM}
2371 %% Mô hình Markov ẩn phân cấp (HHMM)\footnote{Hierarchical Hidden Markov
2372 %% Model}~\cite{hhmm} được áp dụng trong~\cite{hhmm2} để giải quyết bài toán tách từ
2373 %% tiếng Trung Quốc.
2375 %% Mô hình HMM\footnote{Hidden Markov Model} (L. R. Rabiner, 1989) là một
2376 %% mô hình rất mạnh để xử lý
2377 %% ngôn ngữ tự nhiên. Tuy nhiên, HMM truyền thống khó áp dụng hiệu quả
2378 %% do một số hiện tượng phức tạp trong ngôn ngữ tự nhiên. Do vậy, Shai
2379 %% Fine et al (1998) đã đưa ra mô hình HHMM, một mô hình đệ quy, tổng
2380 %% quát hoá của HMM.
2382 %% HHMM bao gồm sáu thành phần ($S$, $O$, $\Pi$, $A$, $B$, $D$).
2383 %% \begin{itemize}
2384 %% \item $D$ là số mức sâu.
2385 %% \item $S$ là tập trạng thái hữu hạn.
2386 %% \item $O$ là bảng chữ cái kết quả hoặc kết xuất trung gian.
2387 %% \item $\Pi$ là xác suất trạng thái khởi đầu.
2388 %% \item $A$ là xác suất chuyển trạng thái.
2389 %% \item $B$ là xác suất phát sinh các ký hiệu hoặc kết xuất trung gian.
2390 %% \end{itemize}
2391 %% Sự khác nhau giữa HHMM và HMM là:
2392 %% \begin{itemize}
2393 %% \item Tập trạng thái $S$ có thể được tách làm nhiều tập con, tùy theo
2394 %% số mức của nó. Một trạng thái trong $S$ được đánh dấu bằng $q_i^d$
2395 %% với $(0<d\le D, 0<i\le|S^d|)$. Trong đó $d$ là chỉ số mức, $i$ là
2396 %% chỉ số trạng thái, $S^d$ là tập trạng thái mức $d$. Khi $d=D$,
2397 %% $q_i^d$ được gọi là trạng thái kết thúc vì its observation is
2398 %% symbols. Ngược lại, nó được gọi là trạng thái nội bộ vì observation
2399 %% của nó là từ HMM con của nó trong mức thứ $(d+1)$.
2400 %% \item Mỗi trạng thái nội bộ $q^d$ $(0<d<D)$ có những trạng thái con
2401 %% của nó, hình thành một HMM độc lập. Trong HMM con, xác suất chuyển
2402 %% trạng thái là:
2403 %% $$A(q^d) = (a_{ij}(q^d)) = (P(q_j^{d+1}|q_i^{d+1}))$$
2404 %% Véc tơ phân bố khởi đầu là:
2405 %% $$\Pi(q^d)=(\pi^d(q_i^{d+1}))=(P(q_i^{d+1}|q^d))$$
2406 %% Trong đó $P(q_i^{d+1}|q^d)$ được định nghĩa là xác suất của trạng
2407 %% thái $q^d$ kích hoạt trạng thái con $q_i^{d+1}$ lúc ban đầu.
2408 %% \item Chỉ có HMM dưới đáy có thể observe các ký hiệu. Xác suất phát
2409 %% ký hiệu tương ứng là:
2410 %% $$B(q^D)=(b_k(q^D))=(P(o_k|q^D))$$
2411 %% với $o_k$ nằm trong tập ký hiệu. Với mỗi HMM mức $d (d<D)$, chuỗi
2412 %% trạng thái trong các HMM con của nó có thể xem như là
2413 %% observation. Xác suất phát sinh có thể được ước lượng như trên.
2414 %% \end{itemize}
2416 %% 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,
2417 %% 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
2418 %% HHMM được ký hiệu là:
2419 %% \begin{align*}
2420 %% \lambda&=\{(\lambda(q^d))\}_{d\in\{1,\ldots{},D\}}\\
2421 %% &=\{\{A(q^d)\}_{d\in\{1,\ldots{},D-1\}},\{\Pi(q^d)\}_{d\in\{1,\ldots{},D-1\}},\{B(q^D)\}\}
2422 %% \end{align*}
2424 %% HMM là dạng đặc biệt của HHMM, khi $D=1$.
2426 %% Khi áp dụng HHMM để tách từ. Các từ chính là tập ký hiệu, còn các
2427 %% tiếng chính là các trạng thái. Đến đây, ta quay về bài toán HMM truyền
2428 %% thống.
2430 \subsection{Mô hình WFST và mạng nơ-ron}
2432 WFST\footnote{Weighted Finite State Transducer} đã được~\cite{Sproat}
2433 áp dụng để tách từ tiếng Trung Quốc. Ý tưởng cơ bản là áp dụng WFST
2434 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ữ
2435 liệu. Dùng WFST để duyệt qua câu cần xét. Cách duyệt có trọng số lớn
2436 nhất sẽ là cách tách từ được chọn. Giải pháp này cũng đã được áp dụng
2437 trong~\cite{Tachtu} kèm với mạng nơ-ron để khử nhập nhằng.
2439 %% \subsection{Mô hình TBL}
2441 %% TBL là mô hình học có thầy được Eric Brill đưa ra vào năm 1990.
2443 %% 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
2444 %% 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
2445 %% 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
2446 %% công sức. Đây là một điểm yếu (và cũng là điểm mạnh) của TBL.
2448 \subsection{Mô hình Source-Channel cải tiến}
2449 %-% cws-ACL03.pdf
2451 Mô hình này được đề nghị trong~\cite{sc}.
2453 Đặt $S$ là một câu tiếng Trung Quốc, hay là một chuỗi các ký tự (tương
2454 đương chuỗi tiếng trong tiếng Việt). Với mỗi cách tách từ $W$ có thể
2455 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
2456 $P(W|S)$:
2457 $$W^*=\underset{w}{argmax}P(W|S)$$
2458 Theo công thức Bayes, bỏ mẫu số là hằng số, ta được:
2459 $$W^*=\underset{w}{argmax}P(W)P(S|W)$$
2460 Ta định nghĩa lớp từ $C$ như sau:
2461 \begin{itemize}
2462 \item Mỗi từ được định nghĩa như một lớp.
2463 \item Mỗi từ dẫn xuất hình thái được định nghĩa như một lớp.
2464 \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
2465 thức thời gian thuộc về lớp TIME.
2466 \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.
2467 \end{itemize}
2469 Ta chuyển công thức trên qua các lớp từ:
2470 $$C^*=\underset{c}{argmax}P(C)P(S|C)$$
2471 Công thức trên là công thức cơ bản của mô hình source-channel cho tách
2472 từ tiếng Trung Quốc. Mô hình giả định câu S được phát sinh như sau:
2473 Đầu tiên, một người chọn một chuỗi khái niệm (ví dụ, lớp từ $C$) để
2474 xuất ra, theo xác suất $P(C)$. Sau đó người đó cố gắng thể hiện các
2475 khái niệm đó bằng chuỗi các ký tự, theo xác suất $P(S|C)$.
2477 Mô hình source-channel có thể được hiểu theo một cách khác: $P(C)$ là
2478 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
2479 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
2480 được hiểu như {\em mô hình ngữ cảnh}. $P(S|C)$ là mô hình phát sinh,
2481 dự đoán khả năng một chuỗi ký tự được phát sinh dựa trên lớp từ cho
2482 trước. Vậy $P(S|C)$ còn được hiểu như {\em mô hình lớp}.
2484 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
2485 phép nhân đơn giản. Tuy nhiên nếu thêm trọng số thì kết quả tốt
2486 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
2487 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
2488 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
2489 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
2490 vào một trọng số $CW$ cho mỗi mô hình lớp để điều chỉnh xác suất
2491 $P(S|C)$ thành $P(S|C)^{CW}$
2493 Với mô hình đã có, thao tác tách từ bao gồm hai bước:
2494 \begin{enumerate}
2495 \item Cho chuỗi S, phát sinh mọi cách tách từ có thể có. Mỗi cách tách
2496 từ được đánh nhãn lớp từ và xác suất lớp $P(S'|C)$ với $S'$ là bất
2497 kỳ chuỗi con nào của $S$.
2498 \item Thuật toán tìm kiếm Viterbi được áp dụng để chọn cách tách từ có
2499 khả năng nhất theo công thức nêu trên.
2500 \end{enumerate}
2502 \subsubsection{Huấn luyện}
2504 Nếu có một dữ liệu được tách từ sẵn, công việc trở nên rất dễ
2505 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
2506 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
2507 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
2508 trên luật). Để đơn giản vấn đề, ngữ liệu này được xây dựng tự động như
2509 sau:
2510 \begin{enumerate}
2511 \item Khởi đầu, sử dụng một bộ tách từ sẵn có (có thể áp dụng các
2512 thuật giải đơn giản, không cần huấn luyện, như Longest matching,
2513 Maximum matching~\ldots{})
2514 \item Sử dụng mô hình đề nghị để tách từ ngữ liệu huấn luyện.
2515 \item Tái huấn luyện mô hình dựa trên kết quả tách từ có được ở bước
2516 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
2517 mô hình ngừng tăng.
2518 \end{enumerate}
2520 %%% give some comments about source-channel models.
2522 %%% Giải thích rõ hơn về các mô hình
2524 \subsection{Mô hình TBL}
2526 Mô hình TBL (xem thêm phần~\ref{sec:tbl-spell}) cũng có thể được áp
2527 dụng để tách từ tiếng Trung Quốc~\cite{palmer}.
2529 Mô hình TBL có thể được áp dụng cho nhiều bài toán khác nhau. Tùy vào
2530 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
2531 áp dụng cho TBL sử dụng các hành động sau:
2532 \begin{itemize}
2533 \item Nối hai ký tự (tiếng).
2534 \item Tách hai ký tự.
2535 \item Trượt ranh giới từ sang ký tự kế bên.
2536 \end{itemize}
2538 Trình tách từ baseline, có thể áp dụng cách khớp tối đa.
2541 %\subsection{Tách từ bằng bộ đánh nhãn}
2544 \section{Tách từ mờ}
2546 Như đã nói trên, bài toán tách từ không đơn thuần là tách từ đúng như
2547 nghĩa ban đầu, mà là tách từ trong điều kiện dữ liệu đầu vào có khả
2548 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
2549 lỗi\footnote{error-tolerant word segmentation}. Các phương pháp tách
2550 từ được nêu, thông thường không thể áp dụng trực tiếp mà phải có một
2551 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ố
2552 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
2553 nào có thể gợi ý cho một giải thuật tách từ mờ hiệu quả.
2555 Kemal Oflazer~\cite{Oflazer} khi xử lý hình thái trong tiếng Thổ Nhĩ Kỳ gặp trường
2556 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ừ
2557 trong điều kiện từ đó bị sai chính tả. Do đặc tính
2558 ngôn ngữ chắp dính\footnote{agglunative language}, số tiếp vĩ ngữ
2559 nhiều, liên tiếp nhau, gây khó khăn cho việc nhận dạng tiếp vĩ ngữ,
2560 cũng như không thể phân biệt những tiếng nào hợp thành một từ trong
2561 một chuỗi tiếng trong tiếng Việt. Tác giả dùng một hàm độ đo, tạo ra
2562 các tiếp đầu ngữ có khả năng thay thế dựa trên độ đo này, sau đó sử
2563 dụng WFST để tìm chuỗi tiếp vĩ ngữ thích hợp nhất.
2565 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
2566 tự~\cite{Ravishankar}. Sau công đoạn xử lý âm thanh, ta nhận được
2567 một chuỗi các âm tiết. Ta phải chuyển nhóm âm tiết này thành
2568 chuỗi từ. Do âm thanh thường bị nhiễu, nên các âm tiết có thể
2569 không chính xác hoàn toàn. Ngoài ra, do đặc tính của tiếng Anh nên
2570 cùng một chuỗi âm tiết có thể suy ra nhiều chuỗi từ khác nhau. Tác giả
2571 sử dụng lưới từ để tạo ra các chuỗi từ có khả năng từ chuỗi âm tiết,
2572 sau đó ngram trên từ để lượng giá các chuỗi từ.
2574 Một điểm đáng chú ý ở
2575 đây là sự tương đồng về một mặt nào đó giữa tiếng Anh và tiếng
2576 Việt. Với tiếng Anh, từ có thể tách dễ dàng, nhưng từ bao gồm nhiều âm
2577 tiết. Việc phân ranh giới âm tiết trong tiếng Anh là một điều khá khó
2578 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
2579 là một ``tiếng'' tương đương với một ``từ'' trong câu --- cách nhau
2580 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
2581 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
2582 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
2583 lỗi chính tả tiếng Việt!
2585 \cite{Chang} cũng dùng mô hình ngôn ngữ dạng ngram để đánh giá các
2586 cách tách từ sau khi đã qua tiền xử lý nhập nhằng chính tả, tuy nhiên
2587 lại sử dùng nhiều mô hình ngôn ngữ khác nhau như
2588 character bigram, word bigram, inter-word character bigram (IWCB), POS
2589 bigram, word class bigram.
2591 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
2592 tách từ khi bị
2593 sai chính tả, là phát sinh một loạt các từ có khả năng thay thế, với
2594 giả định trong tập từ này sẽ có từ đúng chính tả, thay thế từ sai chính
2595 tả ban đầu. Sau đó sử dụng tách từ tìm một cách tách tốt nhất. Sau khi
2596 tìm được cách tách từ, ta có thể tra từ điển để tìm xem từ nào bị sai.
2598 \subsection{Huấn luyện}
2600 Nếu có dữ liệu đã được đánh dấu sẵn các ranh giới từ, công việc đơn
2601 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
2602 thiết.
2604 Đố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ể
2605 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
2606 bộ tách từ sẽ ảnh hưởng đến chất lượng của thuật toán.
2608 Với các thuật toán tách từ mờ, đôi khi không thể áp dụng bộ tách từ
2609 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
2610 ngữ liệu lớn đã được tách từ sẵn, do đó cần phải tìm giải pháp tính
2611 được các tham số cần thiết từ ngữ liệu chưa được tách từ (ngữ liệu thô).
2613 Thuật toán EM\footnote{Estimation Maximization} thường được áp dụng để vượt
2614 qua khó khăn này~\cite{softcount,Sproat}. Trên lý thuyết, áp dụng
2615 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
2616 sẽ tốt hơn hoặc bằng kết quả của vòng lặp trước.
2617 %Theo \cite{xxx}, ta chỉ cần lặp khoảng 5-7 vòng lặp là đủ.
2619 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
2620 bộ), nhiều giải pháp đã được đưa ra để khắc phục các hạn chế
2621 này~\cite{text-tiling,self-supervised}.
2623 Một giải pháp khác là áp dụng HMM để tìm ra ranh giới từ, sau đó áp
2624 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ế
2625 bởi chính HMM, vì HMM là mô hình thống kê thuần tuý, không phát huy
2626 đượ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ề
2627 ngôn ngữ học, do đó phần nào hạn chế kết quả cuối cùng.
2629 %XXX
2630 %XXX % đưa cái này lên phần cơ sở tin học/huấn luyện
2631 %% 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
2632 %% các phương pháp tách từ đều dựa trên ngram ($n\ge 1$) nên rất cần có
2633 %% khối lượng dữ liệu huấn luyện lớn nhằm đạt tính bao quát. Dữ liệu
2634 %% mẫu, được tách từ sẵn, thường không đủ để huấn luyện. Giải pháp chủ
2635 %% yếu là huấn luyện dựa trên dữ liệu thô, chưa tách từ.
2637 %% Thuật toán thường dùng nhất để huấn luyện trên dữ liệu thô là thuật
2638 %% toán EM. Nhiều người đã cố gắng cải tiến EM theo nhiều cách khác nhau
2639 %% nhằm nâng cao chất lượng huấn luyện, đồng thời hạn chế những khuyết
2640 %% điểm của EM.
2642 %% \cite{self-supervised} đề nghị cách giải quyết hạn chế ``tối ưu cục
2643 %% 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
2644 %% động lại EM với điểm khởi đầu tốt hơn.
2646 %% \cite{text-tiling} sử dụng một lượng nhỏ ngữ liệu huấn luyện có chất
2647 %% lượng cao (\textit{seed set}) và một lượng lớn ngữ liệu có chất lượng
2648 %% không thật bảo đảm (\textit{training set}), xử lý qua 4 bước:
2649 %% \begin{enumerate}
2650 %% \item \textbf{Phân đoạn tập huấn luyện}
2651 %% \item \textbf{Phân hạng tập huấn luyện}
2652 %% \item \textbf{Tổ hợp tập huấn luyện}
2653 %% \item \textbf{Language model pruning}
2654 %% \end{enumerate}
2657 \chapter{Mô hình}
2658 \label{cha:model}
2659 \minitoc
2661 \section{Mô hình chung}
2663 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
2664 (xem hình~\ref{fig:overall-model}), bao gồm ba khối chính là:
2665 \begin{itemize}
2666 \item Khối tiền xử lý.
2667 Tách văn bản thành những đoạn ngắn. Tách
2668 đ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ố,
2669 tên riêng~\ldots{}
2671 \item Khối bắt lỗi non-word.
2672 Kiểm tra các tiếng với các tiếng đã có
2673 trong từ điển. Báo lỗi những tiếng không có trong từ điển. Sau đó
2674 đưa ra giải pháp thay thế.
2676 \item Khối bắt lỗi real-word.
2677 Tương tự như khối bắt lỗi real-word. Tuy nhiên cần phải tách từ
2678 trước khi thực hiện bắt lỗi chính tả.
2679 \end{itemize}
2681 %% \begin{enumerate}
2682 %% \item \textbf{Tiền xử lý}
2683 %% \item \textbf{Bắt lỗi tiếng}
2684 %% \item \textbf{Tạo lưới từ} Tìm ra mọi từ có thể có trong câu. Xem
2685 %% giải thích về lưới từ bên dưới. Lồng trong phần này là phần
2686 %% \textbf{Phát sinh từ thay thế}
2687 %% \item \textbf{Tách từ} Dựa vào lưới từ, đưa ra cách tách từ tốt nhất.
2688 %% \item \textbf{Bắt lỗi từ} Dựa vào từ điển và cách tách từ đã có,
2689 %% tìm những từ nào không có trong từ điển. Những từ này được xem là từ
2690 %% sai. Sau đó \textbf{Đưa ra giải pháp thay thế}
2691 %% \end{enumerate}
2693 \begin{figure}[htbp]
2694 \centering
2695 \includegraphics[width=\textwidth]{overall}
2696 \caption{Mô hình chung}
2697 \label{fig:overall-model}
2698 \end{figure}
2701 \subsection{Tiền xử lý}
2703 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
2704 token (``tiếng'') (\ref{sec:preprocess:token}), và các phần tiền xử lý
2705 khác như đánh dấu các số, các ký hiệu~\ldots
2707 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
2708 đoạn tiền xử lý (như nhận dạng tên riêng) không được thực hiện ngay ở
2709 công đoạn này mà được thực hiện trong phần bắt lỗi real-word.
2711 \subsection{Bắt lỗi non-word}
2713 Phần này sử dụng từ điển để tìm ra những token sai, không có trong từ
2714 điển, lập danh sách từ đề nghị, sau đó yêu cầu người dùng chọn từ
2715 đúng.
2717 Phần này được chạy lặp đi lặp lại cho đến khi không còn lỗi
2718 non-word. Sau đó sẽ đến phần thực hiện của bắt lỗi real-word.
2720 \subsection{Bắt lỗi real-word}
2722 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
2723 công đoạn là tách từ và bắt lỗi chính tả.
2725 Đầu tiên, lưới từ của câu đang xét sẽ được xây dựng. Sau đó lưới từ
2726 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ý đã
2727 không thể thực hiện được trong phần tiền xử lý. Từ lưới từ này, ta sẽ
2728 chọn ra một cách tách từ tốt nhất dựa vào mô hình ngôn ngữ.
2730 Sau khi đã tách từ xong, phần việc còn lại rất giống với các bước đã
2731 thực hiện trong phần tách từ non-word. Tuy nhiên, thay vì lần lượt tra cứu
2732 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
2733 và từ trong câu có giống nhau hay không. Từ trong cách tách từ đúng
2734 nhất được xem là từ đúng. Nếu từ trong câu không giống, ta xem như đó
2735 là lỗi chính tả. Phần còn lại được thực hiện tương tự như trong phần
2736 bắt lỗi non-word.
2739 \section{Tiền xử lý}
2742 \subsection{Tách token}
2743 \label{sec:preprocess:token}
2745 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
2746 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
2747 loại dấu câu trong văn bản. Sau khi tách xong, ta được một dãy các
2748 chuỗi, mỗi chuỗi là một ``token'' kèm theo thông tin về loại token đó
2749 (chữ, khoảng trắng, dấu câu~\ldots)
2751 Ví dụ, đoạn văn bản trên được tách thành những phần như sau:
2753 \def\mybox#1{\hbox{\vrule width 0pt height 24pt}\framebox{\strut#1}}
2754 {\noindent
2755 \mybox{Do} \hfil \mybox{ } \hfil \mybox{văn} \hfil \mybox{ } \hfil \mybox{bản} \hfil
2756 \mybox{ } \hfil \mybox{đầu} \hfil \mybox{ } \hfil \mybox{vào} \hfil \mybox{ } \hfil
2757 \mybox{} \hfil \mybox{ } \hfil \mybox{một} \hfil \mybox{ } \hfil
2758 \mybox{chuỗi} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2759 \mybox{} \hfil \mybox{ } \hfil \mybox{tự} \hfil \mybox{,} \hfil \mybox{ } \hfil
2760 \mybox{ta} \hfil \mybox{ } \hfil \mybox{cần} \hfil \mybox{ } \hfil \mybox{phải} \hfil
2761 \mybox{ } \hfil \mybox{tách} \hfil \mybox{ } \hfil \mybox{văn} \hfil \mybox{ } \hfil
2762 \mybox{bản} \hfil \mybox{ } \hfil \mybox{ra} \hfil \mybox{ } \hfil
2763 \mybox{thành} \hfil \mybox{ } \hfil \mybox{từng} \hfil \mybox{ } \hfil
2764 \mybox{tiếng} \hfil \mybox{ } \hfil
2765 \mybox{một} \hfil \mybox{,} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2766 \mybox{bỏ} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2767 \mybox{khoảng} \hfil \mybox{ } \hfil \mybox{trắng} \hfil \mybox{ } \hfil
2768 \mybox{} \hfil \mybox{ } \hfil \mybox{thừa} \hfil \mybox{ } \hfil \mybox{} \hfil
2769 \mybox{ } \hfil \mybox{đánh} \hfil \mybox{ } \hfil \mybox{dấu} \hfil \mybox{ } \hfil
2770 \mybox{các} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2771 \mybox{dấu} \hfil \mybox{ } \hfil
2772 \mybox{câu} \hfil \mybox{ } \hfil \mybox{trong} \hfil \mybox{ } \hfil
2773 \mybox{văn} \hfil \mybox{ } \hfil \mybox{bản} \hfil \mybox{.} \hfil \mybox{ } \hfil
2774 \mybox{Sau} \hfil \mybox{ } \hfil \mybox{khi} \hfil \mybox{ } \hfil
2775 \mybox{tách} \hfil \mybox{ } \hfil \mybox{xong} \hfil \mybox{,} \hfil \mybox{ } \hfil
2776 \mybox{ta} \hfil \mybox{ } \hfil \mybox{được} \hfil \mybox{ } \hfil \mybox{một} \hfil
2777 \mybox{ } \hfil \mybox{dãy} \hfil \mybox{ } \hfil \mybox{các} \hfil \mybox{ } \hfil
2778 \mybox{chuỗi} \hfil \mybox{,} \hfil \mybox{ } \hfil \mybox{mỗi} \hfil \mybox{ } \hfil
2779 \mybox{chuỗi} \hfil \mybox{ } \hfil \mybox{} \hfil \mybox{ } \hfil
2780 \mybox{một} \hfil \mybox{ } \hfil \mybox{``} \hfil \mybox{token} \hfil
2781 \mybox{''} \hfil \mybox{ } \hfil
2782 \mybox{kèm} \hfil \mybox{ } \hfil \mybox{theo} \hfil \mybox{ } \hfil
2783 \mybox{thông} \hfil \mybox{ } \hfil \mybox{tin} \hfil \mybox{ } \hfil
2784 \mybox{về} \hfil \mybox{ } \hfil \mybox{loại} \hfil \mybox{ } \hfil
2785 \mybox{token} \hfil \mybox{ } \hfil \mybox{đó} \hfil \mybox{ } \hfil
2786 \mybox{(} \hfil \mybox{chữ} \hfil \mybox{,} \hfil \mybox{ } \hfil
2787 \mybox{khoảng} \hfil \mybox{ } \hfil \mybox{trắng} \hfil \mybox{,} \hfil
2788 \mybox{ } \hfil \mybox{dấu} \hfil \mybox{ } \hfil \mybox{câu} \hfil \mybox{ } \hfil
2789 \mybox{\ldots} \hfil \mybox{)} \hfill
2792 Quy luật tách như sau:
2793 \begin{itemize}
2794 \item Khoảng trắng là ký tự khoảng trắng (space) hoặc ký tự tab.
2795 \item Dấu kết thúc câu bao gồm ba dấu: \mybox{.} \mybox{?} \mybox{!}
2796 \item Dấu đóng ngoặc bao gồm: \mybox{"} \mybox{)} \mybox{]} \mybox{\}}
2797 \mybox{>} \mybox{'}
2798 \item Một token là:
2799 \begin{itemize}
2800 \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í
2801 dụ: \mybox{.)}
2802 \item Một hoặc nhiều dấu nối chữ (hyphen) \mybox{-}.
2803 \item Một hoặc nhiều dấu mở nháy đơn \mybox{`}.
2804 \item Một hoặc nhiều dấu đóng nháy đơn \mybox{'}.
2805 \item Một hoặc nhiều chữ, chữ số, một số dấu: \mybox{.} \mybox{,}
2806 \mybox{:} \mybox{'} \mybox{\$} \mybox{\%} \mybox{-}
2807 \mybox{$\backslash$} \mybox{/}; kết thúc bằng chữ hoặc chữ số. Ví
2808 dụ: \mybox{tôi} \mybox{\$12}
2809 \item Một hoặc nhiều chữ, chữ số, kết thúc bằng dấu tỉnh lược
2810 \mybox{'} (quy tắc này chủ yếu áp dụng cho tiếng Anh, như
2811 \mybox{she'} \mybox{s} \mybox{ } \mybox{a} \mybox{ } \mybox{teacher})
2812 \item Một chữ hoặc chữ số.
2813 \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.
2814 \end{itemize}
2815 \end{itemize}
2817 \subsection{Tách câu}
2819 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
2820 định đơn vị câu rất quan trọng trong các ứng dụng xử lý ngôn ngữ tự
2821 nhiên. Tuy nhiên, do chương trình này chưa sử dụng một số thông tin
2822 cần đến đơn vị câu, nên ``câu'' ở đây được hiểu như là một đoạn ngắn,
2823 một câu hoặc một phần của câu.
2825 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ử
2826 lý. Mỗi đoạn sẽ được xử lý độc lập với nhau. Các đoạn được phân cách
2827 bởi các token dấu câu \mybox{.} \mybox{,} \mybox{;} \mybox{(}
2828 \mybox{)}~\ldots{} Phần tách token phải được thực hiện trước phần tách
2829 câu.
2831 \subsection{Chuẩn hoá}
2834 \subsubsection{Chuẩn hoá dấu}
2836 Chuẩn hoá là đặt lại vị trí dấu trong các tiếng nhằm đảm bảo thống
2837 nhất một quy tắc đặt dấu chung. Do tiếng Việt không quy định cụ thể
2838 quy tắc bỏ dấu nên hình thành nhiều cách bỏ dấu khác nhau (bỏ dấu khoa
2839 học, bỏ dấu mỹ thuật~\ldots). Việc bỏ dấu không thống nhất sẽ gây khó
2840 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
2841 quy tắc bỏ dấu khác nhau sẽ cho ra hai chuỗi ký tự hoàn toàn khác nhau
2842 (Ví dụ, ``hoà'' và ``hòa'').
2844 Để tránh tình trạng này, dấu được tách
2845 riêng ra khỏi tiếng, được coi như là một ký tự nằm ở đầu tiếng. Như
2846 vậy một tiếng bất kỳ sẽ bao gồm ký tự đầu tiên đại diện cho thanh
2847 điệu, các ký tự theo sau đại diện cho âm đầu và vần của tiếng đó. Dấu
2848 được thể hiện theo quy ước gõ VNI:
2849 \begin{itemize}
2850 \item Thanh ngang được biểu diễn bằng ký tự `0'.
2851 \item Thanh sắc được biểu diễn bằng ký tự `1'.
2852 \item Thanh huyền được biểu diễn bằng ký tự `2'.
2853 \item Thanh hỏi được biểu diễn bằng ký tự `3'.
2854 \item Thanh ngã được biểu diễn bằng ký tự `4'.
2855 \item Thanh nặng được biểu diễn bằng ký tự `5'.
2856 \end{itemize}
2858 Theo quy tắc trên, ``hoà'' sẽ được biến đổi thành ``2hoa'';
2859 ``hòa'' sẽ được biến đổi thành ``2hoa''. Như vậy ta có thể coi ``hòa''
2860 và ``hoà'' là tương đương nhau khi so sánh dạng biến đổi ``2hoa'' của
2861 chúng. Một số ví dụ khác: ``hồng'' được biến đổi thành ``2hông'',
2862 ``hoa'' được biến đổi thành ``0hoa''.
2864 Các tiếng nước ngoài, các ký hiệu~\ldots{} không có dấu, sẽ được xem như
2865 có thanh ngang. Như vậy, ``USA'' sẽ được biến đổi thành ``0USA''.
2867 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
2868 chữ gốc bên cạnh chữ biến đổi (``chữ chuẩn hoá'') để có thể dùng lại
2869 sau này. Ta cũng có thể phục hồi chữ từ chữ chuẩn hoá bằng cách phân
2870 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
2871 trước. Việc này sẽ giúp chuẩn hoá cách bỏ dấu cho toàn văn bản.
2873 \subsubsection{Chuẩn hoá `y' và `i'}
2875 %% XXX Ngoài ra còn một dạng khác là ``quý'' và ``quí''
2876 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
2877 bằng `y' có thể được đổi thành `i'. Ví dụ, ``quý'' và ``quí'' đều hợp
2878 lệ. Tuy nhiên, không phải chữ nào kết thúc bằng `y' cũng có thể chuyển
2879 thành `i', ví dụ ``thuý'' và ``thúi''. Nguyên nhân là do khi
2880 chuyển thành `i', chữ cái này kết hợp với `u' tạo ra âm chính `ui'
2881 thay vì âm chính `i'. Một số chữ kết thúc bằng `i' cũng không thể
2882 chuyển sang `y', ví dụ ``bí'', ``chí''~\ldots{} Việc cho phép viết
2883 một từ ở hai cách sẽ làm giảm hiệu suất của chương trình do chương
2884 trình coi ``quý'' và ``quí'' là hai chữ hoàn toàn khác nhau. Giải pháp
2885 là lập danh sách những từ kết thúc bằng `y' có thể chuyển sang `i',
2886 sau đó chuyển tất cả những từ kết thúc bằng `i' có trong danh sách
2887 trên sang `y'. Trong quá trình bắt lỗi chính tả, nếu người dùng yêu
2888 cầu chuẩn hoá thì ta có thể xem việc viết `y' hoặc `i' như là sai
2889 chính tả. Nếu không, ta sẽ bỏ qua khác biệt `y' và `i' ở bước báo lỗi
2890 chính tả. Gồm các chữ sau (không xét thanh điệu): ``mi'', ``ti'',
2891 ``thi'', ``qui'', ``ki'', ``hi'', ``li'' ``si'', ``vi''.
2893 \subsection{Chữ viết hoa}
2895 Chữ viết hoa dùng để biểu diễn tên riêng, từ viết tắt hoặc dùng cho
2896 chữ đứng đầu câu. Do đó cần phân biệt chữ đầu câu có
2897 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
2898 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
2899 hoàn toàn thống nhất về quy tắc viết hoa. Ví dụ, có tài liệu dùng
2900 ``Cộng hoà Xã hội Chủ nghĩa Việt Nam'', nhưng có tài liệu lại dùng
2901 ``Cộng Hoà Xã Hội Chủ Nghĩa Việt Nam''.
2903 Do văn bản đầu vào có khả năng bị sai chính tả, kèm theo sự không
2904 thống nhất trong quy cách viết tên riêng, nên khó có thể xác định
2905 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
2906 phần tách từ thay vì trong phần tiền xử lý.
2908 %% ngay chính xác có phải là cụm từ viết hoa đúng hay không. Bước này cố
2909 %% 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,
2910 %% phần này được thực hiện bên trong phần \textbf{Phát sinh từ thay thế}.
2912 %% Có thể dùng thuật giải như sau: Nếu bắt đầu bằng chữ viết hoa, và chữ
2913 %% đầu được viết thường cùng những từ kế tiếp của nó là một từ trong từ
2914 %% điển, thì xem như đó là một từ. Nếu một chuỗi từ viết hoa liên tục
2915 %% (hai từ trở lên) thì xem như đó là một từ (một tên riêng), và được
2916 %% đánh dấu từ lạ $UNK$.
2918 %% 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
2919 %% thu thập nhằm rút ra những chữ thường dùng khi đặt tên. Những chuỗi
2920 %% các chữ hoa liên tiếp được hình thành từ những chữ trong danh sách này
2921 %% sẽ được xem như là tên riêng, đánh mã $PROP$.
2924 %% \begin{algo}\caption{Xử lý chữ hoa}
2925 %% \label{algo:propername}
2926 %% \begin{enumerate}
2927 %% \item Lấy 1 chữ. Kiểm tra ký tự đầu tiên xem có phải ký tự hoa hay
2928 %% không.
2929 %% \item Nếu đây là chữ đầu câu, phát sinh bình thường dựa theo bản
2930 %% viết thường của chữ này. Ngoài ra tiếp tục thực hiện các bước
2931 %% dưới.
2932 %% \item Duyệt từ chữ đó trở đi, lấy chuỗi dài nhất có thể dựa trên
2933 %% $sid$. Phát sinh từ mới dựa trên từ lấy được. Đặt xác suất 0.80.
2934 %% \item Nếu không tìm được từ nào, duyệt lại như bước trên, dùng
2935 %% $scid$.
2936 %% \item Nếu chữ kế tiếp cũng là chữ hoa, duyệt từ đó trở đi để lấy
2937 %% chuỗi chữ hoa dài nhất ($scid$). Phát sinh từ mới
2938 %% mã $PROP$.
2939 %% \end{enumerate}
2940 %% \end{algo}
2942 %% \subsection{Từ láy UNIMPL}
2944 %% Phần này được thực hiện bên trong phần \textbf{Phát sinh từ thay thế}.
2946 %% \begin{itemize}
2947 %% \item Láy toàn bộ (Vd. ba ba, chuồn chuồn~\ldots{})
2948 %% \item Láy âm đầu (Vd. chặt chẽ, trong trẻo~\ldots{})
2949 %% \item Láy điệp vần (Vd. lông bông, lã chã~\ldots{})
2950 %% \item Láy điệp âm, láy vần (Vd. thủ thỉ, tủm tỉm~\ldots{})
2951 %% \item Hai thanh của tiếng thường ở cùng một hệ~\ldots{}
2952 %% \end{itemize}
2954 %% \note{Hổng thèm làm :-)} Vấn đề từ láy cũng tương tự như tên riêng. Giải
2955 %% 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
2956 %% những từ có khả năng là từ láy và thêm vào lưới từ.
2958 %% Đố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
2959 %% nhiều nên có thể thêm các từ láy này vào từ điển.
2960 %% %% Nhưng những ``từ láy''
2961 %% %% ``nhưng những'' có thể giết chết module tách từ một cách êm dịu. Chắc
2962 %% %% nên áp dụng giải pháp ``80 từ láy, 20 từ thường''. Không biết được hay
2963 %% %% không, phiêu quá~\ldots{}
2965 %% \begin{algo}\caption{Xử lý từ láy}
2966 %% \label{algo:poem}
2967 %% \begin{enumerate}
2968 %% \item Lấy 2 chữ liên tiếp.
2969 %% \item Kiểm tra quy tắt từ láy.
2970 %% \item Nếu đúng, phát sinh thêm từ láy mới, mã $POEM$.
2971 %% \end{enumerate}
2972 %% \end{algo}
2974 %% %% Có lẽ nên lọc ra danh sách từ láy bằng tay, đánh nhãn toàn bộ là
2975 %% %% $POEM$, hoặc dùng nhãn riêng. Heuristic này không đáng tin lắm.
2976 %% %% 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
2977 %% %% 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
2978 %% %% được một từ có phải là từ láy hay không??
2980 \subsection{Từ nước ngoài, từ viết tắt, các ký hiệu~\ldots{}}
2982 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
2983 trình bắt lỗi không có kiến thức về các lĩnh vực chuyên
2984 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
2985 để phân loại là điều hết sức khó khăn. Giải pháp được dùng ở đây là
2986 xem các từ nước ngoài, từ viết tắt, các ký hiệu~\ldots{} như là
2987 những chữ bình thường (và sẽ được xem như là lỗi chính tả trong phần
2988 bắt lỗi chính tả).
2990 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
2991 tháng~\ldots{} nhằm giảm bớt các lỗi sai chính tả không đáng có. Các
2992 con số được đánh dấu riêng bằng mã $NUM$. ``Số'' ở đây được coi là bất
2993 cứ chữ nào bắt đầu bằng số. Ví dụ, ``0lit'', ``0.2'',
2994 ``0-4''~\ldots{}{} đều được coi là số.
2996 Ngày tháng được nhận dạng theo mẫu ``ngày-tháng-năm'' hoặc
2997 ``ngày/tháng/năm''. Nói cách khác, ngày tháng là các số liên tiếp,
2998 cách nhau bằng dấu `/' hoặc `--'. Ngày tháng cũng được đánh nhãn $NUM$.
3001 \section{Bắt lỗi non-word}
3004 \subsection{Tìm lỗi chính tả}
3005 \label{sec:nonword:spelling-checking}
3007 Việc tìm lỗi chính tả đơn giản là duyệt qua từng token, kiểm tra xem
3008 token đó có trong từ điển hay không. Nếu token không có trong từ điển,
3009 token đó bị sai chính tả.
3011 Nếu thực hiện như trên, sẽ có rất nhiều chữ bị cho là sai chính tả, ví
3012 dụ như các con số, ngày tháng~\ldots{} Ta cần phải nhận ra những token
3013 loại này và bỏ qua chúng khi tìm lỗi chính tả. Do phần tiền xử lý đã
3014 đánh dấu các token chứa số bằng mã $NUM$ nên khi thực hiện tìm lỗi
3015 chính tả, ta sẽ không xét những token loại này.
3018 \subsection{Lập danh sách từ đề nghị}
3019 \label{sec:nonword:candidate-list}
3021 Sau khi đã xác định những chữ bị sai chính tả, ta cần đưa ra một số
3022 gợi ý để người dùng chọn, thay vì buộc người dùng tự tìm ra chữ
3023 đú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
3024 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
3025 lại để tìm ra chữ đúng.
3027 Lỗi được xử lý trong phần này là lỗi non-word. Lỗi này có thể do những
3028 nguyên nhân sau:
3029 \begin{itemize}
3030 \item Lỗi nhập liệu sai.
3031 \item Lỗi OCR.
3032 \item Lỗi nhận dạng tiếng nói.
3033 \item Lỗi phát âm sai.
3034 \end{itemize}
3037 \subsubsection{Lỗi nhập liệu}
3038 \label{sec:nonword:recover:keyboard}
3040 Lỗi nhập liệu bao gồm những loại lỗi sau:
3041 \begin{itemize}
3042 \item Lỗi gõ sót phím.
3043 \item Lỗi gõ dư phím.
3044 \item Lỗi gõ sai phím (gõ nhầm phím này bằng phím khác).
3045 \item Lỗi gõ sai thứ tự (gõ đảo thứ tự hai phím liên tiếp nhau).
3046 \end{itemize}
3048 Ngoài ra, do phím spacebar phát sinh ký tự khoảng trắng dùng để phân
3049 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
3050 vào các loại lỗi trên, ta có thêm các lỗi bổ sung:
3051 \begin{itemize}
3052 \item Lỗi gõ thiếu phím spacebar, gom hai chữ thành một chữ.
3053 \item Lỗi gõ dư phím spacebar, tách một chữ thành hai chữ.
3054 \item Lỗi gõ sai phím spacebar, có thể dẫn đến việc nhóm hai chữ hoặc
3055 tách chữ làm hai.
3056 \item Lỗi gõ sai thứ tự giữa một phím và phím spacebar dẫn đến việc
3057 một ký tự trong chữ này bị đẩy sang chữ khác.
3058 \end{itemize}
3060 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
3061 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
3062 bớt một phím để tạo ra chữ mới. Với lỗi gõ sai thứ tự, ta duyệt qua
3063 chữ, lần lượt hoán vị hai ký tự liên tiếp để tạo ra chữ mới.
3065 Đối với lỗi gõ nhầm phím, ta dựa vào bố trí bàn phím để phát sinh
3066 lỗi. Giả định sơ đồ bố trí của bàn phím EN-US được dùng. Do thông
3067 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
3068 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
3069 phím, dựa trên bàn phím EN-US. Ví dụ: $A \rightarrow \{ S, Q, W, X, Z \}$.
3071 Với những phím hai ký tự như phím `\texttt{2}' (`\texttt{2}' và
3072 `\texttt{@}') thì \texttt{@} sẽ được thêm
3073 vào tập các phím lân cận với \texttt{2} và ngược lại.
3075 Danh sách cụ thể được nêu trong bảng~\ref{tab:neighbor-keys}.
3077 \begin{table}[htbp]
3078 \centering
3079 \begin{tabular}{ll|ll|ll}
3080 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
3081 \verb#`#&\verb#~1!#&%z
3082 \verb#~#&\verb#`1!#&%z
3083 \verb#1#&\verb#!`~q2@#\\
3084 \verb#!#&\verb#1`~q2@#&%z
3085 \verb#2#&\verb#@1!qw3#\#&%z
3086 \verb#@#&\verb#21!qw3#\#\\
3087 \verb#3#&\#\verb#2@we4$#&%z
3088 \#&\verb#32@we4$#&%z
3089 \verb#4#&\verb#$3#\#\verb#er5%#\\
3090 \verb#$#&\verb#43#\#\verb#er5%#&%z
3091 \verb#5#&\verb#%4$rt6^#&%z
3092 \verb#%#&\verb#54$rt6^#\\
3093 \verb#6#&\verb#^5%ty7&#&%z
3094 \verb#^#&\verb#65%ty7&#&%z
3095 \verb#7#&\verb#&6^yu8*#\\
3096 \verb#&#&\verb#76^yu8*#&%z
3097 \verb#8#&\verb#*7&ui9(#&%z
3098 \verb#*#&\verb#87&ui9(#\\
3099 \verb#9#&\verb#(8*io0)#&%z
3100 \verb#(#&\verb#98*io0)#&%z
3101 \verb#0#&\verb#)9(op-_#\\
3102 \verb#)#&\verb#09(op-_#&%z
3103 \verb#-#&\verb#_0)p[=+#&%z
3104 \verb#_#&\verb#-0)p[=+#\\
3105 \verb#=#&\verb#+-_[{]}\\|#&%z
3106 \verb#+#&\verb#=-_[{]}\\|#&%z
3107 \verb#\#&\verb#|=+]}#\\
3108 \verb#|#&\verb#\=+]}#&%z
3109 \verb#q#&\verb#aw2@1!#&%z
3110 \verb#w#&\verb#qase3#\#\verb#2@#\\
3111 \verb#e#&\verb#wsdr4$3#\#&%z
3112 \verb#r#&\verb#edft5%4$#&%z
3113 \verb#t#&\verb#rfgy6^5%#\\
3114 \verb#y#&\verb#tghu7&6^#&%z
3115 \verb#u#&\verb#yhji8*7&#&%z
3116 \verb#i#&\verb#ujko9(8*#\\
3117 \verb#o#&\verb#iklp0)9(#&%z
3118 \verb#p#&\verb#ol;:[{-_0)#&%z
3119 \verb#[#&\verb#]}=+-_#\\
3120 \verb#{#&\verb#]}=+-_#&%z
3121 \verb#]#&\verb#[{=+\|#&%z
3122 \verb#}#&\verb#[{=+\|#\\
3123 \verb#a#&\verb#qwsz#&%z
3124 \verb#s#&\verb#awedxz#&%z
3125 \verb#d#&\verb#erfcxs#\\
3126 \verb#f#&\verb#rtgvcd#&%z
3127 \verb#g#&\verb#tyhbvf#&%z
3128 \verb#h#&\verb#yujnbg#\\
3129 \verb#j#&\verb#uikmnh#&%z
3130 \verb#k#&\verb#iol,<mj#&%z
3131 \verb#l#&\verb#op;:.>,<k#\\
3132 \verb#;#&\verb#/?.>l#&%z
3133 \verb#:#&\verb#/?.>l#&%z
3134 \verb#'#&\verb#[{]}/?;:#\\
3135 \verb#"#&\verb#'[{]}/?;:#&%z
3136 \verb#z#&\verb#asx#&%z
3137 \verb#x#&\verb#zsdc#\\
3138 \verb#c#&\verb#xdfv#&%z
3139 \verb#v#&\verb#cfgb#&%z
3140 \verb#b#&\verb#vghn#\\
3141 \verb#n#&\verb#bhjm#&%z
3142 \verb#m#&\verb#njk,<#&%z
3143 \verb#,#&\verb#<mkl.>#\\
3144 \verb#<#&\verb#,mkl.>#&%z
3145 \verb#.#&\verb#>,<l;:/?#&%z
3146 \verb#>#&\verb#.,<l;:/?#\\
3147 \verb#/#&\verb#?.>;:'"#&%z
3148 \verb#?#&\verb#/.>;:'"#&%z
3149 \end{tabular}
3150 \caption{Danh sách phím lân cận}
3151 \label{tab:neighbor-keys}
3152 \end{table}
3155 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
3156 tự sẽ phát sinh ra một tập $8^5$ các chuỗi có khả năng. Trong số này
3157 chỉ có một số rất ít là chữ thật sự, đúng quy tắc chính tả. Tuy nhiên
3158 việc xử lý một khối lượng lớn như vậy là không thể. Vì vậy chương
3159 trình giả định chỉ nhập gõ sai tối đa hai phím với mỗi chữ, nhằm giảm
3160 thiểu bùng nổ tổ hợp.
3162 Với lỗi spacebar, ta cũng xét tương tự. Tuy nhiên, với những lỗi có
3163 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
3164 lúc, xem như là một chữ. Lỗi gõ nhầm spacebar với một phím khác là
3165 điều khó có thể xảy ra vì phím spacebar tương đối lớn, dễ nhận diện
3166 khi gõ.
3168 Với các kiểu gõ như VNI, TELEX. Chương trình cố gắng ``phục hồi'' từ
3169 những chữ gõ sai nếu phát hiện được. Ví dụ, ``nguyê4n'' sẽ tạo ra
3170 ``nguyễn''. Bộ gõ được VNI, TELEX cài đặt, sau đó nhận chuỗi các ký tự
3171 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
3172 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
3173 lại.
3175 Bộ gõ VNI và TELEX được sử dụng như trong
3176 bảng~\ref{tab:vni-telex}. Nguyên tắc của các bộ gõ được cài đặt không
3177 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ộ
3178 gõ sẽ được duyệt qua chữ, từ vị trí của phím dấu về đầu chữ. Nếu phím
3179 dấu có thể kết hợp được với ký tự đang được duyệt, ta xem như đã phục
3180 hồi lỗi. Lỗi VNI-TELEX được áp dụng lại, sau khi đã phục hồi lỗi theo
3181 phương pháp trên, vì khi gõ VNI-TELEX người dùng vẫn có khả năng gõ
3182 nhầm các phím dấu.
3184 \begin{table}[htbp]
3185 \centering
3186 \begin{tabular}{ll|ll}
3187 \multicolumn{2}{c}{VNI}&\multicolumn{2}{c}{TELEX}\\
3188 Phím&Dấu&Phím&Dấu\\\hline
3189 1&dấu sắc&s&dấu sắc\\
3190 2&dấu huyền&f&dấu huyền\\
3191 3&dấu hỏi&r&dấu hỏi\\
3192 4&dấu ngã&x&dấu ngã\\
3193 5&dấu nặng&j&dấu nặng\\
3194 6&dấu mũ&aa,ee,oo&â,ê,ô\\
3195 u7,o7&ư,ơ&uw,ow&ư,ơ\\
3196 a8&ă&aw&ă\\
3197 d9&đ&dd&đ\\
3198 \end{tabular}
3199 \caption{Kiểu gõ VNI-TELEX}
3200 \label{tab:vni-telex}
3201 \end{table}
3203 % Hmm.. phần phục hồi ngược từ VNI, TELEX. Vd, englíh (english). Cái này
3204 % nhường cho English Speller. Hơi vướng với VIQR.
3206 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ừ
3207 điển, ta cho chữ vào danh sách đề nghị. Ngược lại, chữ bị hủy bỏ.
3209 Tóm lại, thuật toán~\ref{algo:keyb} để phục hồi lỗi bàn phím.
3210 \begin{algo}
3211 \caption{Phục hồi lỗi bàn phím}
3212 \label{algo:keyb}
3213 \begin{enumerate}
3214 \item Phục hồi lỗi VNI-TELEX.
3215 \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
3216 quả của lần phục hồi trước.
3217 \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
3218 quả của lần phục hồi trước.
3219 \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
3220 quả của lần phục hồi trước.
3221 \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
3222 quả của lần phục hồi trước.
3223 \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
3224 quả của lần phục hồi trước.
3225 \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
3226 quả của lần phục hồi trước.
3227 \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
3228 quả của lần phục hồi trước.
3229 \item Lọc lại danh sách những từ đã có. Nếu từ không nằm trong từ
3230 điển tiếng thì loại bỏ.
3231 \end{enumerate}
3232 \end{algo}
3234 \begin{algo}\caption{Phục hồi lỗi VNI-TELEX}
3235 \begin{enumerate}
3236 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3237 \item Nếu ký tự đang xét là phím dấu, duyệt ngược từ vị trí ký tự
3238 đang xét về đầu chữ. Nếu có thể ghép dấu, thực hiện ghép dấu, lưu
3239 chữ vào danh sách.
3240 \end{enumerate}
3241 \end{algo}
3243 \begin{algo}\caption{Phục hồi lỗi gõ sót phím}
3244 \begin{enumerate}
3245 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3246 \item Ở từng vị trí, chèn thêm một ký tự vào bên phải ký tự đang
3247 xét. Lưu chữ vào danh sách.
3248 \end{enumerate}
3249 \end{algo}
3251 \begin{algo}\caption{Phục hồi lỗi gõ dư phím}
3252 \begin{enumerate}
3253 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3254 \item Ở từng vị trí, xóa ký tự đang xét. Lưu chữ vào danh sách.
3255 \end{enumerate}
3256 \end{algo}
3258 \begin{algo}\caption{Phục hồi lỗi gõ nhầm phím}
3259 \begin{enumerate}
3260 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3261 \item Ở từng vị trí, thay thế ký tự đang xét bằng ký tự lân cận (như
3262 trong bảng~\ref{tab:neighbor-keys}). Lưu chữ vào danh sách.
3263 \end{enumerate}
3264 \end{algo}
3266 \begin{algo}\caption{Phục hồi lỗi gõ sai thứ tự phím}
3267 \begin{enumerate}
3268 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3269 \item Ở từng vị trí, hoán vị ký tự đang xét và ký tự bên phải ký tự
3270 đang xét. Lưu chữ vào danh sách.
3271 \end{enumerate}
3272 \end{algo}
3274 \begin{algo}\caption{Phục hồi lỗi gõ sót phím spacebar}
3275 \begin{enumerate}
3276 \item Duyệt lần lượt từng ký tự trong chữ, từ trái sang phải.
3277 \item Ở từng vị trí, tách chữ làm hai chữ tại vị trí ký tự đang
3278 xét. Lưu hai chữ vào danh sách.
3279 \end{enumerate}
3280 \end{algo}
3282 \begin{algo}\caption{Phục hồi lỗi gõ dư phím spacebar}
3283 \begin{enumerate}
3284 \item Nối chữ đang xét và chữ bên phải chữ đang xét lại làm một.
3285 \item Lưu chữ vào danh sách.
3286 \end{enumerate}
3287 \end{algo}
3289 \begin{algo}\caption{Phục hồi lỗi gõ sai thứ tự phím spacebar}
3290 \begin{enumerate}
3291 \item Chuyển một ký tự từ chữ bên phải chữ đang xét sang cuối chữ đang
3292 xét. Lưu vào danh sách.
3293 \item Chuyển một ký tự từ chữ đang xét sang đầu chữ bên phải chữ đang
3294 xét. Lưu vào danh sách.
3295 \end{enumerate}
3296 \end{algo}
3298 \subsubsection{Lỗi phát âm}
3300 Lỗi phát âm chủ yếu gây ra lỗi real-word. Tuy nhiên lỗi phát âm đôi
3301 khi vẫn có lỗi non-word. Đây là những từ phát âm giống nhau, chữ viết
3302 bao gồm các thành phần âm đầu, âm đệm, âm chính, âm cuối hợp lệ. Tuy
3303 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ừ
3304 điển tiếng. Ví dụ, ``nghành'', ``ngỉ'', ``ka''. Do đặc điểm của chữ
3305 quốc ngữ, một số âm tố không thể kết hợp với nhau. Đây là nguyên nhân
3306 chủ yếu của lỗi loại này.
3308 Lỗi phát âm sẽ được trình bày cụ thể trong
3309 phần~\ref{sec:realword:recover:sound}. Phần này chỉ nêu ra những điểm
3310 riêng của lỗi phát âm --- non-word.
3312 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
3313 khi phân tích cấu trúc âm tiết tiếng Việt, ta sẽ thay thế từng thành
3314 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ư
3315 thành phần được thay thế. Thuật toán lỗi phát âm như trong thuật
3316 toán~\ref{algo:error:nonword}.
3317 \begin{algo}
3318 \caption{Phục hồi lỗi phát âm (non-word)}
3319 \label{algo:error:nonword}
3320 \begin{enumerate}
3321 \item Phân tích cấu trúc âm tiết.
3322 \item Tạo danh sách âm tiết~\ref{algo:syllable-candidate-list}, bao
3323 gồm các âm tiết có phát âm tương tự với âm tiết ban đầu.
3324 \item Lọc lại danh sách, những âm tiết không có tront từ điển tiếng
3325 bị loại bỏ.
3326 \end{enumerate}
3327 \end{algo}
3329 \subsection{Sắp xếp danh sách từ đề nghị}
3330 \label{sec:nonword:sort-candidates}
3332 Như đã nói trong phần~\ref{sec:sort-candidates}, có nhiều cách để sắp
3333 xếp danh sách từ đề nghị. Do không thể sử dụng các thông tin cú pháp,
3334 ngữ nghĩa, giải pháp được áp dụng là dùng mô hình ngôn ngữ (được dùng
3335 khi bắt lỗi real-word --- phần~\ref{sec:language-model}) sẽ được dùng
3336 để đánh giá các từ đề nghị, cùng với việc loại bỏ các chữ không cùng
3337 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
3338 từ.
3340 Giải pháp được áp dụng như sau trong thuật
3341 toán~\ref{algo:nonword:sort}.
3342 \begin{algo}
3343 \caption{Sắp xếp danh sách từ đề nghị (non-word)}
3344 \label{algo:nonword:sort}
3345 \begin{enumerate}
3346 \item Phát sinh lưới từ.
3347 \item Thêm các chữ đề nghị vào, cập nhật lưới từ, thêm các từ mới từ
3348 những chữ được thêm.
3349 \item Áp dụng mô hình ngôn ngữ, dựa vào điểm để sắp xếp danh sách từ.
3350 \end{enumerate}
3351 \end{algo}
3353 \section{Bắt lỗi real-word}
3355 \subsection{Lưới từ}
3356 \label{sec:wordlattice}
3358 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
3359 mô hình ngôn ngữ. Để thuận tiện xử lý, chương trình sử dụng một cấu
3360 trúc dữ liệu dạng đồ thị để thể hiện các từ --- gọi là lưới
3361 từ\footnote{word lattice}. Đây là một đồ thị có hướng không chu trình,
3362 với các nút là các từ trong câu, cạnh là đường nối giữa hai từ kề
3363 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
3364 từ trong câu, lưới từ có hai nút đặc biệt là nút ``head'' và nút
3365 ``tail''. Nút ``head'' nằm ở đầu lưới từ, nối với những nút tương ứng
3366 với những từ đầu tiên trong câu. Ngược lại, nút ``tail'' nằm ở cuối
3367 lưới từ, được nối với những từ cuối cùng trong câu.
3368 Lưới từ chứa tất cả
3369 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
3370 theo trật tự như trong câu. Khi duyệt từ nút gốc đến nút đích, ta sẽ
3371 được một cách tách từ cho câu. Hình~\ref{fig:wordlattice} thể hiện một
3372 lưới từ.
3374 \begin{figure}[htbp]
3375 \centering
3376 \includegraphics[width=\textwidth]{wordlattice}
3377 \caption{Lưới từ của câu ``Học sinh học sinh học''}
3378 \label{fig:wordlattice}
3379 \end{figure}
3381 Ngoài lưới từ cơ bản như mô tả ở trên, ta có thể mở rộng lưới từ để
3382 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,
3383 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ở
3384 rộng (hình~\ref{fig:wordlattice1}).
3386 \begin{figure}[htbp]
3387 \centering
3388 \includegraphics[width=\textwidth]{wordlattice1}
3389 \caption{Lưới từ mở rộng của câu ``Học sinh học sinh học''}
3390 \label{fig:wordlattice1}
3391 \end{figure}
3393 Một dạng khác của lưới từ, gọi là lưới~2-từ (xem
3394 hình~\ref{fig:wordlattice2}). Trong loại lưới từ này,
3395 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
3396 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
3397 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
3398 trong lưới từ chỉ có ba từ thay vì bốn từ. Lưới từ loại này dùng để
3399 thể hiện mô hình trigram (trong khi lưới từ bình thường được dùng để
3400 thể hiện bigram). Việc tạo ra lưới 3-từ, lưới 4-từ là có thể. Tuy
3401 nhiên những lưới từ này thường không hiệu quả.
3403 \begin{figure}[htbp]
3404 \centering
3405 \includegraphics[width=\textwidth]{wordlattice2}
3406 \caption{Lưới~2-từ của câu ``Học sinh học sinh học''}
3407 \label{fig:wordlattice2}
3408 \end{figure}
3410 \subsection{Tạo lưới từ}
3411 \label{sub:lattice:creation}
3413 Lưới từ cơ bản được tạo bằng thuật toán Viterbi. Mỗi tiếng trong câu
3414 được duyệt qua để tìm ra tất cả các từ có thể có trong đoạn. Sau đó
3415 tập hợp các từ này lại tạo nên lưới từ.
3417 \begin{algo}\caption{Tạo lưới từ (cơ bản)}
3418 Cho câu S có n tiếng. State là đỉnh, còn ``nút i'' là cạnh. Ta duyệt
3419 lần lượt qua các cạnh để tìm ra các từ. Duyệt i từ 1 đến n:
3420 \begin{itemize}
3421 \item Tạo state gốc cho nút i.
3422 \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).
3423 \item Nếu không tiến được thì xóa state.
3424 \item Nếu hoàn tất một từ thì lưu lại.
3425 \end{itemize}
3426 \end{algo}
3428 Thuật toán tạo lưới~2-từ được nêu trong \cite{Ravishankar}. Thuật toán
3429 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
3430 xem như là lưới 1-từ. Thuật toán được tóm tắt lại như trong thuật
3431 toán~\ref{algo:extend-lattice}.
3433 \begin{algo}
3434 \caption{Tạo lưới $n$-từ từ lưới $(n-1)$-từ}
3435 \label{algo:extend-lattice}
3436 \begin{enumerate}
3437 \item Nếu nút ($w$) có $n$ từ đứng liền trước nó ($w_i$),
3438 $i=1,2,\ldots{},n$ trong lưới từ gốc, nó sẽ được lặp lại $n$ lần trong
3439 lưới từ mới, tên là ($w_{i}w$), tương ứng với $i=1,2,\ldots{},n$.
3440 \item Nếu ($w_i$) nối với ($w_j$) trong lưới từ gốc, nối tất cả
3441 ($w_xw_i$) với ($w_iw_j$) $x$ bất kỳ.
3442 \item Giá trị của ($w_iw_j$) là giá trị của cạnh ($w_i$) ($w_j$) trong
3443 lưới từ cũ.
3444 \item Giá trị của cạnh ($w_iw_j$) ($w_jw_k$) là 3-gram của $w_i$, $w_j$
3445 và $w_k$.
3446 \end{enumerate}
3447 \end{algo}
3449 %% Các lưới n-từ có đặc điểm là tăng nhanh số nút và số cạnh, nhưng số
3450 %% tầng vẫn không đổi (Đồ thị càng ngày càng ``mập'', nhưng ``cao''
3451 %% không nổi ;-) )
3456 \subsection{Mở rộng lưới từ --- Phục hồi lỗi}
3457 \label{sec:realword:recover}
3459 Sau khi có lưới từ cơ bản. Ta có thể áp dụng mô hình ngôn ngữ để tìm
3460 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
3461 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
3462 vào những từ có khả năng đúng, sau đó mới có thể tách từ. Phần phục
3463 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
3464 công đoạn này.
3466 Như đã xét ở phần~\ref{sec:nonword:candidate-list}, có 4 loại lỗi chủ
3467 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à
3468 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
3469 real-word. Tuy nhiên, lỗi real-word chủ yếu là lỗi phát âm, lỗi bàn
3470 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
3471 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
3472 trình bày trong phần~\ref{sec:nonword:recover:keyboard}.
3474 %% Phần này được sử dụng trong lúc tạo lưới từ và kiểm tra chính
3475 %% tả. Mục đích là, cho trước một từ, phát sinh những từ ``gần giống''
3476 %% với từ đó. Việc định nghĩa như thế nào là ``giống'' ở đây dựa theo các
3477 %% nguyên nhân gây ra lỗi chính tả:
3478 %% \begin{itemize}
3479 %% \item Lỗi phát âm. Ví dụ, ``vu'' và ``du''.
3480 %% \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õ
3481 %% ``tôi'' thành ``tôu''. Khắc phục lỗi này dựa vào bố trí phím trên
3482 %% bàn phím. Độ đo là khoảng cách từ phím tạo ra ký tự trong từ cho
3483 %% trước và những từ chung quanh. Thông thường lỗi này chỉ xảy ra một
3484 %% lần trong mỗi từ. Ngoài ra còn lỗi liên quan đến cách kiểu gõ tiếng
3485 %% Việt.
3486 %% \item Lỗi OCR\footnote{Optical Character Recognition}. Lỗi dạng này
3487 %% phụ thuộc nhiều vào phông chữ được dùng trên văn bản giấy. Tuy nhiên
3488 %% vẫn có một số lỗi chung như ``a'' và ``c'', ``d'' và ``cl''~\ldots{}
3489 %% \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ý
3490 %% do cần nhiều tri thức về ngôn ngữ tiếng Việt.
3491 %% \item Lỗi không rõ nguyên nhân. Với dạng lỗi này, ta dùng hàm độ đo,
3492 %% 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
3493 %% được dùng được nêu trong \cite{Oflazer}, sẽ được trình bày lại bên
3494 %% dưới.
3495 %% \end{itemize}
3497 %% \note{Hmm..} có lẽ nên gắng thêm vào các từ phát sinh một ``hệ số chính
3498 %% 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
3499 %% sinh. Good or bad? Hmmm... Làm sao để làm? Hmmm Hmmm
3501 Lưới từ sau khi mở rộng có hai đặc điểm sau:
3502 \begin{itemize}
3503 \item Không phân biệt giữa từ gốc và các từ được phát sinh. Nói cách
3504 khác, nhìn vào lưới từ ta không thể biết được đâu là từ gốc, đâu là
3505 từ phát sinh. Không có ưu tiên cho từ gốc.
3506 \item Do mô hình ngôn ngữ được tính toán dựa trên tổng giá trị của các
3507 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
3508 chọn vì tổng giá trị sẽ nhỏ hơn.
3509 \end{itemize}
3511 Đối với vấn đề đầu tiên, ta có thể thay đổi giá trị các cạnh nối đến
3512 từ đó để phản ánh sự khác biệt. Ví dụ, trong
3513 hình~\ref{fig:wordlattice1}, ta có thể biến đổi giá trị các cạnh nối
3514 đến từ ``xinh'' bằng cách giảm 0,2\% giá trị của các cạnh nối đến từ
3515 ``xinh'' đó. Vậy, bất cứ cách tách từ nào chứa từ xinh cũng sẽ bị giảm
3516 một khoảng giá trị nhất định, so với các cách tách từ chứa từ ``sinh''
3517 vẫn giữa nguyên giá trị gốc. Nhờ vậy, từ gốc sẽ được ưu tiên hơn các
3518 từ phát sinh.
3520 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
3521 hiện của các từ phát sinh. Những từ phát sinh có khả năng nhất sẽ ít
3522 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
3523 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
3524 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ữ
3525 liệu sai trong thực tế và ngữ liệu đúng tương ứng để rút trích thông
3526 tin này. Đây là một hướng phát triển trong tương lai.
3528 Vấn đề thứ hai phức tạp hơn. Nếu ta sử dụng Viterbi hay
3529 WFST thì chỉ cần chuẩn hoá giá trị mỗi lần duyệt nút kế. Khi áp dụng
3530 đồ thị để giải quyết, ta không thể làm như vậy vì giá trị các cạnh
3531 được ngầm định là không thay đổi, và công thức tính độ dài đường đi là
3532 tổng các cạnh, cũng không thay đổi. Tuy nhiên ta có thể khắc phục bằng
3533 cách thay đổi giá trị của các cạnh {\em chưa được xét}. Việc thay đổi
3534 giá trị các cạnh chưa được xét sẽ không ảnh hưởng đến tính đúng đắn
3535 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
3536 cạnh đã xét. Nếu ta không thay đổi giá trị các cạnh đã xét, thuật toán
3537 vẫn không đổi.
3539 Giả sử có một đường đi qua $n$ cạnh $e_1,e_2,\ldots,e_n$, giá trị
3540 đường đi qua các cạnh đó là $\sum_{i=1}^{n}e_i$. Nếu được chuẩn hóa,
3541 giá trị mới sẽ là $\frac{1}{n}\sum_{i=1}^{n}e_i$.
3542 %% \begin{align*}
3543 %% \Delta&=\sum_{i=1}^{n}e_i-\frac{1}{n}\sum_{i=1}^{n}e_i\\
3544 %% &=\frac{n-1}{n}\sum_{i=1}^{n}e_i\\
3545 %% \frac{1}{n}\sum_{i=1}^{n}e_i&=\sum_{i=1}^{n}e_i-\Delta\\
3546 %% &=\sum_{i=1}^{n}e_i-\frac{n-1}{n}\sum_{i=1}^{n}e_i\\
3547 %% &=\sum_{i=1}^{n}(e_i-\frac{n-1}{n}e_i)\\
3548 %% &=\sum_{i=1}^{n}\frac{1}{n}e_i
3549 %% \end{align*}
3550 Do $$\frac{1}{n}\sum_{i=1}^{n}e_i=\sum_{i=1}^{n}\frac{1}{n}e_i$$ ta
3551 thấy mỗi cạnh cần phải ``co'' lại còn một khoảng $\frac{1}{n}$ (hay
3552 nói cách khác, mất đi $\frac{n-1}{n}$) giá trị
3553 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
3554 mới. Tuy nhiên, do các cạnh đã xét sẽ không thể thay đổi, nên ta sẽ
3555 gom tất cả các khoảng giá trị mất đi này trừ vào cạnh sẽ được xét.
3557 Giả sử đã có $n$ cạnh, ta cần thêm cạnh $e_{n+1}$ vào. Độ dài $n$ cạnh
3558 trước đó là $N$ (đã chuẩn hoá). Ta cần tính $N'$ là độ dài $n+1$ cạnh đã
3559 chuẩn hoá
3560 \begin{align*}
3561 \Delta&=N'-N\\
3562 &=\frac{Nn+e_{n+1}}{n+1}-N\\
3563 &=\frac{e_{n+1}-N}{n+1}\\
3564 N'&=N+\Delta
3565 \end{align*}
3567 Ta có thể coi cạnh mới, cần được thêm vào là cạnh có giá trị là
3568 $\Delta=\frac{e_{n+1}-N}{n+1}$ thay vì $e_{n+1}$ như ban đầu. Tuy
3569 nhiên, do $\Delta$ có thể âm, cần dùng những thuật toán có thể tìm
3570 đường đi trên đồ thị có trọng số âm như Bellman-Ford thay vì dùng
3571 PFS. Có thể hình dung đồ thị mới là một loại đồ thị động, các cạnh
3572 phía sau càng ngày càng bị thu ngắn lại.
3574 Một vấn đề cần quan tâm là, liệu thuật toán Bellman-Ford có còn đúng
3575 với một đồ thị động như vậy hay không? Giả sử ta tính được giá trị
3576 cạnh khi dựa trên đường đi ngắn nhất phía trước nó là A1. Sau đó, vì
3577 một lí do nào đó, đường đi ngắn nhất tới điểm đó bị đổi sang A2, dẫn
3578 đế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
3579 toán có thể không còn chính xác. Tuy nhiên với đồ thị DAG của lưới từ,
3580 điều này vẫn còn đúng. Trong DAG, ta có thể xác định được tập các nút
3581 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
3582 với phần còn lại của đồ thị. Do đó ta có thể tìm đường đi lớn nhất chỉ
3583 trong tập con đó mà thôi. Sau khi tìm được đường đi ngắn nhất trong
3584 tập con này, coi như đường đi đã ổn định và không thay đổi nữa, vì vậy
3585 việc tính giá trị cạnh kế tiếp sẽ không bị thay đổi sau mỗi lần tính
3586 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
3587 thứ tự tôpô chứ không thể duyệt theo một thứ tự ngẫu nhiên.
3589 %%% trường hợp có hai đường đi đến cùng một cạnh và cạnh âm thì sao?
3591 \subsubsection{Lỗi phát âm}
3592 \label{sec:realword:recover:sound}
3594 Lỗi phát âm phụ thuộc vào cách phát âm của từng
3595 vùng. \cite{LoiChinhTa} liệt kê các trường hợp lỗi thông dụng
3596 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
3597 âm.
3598 %%% Nêu tổng quan, nói cụ thể hơn ở phần sau ``previous work''
3599 Theo~\cite{LoiChinhTa}, lỗi bao gồm các loại sau:
3600 \begin{itemize}
3601 \item Lỗi thanh điệu. Chủ yếu là lỗi nhầm lẫn hai thanh hỏi, ngã.
3602 \item Lỗi về âm đầu. Thường lẫn lộn các âm đầu sau: C/K, G/Gh, Ng/Ngh,
3603 Ch/Tr, S/X, V/D/Gi/R, W/Hw/Ngw/Qu.
3604 \item Lỗi về âm chính. Thường lẫn lộn các âm chính sau: ai/ay/ây,
3605 ao/au/âu, ăm/âm, ăp/âp, iu/iêu/êu, im/iêm/em, ip/iêp/êp/ep,
3606 oi/ôi/ơi, om/ôm/ơm, op/ôp/ơp, ong/ông, oc/ôc, ui/uôi, um/uôm, up/(uôp),
3607 ưi/ươi, ưu/ươu, ưm/ươm, (ưp)/ươp.
3608 \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
3609 sau:
3610 an/ang, at/ac, ăn/ăng, ăt/ăc, ân/âng, ât/âc, en/eng, et/ec, ên/ênh,
3611 êt/êch, in/inh, it/ich, iên/iêng, iêt/iêc, ơn/(ơng), ơt/(ơc),
3612 un/ung, ut/uc, uôn/uông, uôt/uôc, ưn/ưng, ưt/ưc, ươn/ương, ươt/ươc.
3613 \item Sai quy cách viết hoa
3614 \end{itemize}
3617 \subsubsection{Lỗi không rõ nguyên nhân}
3619 %% Lỗi này dựa vào {\em độ đo khoảng cách hiệu chỉnh} được đề cập
3620 %% trong \cite{Oflazer}. Các thao tác hiệu chỉnh được đo gồm {\em chèn,
3621 %% xóa, thay thế một ký tự} hoặc {\em hoán vị hai ký tự kề nhau}, để có
3622 %% thể chuyển đổi từ này thành từ kia. Đặt $X = x_1, x_2, \ldots{}, x_m$ và
3623 %% $Y = y_1,y_2,\ldots{},y_n$ là hai chuỗi có độ dài tương ứng là $m$ và
3624 %% $n$. $X[i]\quad(Y[j])$ biểu diễn chuỗi con ban đầu của X (Y) từ đầu từ
3625 %% đến ký tự thứ $j$. Cho $X$ và $Y$, độ đo $ed(X[m],Y[n])$ được tính như
3626 %% sau:
3627 %% \begin{equation}
3628 %% \begin{array}{rll}
3629 %% ed(X[i+1],Y[j+1]) &= ed(X[i],Y[j]) & \text{nếu $x_{i+1}=y_{j+1}$
3630 %% (ký tự cuối như nhau)}\\
3631 %% &= 1+min\{ed(X[i-1],Y[j-1]), & \text{nếu $x_i=y_{j+1}$}\\
3632 %% &\qquad\qquad ed(X[i+1],Y[j]), & \text{và $x_{i+1}=y_j$}\\
3633 %% &\qquad\qquad ed(X[i],Y[j+1])\}\\o
3634 %% &= 1+min\{ed(X[i],Y[j]),&\text{trường hợp khác}\\
3635 %% &\qquad\qquad ed(X[i+1],Y[j]),\\
3636 %% &\qquad\qquad ed(X[i],Y[j+1])\}\\
3637 %% ed(X[0],Y[j]) &=j & 0 \le j \le n\\
3638 %% ed(X[i],Y[j]) &=i & 0 \le i \le n\\\\
3639 %% ed(X[-1],Y[j]) &=ed(X[i],Y[-1]) = max(m,n)&\text{Biên}
3640 %% \end{array}
3641 %% \end{equation}
3643 %% Thuật toán có thể được khử đệ quy khi cài đặt bằng quy hoạch
3644 %% động. Nhận thấy $ed(X[i+1],Y[i+1])$ cần dùng
3645 %% $ed(X[i],Y[i])$,$ed(X[i-1],Y[i-1])$,$ed(X[i],Y[i+1])$ hoặc
3646 %% $ed(X[i+1],Y[i])$, ta có thể tính từ lần lượt từ thấp đến cao theo
3647 %% đường zig-zag bắt đầu từ đỉnh (1,1), sau đó đến đường chéo phụ (1,2),
3648 %% (2,1), rồi đường chéo (1,3),(2,2),(3,1)~\ldots{}
3650 %% \begin{algo}\caption{Tính hàm $ed$}
3651 %% \label{algo:ed}
3652 %% \begin{enumerate}
3653 %% \item Đặt (0,0) là 0 nếu x[0] = y[0] hoặc 1 nếu ngược lại.
3654 %% \item Đặt (0,j) là j
3655 %% \item Đặt (i,0) là i
3656 %% \item (i,j)=(i-1,j-1) nếu x[i]=y[j]
3657 %% \item (i,j)=1+min\{(i-2,j-2),(i,j-1),(i-1,j)\} nếu x[i] = y[j-1]
3658 %% hoặc x[i-1]=y[j]
3659 %% \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
3660 %% \end{enumerate}
3661 %% \end{algo}
3663 %% Ví dụ: tính độ sai khác giữa chữ ``thắng'' và ``tắgn''. Ta tính các
3664 %% giá trị như bảng~\ref{tab:ed-example}. Vậy có hai khác biệt giữa hai
3665 %% chữ. Khác biệt thứ nhất là xoá ký tự `h'. Khác biệt thứ hai là hoán vị
3666 %% hay ký tự `n' và `g'.
3668 %% \begin{table}[htbp]
3669 %% \centering
3670 %% \begin{tabular}{|c|c|c|c|c|c|c|}
3671 %% \hline
3672 %% X&-&-&t&ắ&g&n\\\hline
3673 %% -&0&0&0&0&0&0\\\hline
3674 %% -&0&0&1&2&3&4\\\hline
3675 %% t&0&1&\bf 0&\bf 1&\bf 2&\bf 3\\\hline
3676 %% h&0&2&\bf 1&\bf 1&\bf 2&\bf 3\\\hline
3677 %% ắ&0&3&\bf 2&\bf 1&\bf 1&\bf 2\\\hline
3678 %% n&0&4&\bf 3&\bf 2&\bf 2&\bf 1\\\hline
3679 %% g&0&5&\bf 4&\bf 3&\bf 2&\bf 2\\\hline
3680 %% \end{tabular}
3681 %% \caption{Bảng $ed$ của ``thắng'' và ``tắgn''}
3682 %% \label{tab:ed-example}
3683 %% \end{table}
3685 \subsubsection{Phân tích âm tiết}
3686 \label{sec:realword:syllable}
3688 Để 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
3689 tiếng. Một tiếng bao gồm âm đầu, vần và thanh. Vần gồm âm đệm, âm
3690 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
3691 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
3692 cấu trúc âm tiếng theo sơ đồ trạng thái như hình~\ref{fig:syllable}.
3694 \begin{figure}[htbp]
3695 \centering
3696 \includegraphics[width=\textwidth]{syllable}
3697 \caption{Sơ đồ trạng thái phân tích cấu trúc tiếng}
3698 \label{fig:syllable}
3699 \end{figure}
3701 Ta có thể phân tích tiếng dùng FST. Tuy nhiên, qua
3702 hình~\ref{fig:syllable} có thể thấy chỉ có tám cách để hình thành
3703 tiếng. Cài đặt theo tám cách này đơn giản và hiệu quả hơn dùng FST
3704 tổng quát.
3705 %Việc sắp xếp thứ tự áp dụng từng cách và một số heuristic
3706 %sẽ giúp loại bỏ nhập nhằng khi phân tích tiếng.
3707 \begin{algo}\caption{Phân tích cấu trúc âm tiết}
3708 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
3709 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
3710 bố thì chấp nhận âm tiết, dừng thuật toán.
3711 \begin{enumerate}
3712 \item Kiểm tra mẫu ``Âm đầu, âm chính, âm cuối''.
3713 \item Kiểm tra mẫu ``Âm chính, âm cuối''.
3714 \item Kiểm tra mẫu ``Âm đầu, âm chính''.
3715 \item Kiểm tra mẫu ``Âm chính''.
3716 \item Kiểm tra mẫu ``Âm đầu, âm đệm, âm chính, âm cuối''.
3717 \item Kiểm tra mẫu ``Âm đệm, âm chính, âm cuối''.
3718 \item Kiểm tra mẫu ``Âm đầu, âm đệm, âm chính''.
3719 \item Kiểm tra mẫu ``Âm đệm, âm chính''.
3720 \item Không thể phân tích âm tiết. Dừng.
3721 \end{enumerate}
3722 \end{algo}
3724 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
3725 của tiếng. Ví dụ, ``lúa'' bao gồm âm chính ``ua'' hay âm đệm ``u'' và âm
3726 chính ``a''. Những âm có thể gây nhập nhằng xuất phát từ việc âm `u'
3727 và `o' có thể vừa là âm đệm, vừa là âm chính, bao gồm các âm ``uô'',
3728 ``ua''. Ngoài ra còn có nhập nhằng giữa âm chính và âm cuối, bao gồm
3729 ``ui'', ``uy'', ``oi''. Cuối cùng là trường hợp ``qu''. Hầu hết các
3730 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
3731 tiên xét các trường hợp không có âm đệm trước). Hai
3732 trường hợp cần được xử lý đặc biệt là ``uy'' và ``qu''.
3734 Nếu chỉ sử dụng những luật này, sẽ có nhiều tiếng phân tích được,
3735 nhưng thực tế không tồn tại. Ví dụ, ``cỳ'', ``kông''~\ldots{} Tuy
3736 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
3737 sẽ được phát hiện và sửa chữa trong phần bắt lỗi non-word.
3738 %% Các quy
3739 %% luật phân bố âm tiết được sử dụng để giải quyết những trường hợp
3740 %% này. Cụ thể ba luật sau được sử dụng:
3741 %% \begin{itemize}
3742 %% \item Âm cuối i chỉ đứng trước các âm ``ư, ươ, ơ, â, a, ă, u, uô, ô,
3743 %% o''.
3744 %% \item Âm cuối u chỉ đứng trước các âm ``i, iê, ê, e, ư, ươ, ơ, â, a,
3745 %% ă''.
3746 %% \item Âm đệm không đứng trước các âm ``u, uô, ô, o''.
3747 %% \end{itemize}
3750 \subsection{Hoàn chỉnh lưới từ}
3751 \label{sec:lattice:competion}
3753 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
3754 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
3755 ở từ cuối cùng trong câu. Nói cách khác, phải đảm bảo luôn tìm được
3756 đườ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.
3757 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 đồ
3758 thị không còn liên thông. Bước này thêm vào các đỉnh để bảo đảm đồ thị
3759 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,
3760 thêm vào các đỉnh (mã ``UNK'') để đảm bảo tính liên thông.
3762 \subsection{Áp dụng mô hình ngôn ngữ --- Tách từ}
3764 %\section{Tách từ}
3765 \label{sec:language-model}
3767 Phần này sử dụng mô hình ngôn ngữ ngram để đánh giá các cách tách từ,
3768 từ đó đưa ra cách tách từ tốt nhất. Dựa theo cấu trúc lưới từ, một
3769 cách tách từ chính là đường đi từ nút head đến nút tail. Ta có thể
3770 tiến hành việc lượng giá bằng cách duyệt đồ thị theo chiều sâu, tìm
3771 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ẽ
3772 được áp dụng để tính giá trị của cách tách từ đó.
3774 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
3775 thường (không tách từ mờ), số phân nhánh trong đồ thị không nhiều, mô
3776 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
3777 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
3778 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ả
3779 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
3780 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
3781 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
3782 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
3783 gọi trì hoãn việc phê chuẩn Hiệp định Thương mại song phương với Việt
3784 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
3785 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
3786 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
3787 tách từ khác nhau ($842851528992620544 \approx 842\cdot 10^{15}$ nếu tách từ mờ), dẫn đến
3788 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ế.
3790 Thật ra, đối với bài toán tách từ thông thường, ta có thể phân tách
3791 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
3792 không nhập nhằng trong tách từ. Những từ như thế được biểu diễn trên
3793 lưới từ là những điểm thắt nút. Nhờ những điểm này, ta có thể tách
3794 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
3795 tùy thuộc vào loại mô hình ngôn ngữ được áp dụng. Với mô hình unigram,
3796 có thể áp dụng cách này. Với mô hình bigram hoặc cao hơn, ta cần tìm
3797 những nút có điều kiện khắt khe hơn. Cụ thể với bigram, ta cần tìm ra
3798 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
3799 bigram hay trigram, để có được mô hình ngôn ngữ hiệu quả hơn, sẽ làm
3800 giảm đi số phân đoạn trong câu, làm tăng thời gian xử lý.
3802 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
3803 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ó
3804 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
3805 trên coi nhưng không thể phát huy tác dụng.
3807 Cải tiến trên dùng nguyên tắc quy hoạch động để cải tiến. Điều đó dẫn
3808 đến suy nghĩ tại sao không tận dụng quy hoạch động triệt để hơn? Thật
3809 sự, ta có thể áp dụng thuật toán Viterbi để giải quyết bài toán
3810 này. Thuật toán Viterbi đã được áp dụng thành công trong những bài
3811 toán tìm kiếm tương tự trong lĩnh vực nhận dạng tiếng nói.
3813 Thuật toán Viterbi có thể hoạt động, nhưng không tận dụng triệt để ưu
3814 điểm của lưới từ. Do mô hình ngôn ngữ được sử dụng là ngram, ta sẽ
3815 dùng mô hình bigram. Do mỗi nút đại diện cho một từ, cạnh nối giữa hai
3816 từ có thể đại diện cho xác suất bigram $logP(w_2|w_1)$, việc tính mô
3817 hình ngôn ngữ cho một cách tách từ:
3818 \begin{align*}
3819 P(w_1\ldots w_n)&= P(w_1|head)\prod_{i=2}^nP(w_i|w_{i-1})P(tail|w_n)\\
3820 logP(w_1\ldots w_n)&= log(P(w_1|head)\prod_{i=2}^nP(w_i|w_{i-1})P(tail|w_n)\\
3821 &=P(w_1|head)+\sum_{i=2}^nP(w_i|w_{i-1})+P(tail|w_n)
3822 \end{align*}
3824 Với cách tính này, việc tính $logP(w_1\ldots w_n)$ tương đương với giá
3825 trị đường đi từ head đến tail (cạnh head đến nút của từ đầu tiên là
3826 $P(w_1|head)$, còn cạnh từ nút của từ cuối cùng đến tail là
3827 $P(tail|w_n)$). Việc tính $maxP$ tương đương với $minlogP$, cũng là
3828 tìm đướng đi ngắn nhất từ head đến tail. Bài toán cuối cùng quy về bài
3829 toán tìm đường đi ngắn nhất trong đồ thị có hướng, có trọng số.
3831 Thuật toán tìm đường đi ngắn nhất được dùng ở đây là thuật toán tìm
3832 kiếm theo độ ưu tiên PFS\footnote{Priority-First Search --- PFS} để tìm
3833 đường đi ngắn nhất trên đồ thị. Khoảng cách giữa hai
3834 điểm trong đồ thị là xác suất bigram của hai từ. Bài toán tìm đường
3835 đi ngắn nhất, có thể áp dụng PFS, Prime, Djisktra. PFS được chọn vì
3836 lưới từ, qua khảo sát, có thể được coi là một đồ thị thưa.
3838 Cách trên được áp dụng cho bigram, không thể áp dụng cho trigram do
3839 giả định dùng trọng số của cạnh là xác suất bigram, bigram là xác suất
3840 giữa hai từ liên tiếp, trong khi trigram là xác suất giữa ba từ liên
3841 tiếp. Để áp dụng trigram thay vì bigram, ta sẽ sử dụng lưới~2-từ. Sau
3842 đó áp dụng thuật toán PFS cho đồ thị mới vì mỗi nút trong lưới~2-từ
3843 thực chất bao gồm 3 từ liên tiếp nhau.
3845 Cách làm này không thể thực hiện với ngram ($n > 3$) vì khi đó số
3846 nút/cạnh trong đồ thị sẽ tăng đáng kể. Ngoài ra, PFS cũng không áp
3847 dụng được trong trường hợp sử dụng những độ đo như đo số lỗi sai đã
3848 xảy ra~\ldots{} Trong trường hợp đó ta nên sử dụng thuật toán
3849 Viterbi.
3851 %% XXXX. Nếu WFST cộng viterbi, beam pruning \ldots{} thì sao nhỉ?
3853 \subsection{Tìm lỗi chính tả}
3854 \label{sec:realword:spelling-checking}
3856 Sau khi tách từ xong, việc bắt lỗi chính tả cũng giống như phần bắt
3857 lỗi chính tả non-word~(\ref{sec:nonword:spelling-checking}).
3859 \subsection{Lập danh sách từ đề nghị}
3860 \label{sec:realword:candidate-list}
3862 Việc lập danh sách từ đề nghị tương tự như lập danh sách từ đề nghị
3863 khi bắt lỗi non-word~(\ref{sec:nonword:candidate-list}). Tuy nhiên, ta
3864 sẽ sử dụng từ điển thay vì dùng từ điển tiếng.
3866 Việc phục hồi lỗi trong bước này là không cần thiết vì đã được thực
3867 hiện trong phần tách từ.
3869 %% Do tiếng Việt đọc sao ghi vậy,
3870 %% nên bước chuyển từ từ sang âm có thể bỏ qua. Bước còn lại là áp dụng
3871 %% thuật toán đo độ hiệu chỉnh giữa hai từ như đã nêu trong~\ref{algo:ed}
3872 %% Ta có thể so sánh từng ký tự, hoặc so sánh theo âm (ví dụ, ``th'' thay
3873 %% vì ``t'' và ``h'').
3875 %% Chương trình sẽ liệt kê XXXX (chọn theo tiêu chí nào?, 10 từ lớn nhất
3876 %% hay sao đây)
3878 %% XXXX. thuật toán tính ed.
3882 \subsection{Sắp xếp danh sách từ đề nghị}
3883 \label{sec:realword:sort-candidates}
3885 Trong phần tách từ, ta đã xác định được cách tách từ đúng nhất nhờ áp
3886 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
3887 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
3888 ranh giới từ chỉ là hiệu ứng phụ. Do đã chọn được câu hợp lý nhất nên
3889 từ đúng nhất chính là từ nằm trong câu được chọn này. Do đó, từ nằm
3890 trên câu được chọn cần được ưu tiên sắp ở đầu danh sách từ đề
3891 nghị. Những từ còn lại có thể được sắp xếp như trong
3892 phần~\ref{sec:nonword:sort-candidates}.
3894 \section{Huấn luyện}
3895 \label{sec:training}
3897 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
3898 từ, mô hình ngôn ngữ bigram, trigram~\ldots nên ta cần phải thu thập
3899 các tham số này. Đối với tiếng Anh, việc này tương đối dễ dàng. Tuy
3900 nhiên, do không thể xác định ranh giới từ tiếng Việt, ta cần phải sử
3901 dụng một bộ tách từ trước khi huấn luyện.
3903 Đối với tiếng Việt, đã có một số nghiên cứu về tách từ tiếng Việt,
3904 tiêu biểu là~\cite{Tachtu}. Chương trình này không sử dụng bộ tách từ
3905 hiện có vì các lý do sau:
3906 \begin{itemize}
3907 \item Bộ tách từ trong~\cite{Tachtu} sử dụng unigram. Trên lý thuyết,
3908 bigram/trigram tốt hơn unigram do chứa đựng thông tin về ngữ cảnh.
3909 \item Do bộ tách từ thống kê thường phụ thuộc vào ngữ liệu, nếu sử
3910 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
3911 cho trình bắt lỗi chính tả, kết quả sẽ không như mong đợi.
3912 \item Cách tách từ được đề nghị tạo ra mô hình ngôn ngữ tốt hơn so với
3913 cách sử dụng bộ tách từ rồi thống kê trên đó (sẽ giải thích chi tiết
3914 bên dưới)
3915 \end{itemize}
3917 \subsection{Huấn luyện mô hình ngôn ngữ}
3919 Như đã nói, tính toán mô hình ngôn ngữ cần phải tách từ. Trong phần
3920 bắt lỗi real-word, ta đã thực hiện được phần tách từ mờ. Do dữ liệu
3921 huấn luyện được xem là chính xác nên chỉ cần tách từ bình thường. Do
3922 đó ta sẽ bỏ qua phần Tạo lưới từ mở rộng, giữ nguyên lưới từ cơ
3923 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
3924 tiền xử lý, theo sau là các bước Tạo lưới từ và Tách từ. Trong phần
3925 tách từ, ta chỉ cần dùng PFS thay vì Bellman-Ford vì lưới từ không có
3926 trọng số âm.
3928 %% Tiền xử lý giống như phần~\ref{sub:preprocess}
3929 %% Tạo Lưới từ giống như phần~\ref{sub:lattice}, nhưng chỉ xét những từ nào thực sự
3930 %% có trong câu, sử dụng lưới từ thay vì lưới từ mở rộng.
3932 Nếu dùng PFS để tách từ, ta chỉ có 1 cách tách từ tốt nhất. Việc đếm
3933 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ộ
3934 tách từ rời, trừ việc áp dụng bigram/trigram thay cho unigram. Đối với
3935 đồ thị có trọng số âm, thuật toán Bellman-Ford sẽ được sử dụng thay
3936 cho PFS.
3938 Thay vì chỉ sử dụng một cách tách từ, ta có thể thống kê trên nhiều
3939 cách tách từ của cùng một câu. Cách này phản ánh
3940 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
3941 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ỉ
3942 dùng cách tách từ tốt nhất sẽ chỉ tính những từ trong cách tách từ
3943 đầu, với giá trị mỗi từ là 1,0.
3944 %Cách tính này ``dồn phiếu'' của 2 cách sau cho cách đầu.
3945 Trường hợp sau, các từ trong cách 23 vẫn được
3946 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
3947 từ chứa từ đó. Trở lại ví dụ cũ, các từ trong cách một sẽ được cộng thêm
3948 0,5 thay vì 1. Ngoài ra các từ trong cách 23 lần lượt được cộng
3949 0,40,1. Dễ thấy, các từ trong cách tách từ thấp sẽ không tăng số
3950 đếm đáng kể, do đó không thể gây ảnh hưởng lớn đến quyết định tách
3951 từ.
3952 Cách cộng dồn số như vậy được gọi là ``fractional count'' (hay
3953 trong~\cite{softcount} gọi là ``soft-count''). Do bộ tách từ rời chỉ
3954 trả về cách tách từ tốt nhất, nên ta không thể áp dụng fractional
3955 count dựa trên bộ tách từ rời. Đó là một trong những lý do không sử
3956 dụng bộ tách từ rời.
3958 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ó
3959 thể dùng WFST
3960 % hoặc dùng thuật toán trong~\cite{softcount} (tạm gọi là thuật toán
3961 % ``soft-count'')
3962 để tách
3963 từ. WFST phải dùng kèm với beam pruning để tránh bùng nổ số tổ hợp các
3964 cách tách từ. Sau khi dùng WFST, ta còn n cách tách từ tốt nhất, được
3965 dùng để đếm fractional count.
3968 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ó
3969 thể. \cite{softcount}~đưa ra một giải pháp (tạm gọi là thuật toán
3970 ``soft-count'') áp dụng quy hoạch động để giải quyết vấn đề này.
3971 Soft-count thực tế không kết xuất ra một cách tách từ cụ thể nào (và
3972 do vậy nên
3973 cũng không thể áp dụng để tìm cách tách từ tốt nhất được!). Thuật toán
3974 đế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
3975 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
3976 cho là từ. Điểm này, vừa là điểm mạnh vì không cần dùng từ
3977 đ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
3978 cách đáng kể (khoảng 20\%, như kết quả trong~\cite{softcount}).
3981 \subsubsection{Thuật toán Soft-count}
3983 Cho một cây dài $n$ chữ. Có $2^{n-1}$ cách để tách câu. Giả sử chúng
3984 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
3985 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
3986 từ đó. Ví dụ, với cách tách từ có xác suất $p_i$, ta tăng số đếm cho
3987 mỗi từ trong cách tách từ đó một khoảng
3988 $\frac{p_i}{\sum_{j=1}^{2^{n-1}}p_j}$. Cách đếm từ kiểu
3989 này được gọi là ``soft-count'' vì mọi cách tác từ đều được đếm.
3991 Câu cho trước bao gồm các chữ $C_1C_2C_3\ldots C_n$. Mỗi từ
3992 $C_{j_1}\ldots C_{j_2}$ trong câu sẽ được tăng một khoảng
3993 $\frac{S_{j_1}^{left}p(C_{j_1}\ldots
3994 C_{j_2})S_{j_2}^{right}}{\alpha}$, trong đó
3995 \begin{itemize}
3996 \item $S_{j_1}^{left}$ là tổng xác suất mọi cách tách từ có thể có của
3997 chuỗi con từ đầu câu đến $C_{j_1}$.
3998 \item $p(C_{j_1}\ldots C_{j_2})$ là xác suất của cách tách từ
3999 $C_{j_1}\ldots C_{j_2}$ hiện có.
4000 \item $\alpha$ là hằng số chuẩn hoá, bằng tổng xác suất mọi cách tách
4001 từ của câu --- $S_{n+1}^{left}$.
4002 \end{itemize}
4004 $S_{j_1}^{left}$ và $S_{j_2}^{right}$ được tính bằng quy hoạch động.
4006 \begin{align*}
4007 S_i^{left} &= \left\{
4008 \begin{array}{ll}
4009 1&i=1\\
4010 p(C_1)&i=2\\
4011 \sum_{j=1}^{i-1}p(C_j\ldots C_{i-1})S_j^{left}&2<i\le n+1
4012 \end{array}
4013 \right.\\
4014 S_i^{right} &= \left\{
4015 \begin{array}{ll}
4016 1& i=n\\
4017 p(C_n)& i=n-1\\
4018 \sum_{j=i+1}^{n}p(C_{i+1}\ldots C_j)S_j^{right}&1\le i<n-1
4019 \end{array}
4020 \right.
4021 \end{align*}
4023 $S_i^{left}$ được tính lần lượt với $i=1,2,\ldots,n+1$ từ trái sang
4024 phải. Sau khi kết thúc, ta được $\alpha=S_{n+1}^{left}$. Sau đó tính
4025 $S_i^{right}$ với $i=n,n-1,\ldots,3,2,1$ từ phải sang trái, vừa tính
4026 $S_i^{right}$ vừa đếm từ.
4028 Độ phức tạp của thuật toán là $O(kIN)$ với $k$ là độ dài tối đa của
4029 từ, $I$ là số lần duyệt (khoảng $5-10$ lần) và $N$ là kích thước ngữ
4030 liệu.
4032 \subsubsection{Thuật toán Soft-count áp dụng trên bigram}
4034 Như đã nói, thuật toán Soft-count có hai hạn chế là không dùng từ
4035 điển, và tính toán dựa trên unigram. Thuật toán cải tiến được đưa ra
4036 để khắc phục hai hạn chế này.
4039 \paragraph{Sử dụng từ điển và lưới từ}
4041 Với hạn chế không dùng từ điển, khắc phục hạn chế này khá đơn
4042 giản. Với xác suất $P(C_i\ldots C_j)$, nếu từ $C_i\ldots C_j$ không
4043 tồn tại, ta cho xác suất này về $0$. Tuy nhiên, thuật toán sẽ được
4044 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
4045 chuỗi con rồi lại xét xem chuỗi con đó có phải là một từ hay không.
4047 Cho lưới từ của câu $S$. Gọi $L(W)$ là tập những từ nối đến nút
4048 $W$. Tương tự, $R(W)$ là tập những từ được nối đến từ nút $W$.
4049 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
4050 $W$ là:
4051 $$P(W)=P^{left}(W)p(W)P^{right}(W)$$
4053 Trong đó:
4054 \begin{itemize}
4055 \item $P^{left}(W)$ là tổng xác suất các cách tách từ tính từ đầu câu
4056 đến $W$.
4057 \item $P^{right}(W)$ là tổng xác suất các cách tách từ tính từ $W$ đến
4058 hết câu.
4059 \end{itemize}
4062 P^{left}(W) = \left\{
4063 \begin{array}{ll}
4064 p(W)&\text{nếu W là nút head}\\
4065 \displaystyle\sum_{W' \in L(W)}p(W')P^{left}(W')&\text{ngược lại}\\
4066 \end{array}
4067 \right.
4070 Tương tự
4073 P^{right}(W) = \left\{
4074 \begin{array}{ll}
4075 p(W)&\text{nếu W là nút tail}\\
4076 \displaystyle\sum_{W' \in R(W)}p(W')P^{right}(W')&\text{ngược lại}\\
4077 \end{array}
4078 \right.
4081 \begin{algo}\caption{Tính $P^{left}$}
4082 \label{algo:sc1:pleft}
4083 \begin{enumerate}
4084 \item Đặt $P^{left}(head) = p(head)$
4085 \item Đặt $P^{left}(W) = 0$ với mọi $W$ còn lại.
4086 \item Duyệt lần lượt các nút $W$ theo thứ tự từ trái sang phải, tính
4087 theo vị trí bắt đầu của $W$ trong câu. Với $W' \in R(W)$
4088 cộng thêm $p(W)P^{left}(W)$ vào $P^{left}(W')$
4089 \end{enumerate}
4090 \end{algo}
4092 Thuật toán~\ref{algo:sc1:pleft} được dùng để tính $P^{left}$. Thuật
4093 toán tương tự được áp dụng để tính $P^{right}$. Sau khi tính được
4094 $P^{left}$ và $P^{right}$, ta có thể tính fractional
4095 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ừ,
4096 cộng thêm vào $\displaystyle\frac{P(W)}{P^{left}(tail)}$ cho từ
4097 $C$. Thực tế, ta sẽ lồng bước này vào trong thuật toán tính
4098 $P^{right}$, vì thuật toán cũng phải duyệt qua tất cả các từ~(thuật
4099 toán~\ref{algo:sc1:pright}).
4101 \begin{algo}\caption{Tính $P^{right}$}
4102 \label{algo:sc1:pright}
4103 \begin{enumerate}
4104 \item Đặt $P^{right}(tail) = p(tail)$
4105 \item Đặt $P^{right}(W) = 0$ với mọi nút còn lại.
4106 \item Duyệt tất cả các nút $W$ từ phải sang trái, tính theo vị trí kết
4107 thúc của $W$ trong câu.
4108 \begin{enumerate}
4109 \item Với $W' \in L(W)$, cộng thêm $p(W)P^{right}(W)$ vào
4110 $P^{right}(W')$
4111 \item Tính fractional count cho $W$ theo công thức
4112 $\displaystyle\frac{P^{left}(W)p(W)P^{right}(W)}{P^{left}(tail)}$
4113 \end{enumerate}
4114 \end{enumerate}
4115 \end{algo}
4117 \paragraph{Áp dụng bigram}
4119 Để áp dụng bigram thay vì
4120 unigram, giải pháp đầu tiên là sử dụng lưới~2-từ thay vì lưới từ. Với
4121 lưới~2-từ, mỗi nút tương đương hai từ liên tiếp nhau, do đó
4122 $P(C_i\ldots C_j)$ tương ứng với $P(W_k|W_{k-1})$ (với $W_k$ là từ thứ
4123 $k$). Tuy nhiên, để áp dụng với trigram, ta lại phải sử dụng
4124 lưới~3-từ. Điều này không hiệu quả vì lưới từ cấp càng cao càng
4125 to, xử lý kém hiệu quả.
4127 Ta có thể áp dụng trực tiếp lưới từ cơ bản cho thuật toán Soft-count
4128 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,
4129 thuật toán sẽ được thay đổi để tính toán các giá trị dựa trên cạnh.
4131 Thay vì vậy, thuật toán được hiệu chỉnh để áp dụng bigram với lưới từ
4132 thông thường. Thay vì dùng giá trị nút để tính, ta dùng giá trị cạnh
4133 để tính. $p(W)$ sẽ được thay bằng $p(W|W')$ với $W$ và $W'$ là hai từ
4134 kề nhau.
4136 $$P(W)=P^{left}(W)P^{right}(W)$$
4139 P^{left}(W) = \left\{
4140 \begin{array}{ll}
4141 p(W)&\text{nếu W là nút head}\\
4142 \displaystyle\sum_{W' \in L(W)}p(W/W')P^{left}(W')&\text{ngược lại}\\
4143 \end{array}
4144 \right.
4147 Tương tự
4150 P^{right}(W) = \left\{
4151 \begin{array}{ll}
4152 p(W)&\text{nếu W là nút tail}\\
4153 \displaystyle\sum_{W' \in R(W)}p(W'/W)P^{right}(W')&\text{ngược lại}\\
4154 \end{array}
4155 \right.
4158 $P(W)$ đại diện cho xác suất tất cả các cách tách từ đi qua nút
4159 $W$. Do ta huấn luyện bigram, nên cần xác suất $P(W/W')$ chứ không cần
4160 $P(W)$. Nếu $W$ và $W_{+1}$ chỉ có một cạnh, $P(W)$ cũng chính là
4161 $P(W/W_{+1})$. Nếu có nhiều hơn một cạnh, ta cần dùng cách khác để
4162 tính $P(W/W')$. Với thuật toán tính $P^{right}$ hiện có, ta cộng dồn
4163 $p(W/W')P^{right}$ vào cho $P^{right}(W)$. Vậy trong quá trình cộng
4164 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
4165 $P^{left}(W)$. Thuật toán~\ref{algo:sc2:pleft}
4166 và~\ref{algo:sc2:pright} là thuật toán cải tiến để tính $P^{left}$ và
4167 $P^{right}$.
4169 \begin{algo}\caption{Tính $P^{left}$ cho bigram}
4170 \label{algo:sc2:pleft}
4171 \begin{enumerate}
4172 \item Đặt $P^{left}(head) = p(head)$
4173 \item Đặt $P^{left}(W) = 0$ với mọi $W$ còn lại.
4174 \item Duyệt lần lượt các nút $W$ theo thứ tự từ trái sang phải, tính
4175 theo vị trí bắt đầu của $W$ trong câu.
4176 Với mỗi $W$ tìm được, cộng thêm $p(W'/W)P^{left}(W)$ vào $P^{left}(W')\quad
4177 W' \in R(W)$
4178 \end{enumerate}
4179 \end{algo}
4181 \begin{algo}\caption{Tính $P^{right}$ cho bigram}
4182 \label{algo:sc2:pright}
4183 \begin{enumerate}
4184 \item Đặt $P^{right}(tail) = p(tail)$
4185 \item Đặt $P^{right}(W) = 0$ với mọi nút còn lại.
4186 \item Duyệt tất cả các nút $W$ từ phải sang trái, tính theo vị trí kết
4187 thúc của $W$ trong câu. Với $W' \in L(W)$:
4188 \begin{enumerate}
4189 \item Cộng thêm $p(W/W')P^{right}(W)$ vào $P^{right}(W')$
4190 \item Tính fractional count cho $W'$ theo công thức
4191 $\displaystyle\frac{P^{left}(W')p(W/W')P^{right}(W)}{P^{left}(tail)}$
4192 \end{enumerate}
4193 \end{enumerate}
4194 \end{algo}
4197 \subsubsection{Thuật toán Soft-count mới để áp dụng trigram}
4199 Với cách tính áp dụng để tính Soft-count với bigram, ta chỉ cần dùng
4200 lưới~2-từ thay vì lưới từ để có thể áp dụng trigram (trong khi lẽ ra
4201 phải dùng lưới~3-từ để tính trigram, nếu dùng thuật toán gốc).
4203 %% \subsection{Tính ngram}
4205 %% Ngram được tính như thông thường. Sử dụng backoff chuẩn. Thư viện
4206 %% SRILM được dùng để tính ngram.
4209 %\section{Lỗi chính tả}
4211 % \note{Phân loại lỗi, nguyên nhân gây lỗi}
4215 \chapter{Cài đặt}
4216 \label{cha:implementation}
4217 \minitoc
4218 \tolerance=10000
4220 Chương trình được cài đặt bằng C++ trên nền Linux. Phần giao diện được
4221 cài đặt bằng Gtk+. Phần giao diện này chỉ mang tính chất minh
4222 hoạ. Trong thực tế, chương trình nên được tích hợp vào các bộ soạn
4223 thảo văn bản như Open Office, AbiWord~\ldots{} để có thể phát huy tác
4224 dụng. Ngoài ra chương trình sử dụng thư viện SRILM~\cite{XXX} để tính toán mô
4225 hình ngôn ngữ.
4227 Chương trình gồm hai phần: phần bắt lỗi chính tả và phần huấn
4228 luyện. Hai phần này sử dụng khá nhiều thành phần chung. Các
4229 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
4230 trình bắt lỗi chính tả và trình huấn luyện sẽ được trình bày riêng.
4233 \section{Cấu trúc dữ liệu}
4234 \label{sec:data-structure}
4236 \subsection{Lưu chuỗi}
4237 %\newcommand{\sym}[1]{\verb@#1@}
4238 Để 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
4239 lưu toàn bộ các token có thể có vào một mảng chung. Mọi token đều được
4240 tham chiếu bằng một con số, tạm gọi là \verb@strid@ (chính là số thứ tự
4241 token trong mảng). Ngoài ra một bảng băm được dùng để ánh xạ chuỗi
4242 sang strid. Cả hai cấu trúc dữ liệu này được cài đặt trong lớp
4243 \verb@StringArchive@. Chương trình chỉ sử dụng duy nhất một đối tượng
4244 thuộc lớp này, được truy cập thông qua hàm \verb@get_sarch()@. Toán tử
4245 \verb@[]@, được cài đặt để chuyển đổi từ strid sang chuỗi và ngược lại.
4247 Từ và tiếng đều được lưu trong StringArchive. Với từ, các khoảng trắng
4248 được thay thế bằng dấu gạch chân `\verb@_@' trước khi lưu. Ngoài ra từ
4249 cách nhau bởi nhiều khoảng trắng sẽ được gom lại thành một khoảng
4250 trắng. Ví dụ, từ ``\texttt{học sinh}'' sẽ được lưu trong StringArchive
4251 dạng ``\verb@học_sinh@''. Việc chuẩn hoá sẽ được tiến hành trên từng
4252 tiếng. Sau khi chuẩn hoá, từ sẽ thành ``\verb@5hoc_0sinh@''.
4254 \subsection{Từ điển}
4256 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
4257 bộ nhớ, từ điển sử dụng cây đa nhánh (lớp \verb@WordNode@). Trong lớp
4258 \verb@WordNode@, \verb@nodes@ sẽ chứa con trỏ đến các nút kế tiếp. Duyệt
4259 từ nút gốc (truy cập thông qua hàm \verb@get_root()@) cho đến hết, ta
4260 sẽ được danh sách tiếng hình thành từ. Với mỗi nút, ngoài việc chứa
4261 liên kết trỏ đến các nút con, còn có một số thông tin về từ (đối với
4262 những nút lá) bao gồm xác suất unigram của từ đó, strid của từ~\ldots
4264 Một số hàm thường dùng bao gồm:
4265 \begin{itemize}
4266 \item \verb@get_syllable()@: Strid của tiếng của nút hiện tại.
4267 \item \verb@get_id()@: Strid của từ.
4268 \item \verb@get_prob()@: Lấy xác suất unigram của từ.
4269 \item \verb@get_syllables()@: Danh sách strid của các tiếng hình thành
4270 nên từ.
4271 \item \verb@get_syllable_count()@: Số strid hình thành nên từ.
4272 \item \verb@get_next()@: Trả về nút con với strid cho trước.
4273 \item \verb@fuzzy_get_next()@: Trả về danh sách nút con gần giống với
4274 strid cho trước. Hàm này có thể sẽ được cài đặt để áp dụng so sánh
4275 mờ.
4276 \item \verb@load()@: Xây dựng cây từ điển từ tập tin.
4277 \item \verb@save()@: Lưu cây từ điển vào tập tin.
4278 \end{itemize}
4280 Lớp \verb@WordNode@ cài đặt hàm \verb@fuzzy_get_next()@ hoàn toàn giống
4281 với \verb@get_next()@. Để có thể so sánh mờ, ta sử dụng lớp
4282 \verb@FuzzyWordNode@ kế thừa từ \verb@WordNode@. Lớp này bao gồm hàm
4283 \verb@fuzzy_get_next_with_syllable()@ dùng để trả về danh sách các từ có
4284 phát âm gần giống với từ cho trước, được dùng để cài đặt hàm \verb@fuzzy_get_next()@.
4286 Từ điển tiếng không được lưu trực tiếp vào tập tin mà sẽ được phát
4287 sinh tự động khi nạp từ điển từ. Thực ra, hàm \verb@WordNode::load()@
4288 khi được gọi sẽ lưu các tiếng vào \verb@StringArchive@, đồng thời đánh
4289 dấu tiếng đó thuộc từ điển tiếng. Sau đó, ta có thể xác định một chữ
4290 có phải thuộc về từ điển tiếng hay không nhờ hàm
4291 \verb@StringArchive::in_dict()@.
4293 Từ điển từ còn chứa một số ``từ'' đặc biệt, được lấy thông qua hàm
4294 \verb@get_id()@. Những từ này bao gồm:
4295 \begin{itemize}
4296 \item $UNK\_ID$ đại diện cho từ lạ, không biết.
4297 \item $PUNCT\_ID$ đại diện cho các dấu câu.
4298 \item $PROPER\_NAME\_ID$ đại diện cho tên riêng.
4299 \item $START\_ID$ đại diện cho đầu câu. Mỗi đầu câu đều có một ``từ''
4300 này (tương đương nút ``head'').
4301 \item $STOP\_ID$ đại diện cho cuối câu. Mỗi cuối câu đều có một ``từ''
4302 này (tương đương nút ``tail'').
4303 \item $POEM\_ID$ đại diện cho từ láy.
4304 \item $NUMBER\_ID$ đại diện cho các loại số.
4305 \end{itemize}
4307 \subsection{Câu}
4309 Mỗi câu bao gồm danh sách strid của các token, kèm theo vị trí chuỗi
4310 con của token đó trong câu thật sự. Lớp \verb@Sentence@ bao gồm một
4311 mảng các đối tượng \verb@Sentence::Syllable@ (biến \verb@syllables@) đại diện cho các
4312 tiếng. Mỗi đối tượng \verb@Sentence::Syllable@ bao gồm vị trí bắt đầu
4313 của tiếng trong câu \verb@start@, mã strid của tiếng đó \verb@id@ và
4314 mã strid dùng để so sánh \verb@cid@.
4316 Các hàm thường dùng:
4317 \begin{itemize}
4318 \item \verb@set()@: đặt chuỗi đại diện cho câu cho đối tượng
4319 \verb@Sentence@.
4320 \item \verb@tokenize()@: tách câu dựa trên chuỗi đã đặt.
4321 \item \verb@get_syllable_count()@: trả về số tiếng trong câu.
4322 \item \verb@operator[]@: Truy cập các tiếng trong câu.
4323 \end{itemize}
4325 Chuỗi các câu sẽ được hàm \verb@sentences_split()@ tách thành những
4326 chuỗi con, đại diện cho các câu. Các chuỗi con này sẽ được chuyển cho
4327 \verb@Sentence@ để phân tích thành từng tiếng.
4329 \subsection{Lưới từ}
4331 Lưới từ bao gồm lưới từ dạng thô \verb@Lattice@ và lưới từ \verb@DAG@.
4333 Lưới từ thô \verb@Lattice@ không có nút head và tail, cũng không có các
4334 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
4335 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,
4336 ta sử dụng thông tin về vị trí bắt đầu của từ và độ dài của từ để suy
4337 ra vị trí bắt đầu của từ kế tiếp, sau đó lấy danh sách của những từ
4338 bắt đầu tại vị trí của từ kế tiếp.
4340 Tất cả các từ của lưới từ được lưu vào danh sách chung (biến
4341 \verb@Lattice::we@ kiểu \verb@WordEntries@), chứa đựng toàn bộ thông tin
4342 liên quan đến một từ. Các từ được tham chiếu bằng số thứ tự của từ
4343 trong WordEntries --- tạm gọi là WordID. Mỗi từ được lưu trong cấu
4344 trúc \verb@WordEntry@. Cấu trúc này bao gồm:
4345 \begin{itemize}
4346 \item \verb@len@: cho biết số tiếng của từ.
4347 \item \verb@fuzid@: mỗi bit trong biến này cho biết trạng thái fuzzy
4348 của tiếng tương ứng trong từ. Nếu bit là 1 nghĩa là tiếng đó được
4349 biến đổi, không phải là tiếng gốc.
4350 \item \verb@id@: WordID.
4351 \item \verb@node@: liên kết đến từ trong từ điển, dùng để lấy các
4352 thông tin chi tiết hơn về từ.
4353 \end{itemize}
4355 \verb@Lattice@ chứa một mảng các đối tượng \verb@WordInfos@. Mỗi đối
4356 tượng \verb@WordInfo@ tương đương với một vị trí tiếng trong
4357 câu. \verb@WordInfos@ cho ta biết danh sách các từ bắt đầu từ vị trí
4358 tiếng đó, danh sách các từ fuzzy tại tiếng đó, chiều dài từ không bị
4359 fuzzy.
4361 Các hàm thường dùng của \verb@Lattice@:
4362 \begin{itemize}
4363 \item \verb@construct()@: xây dựng \verb@Lattice@ từ \verb@Sentence@.
4364 \item \verb@pre_construct()@, \verb@post_construct()@: các hàm bên
4365 trong của \verb@construct()@, được sử dụng trực tiếp khi cần hiệu
4366 chỉnh lưới từ ngay trong quá trình xây dựng lưới từ (như phần phục
4367 hồi lỗi~\ldots)
4368 \item \verb@get_word_count()@: trả về số tiếng của câu.
4369 \item \verb@get_we()@: Lấy danh sách \verb@WordEntry@ của những từ bắt
4370 đầu tại vị trí tiếng cho trước.
4371 \end{itemize}
4373 Lưới từ \verb@DAG@ được dùng để tổng quát hoá các thuật toán hoạt động
4374 trên cả lưới từ và lưới~2-từ. So với \verb@Lattice@, lớp này giống một
4375 lưới từ hơn. Các hàm thường dùng trong \verb@DAG@ gồm:
4376 \begin{itemize}
4377 \item \verb@node_id()@ trả về strid của nút có mã id cho trước.
4378 \item \verb@node_begin()@ trả về id của nút head.
4379 \item \verb@node_end()@ trả về id của nút tail.
4380 \item \verb@node_count()@ trả về số nút trong lưới từ. Các nút sẽ được
4381 đánh số id từ 0 đến \verb@node_count()-1@.
4382 \item \verb@get_next()@ lấy danh sách các từ được nối với từ cho
4383 trước.
4384 \item \verb@edge_value()@ trả về giá trị cạnh, cho trước hai nút.
4385 \end{itemize}
4387 \verb@DAG@ là lớp cơ sở. Lớp dẫn xuất \verb@WordDAG@ hoạt động như
4388 lưới từ cơ bản, còn lớp \verb@WordDAG2@ hoặt động như lưới~2-từ.
4389 \verb@WordDAG2@ có thêm một số hàm mới:
4390 \begin{itemize}
4391 \item \verb@demangle()@ chuyển cách tách từ trong lưới~2-từ về lưới từ
4392 (về cơ bản là loại bỏ hai nút head/tail của lưới~2-từ).
4393 \item \verb@node_dag_edge()@ trả về giá trị hai nút con nằm trong nút
4394 của lưới~2-từ.
4395 \item \verb@get_dag()@ lấy lưới từ hình thành nên lưới~2-từ.
4396 \end{itemize}
4399 \subsection{Cách tách từ}
4401 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
4402 nên cách tách từ đó.
4404 \subsection{Mô hình ngôn ngữ}
4406 Mô hình ngôn ngữ được sử dụng là trigram. Mô hình ngôn ngữ được cài
4407 đặt trong thư viện SRILM. Mô hình ngôn ngữ được truy cập thông qua hàm
4408 \verb@get_ngram()@.
4410 \section{Tiền xử lý}
4413 \subsection{Tách token}
4414 \label{sub:preprocess:token}
4416 Chương trình sử dụng flex để tách token. Các quy tắc flex được áp dụng
4417 được liệt kê trong hình~\ref{fig:flex-token}.
4418 \begin{figure}[htbp]
4419 \centering
4420 \begin{verbatim}
4421 SENTENCE_FINAL [.?!]
4422 HYPHEN [\-]
4423 OPEN_SINGLE_QUOTE [\`]
4424 CLOSE_SINGLE_QUOTE [\']
4425 RIGHT_PAREN [\"\)\]\}\>\']
4427 LETTERS_AND_NUMBERS [a-zA-Z0-9]
4428 LETTERS_NUMBER_AND_THEN_SOME [a-zA-Z0-9]
4429 APOSTROPHE \'
4431 SINGLE_CHARACTER [a-zA-Z0-9]
4433 WHITE_SPACE [ \t\n]
4434 NEWLINE [\n]
4435 INVISIBLE [^\040-\176]
4437 {SENTENCE_FINAL}+{RIGHT_PAREN}* |
4438 {HYPHEN}+ |
4439 {OPEN_SINGLE_QUOTE}+ |
4440 {CLOSE_SINGLE_QUOTE}+ |
4441 {LETTERS_NUMBER_AND_THEN_SOME}+{LETTERS_AND_NUMBERS} |
4442 {LETTERS_AND_NUMBERS}+{APOSTROPHE} |
4444 {SINGLE_CHARACTER} { xuất từ }
4446 ({WHITE_SPACE}|{INVISIBLE}|{NEWLINE})+ { bỏ qua }
4447 \end{verbatim}
4449 \caption{Quy tắc tách token dùng flex}
4450 \label{fig:flex-token}
4451 \end{figure}
4454 \subsection{Tách câu}
4456 Trước hết, câu được tách thành token. Sau đó, các dấu ``\texttt{?!()[]:;.,}''
4457 sẽ được dùng để tách thành những đoạn nhỏ hơn --- những ``câu''. Hàm
4458 \verb@sentences_split()@ được dùng để thực hiện điều này.
4460 \section{Lưới từ}
4462 \subsection{Tạo lưới từ}
4463 \subsubsection{Tạo lưới từ Lattice}
4464 Lưới từ \verb@Lattice@ được tạo thông qua hàm
4465 \verb@Lattice::construct()@. Thực tế, \verb@construct()@ chỉ là vỏ bọc
4466 gọi đến ba hàm \verb@Lattice::pre_construct()@,
4467 \verb@mark_proper_name()@ và \verb@post_construct()@.
4469 \verb@pre_construct()@ thực hiện công đoạn đầu tiên để tạo lưới từ:
4470 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
4471 thuật toán tương tự Viterbi được sử dụng để tạo lưới từ. Chương trình
4472 lần lượt quét qua các vị trí tiếng, từ một đến hết. Ở mỗi vị trí,
4473 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
4474 hoàn chỉnh nếu được. Nếu từ hoàn chỉnh, từ sẽ được đưa vào danh sách
4475 (nhưng không bị xóa khỏi danh sách từ chưa hoàn chỉnh, vì có thể có
4476 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ẽ
4477 bị loại bỏ khỏi danh sách từ chưa hoàn chỉnh. Đồng thời các tiếng đó
4478 cũng được đưa vào danh sách từ chưa hoàn chỉnh như là những tiếng bắt
4479 đầu từ mới. Công việc được thực hiện cho đến khi quét hết chiều dài
4480 câu~(thuật toán~\ref{algo:pre_construct}). \verb@pre_construct()@ dựa
4481 vào hàm \verb@WordState::get_next()@ và \verb@WordState::get_first()@
4482 để thực hiện chuyển từ một state cũ ($states1$) sang state kế tiếp
4483 ($states2$). Mỗi lớp khác nhau dẫn xuất từ \verb@WordState@ sẽ có cách
4484 chuyển qua state mới khác nhau. Nhờ vậy ta có thể tiến hành thu thập
4485 từ theo nhiều cách khác nhau. Tất cả các lớp dẫn xuất từ
4486 \verb@WordState@ tham gia vào \verb@pre_construct()@ được lưu vào một
4487 danh sách \verb@WordStateFactories@ chuyển cho \verb@pre_construct()@
4488 nhờ đó \verb@pre_construct()@ biết cần phải sử dụng những lớp nào.
4490 \begin{algo}
4491 \caption{Lattice::pre\_construct()}
4492 \label{algo:pre_construct}
4493 \begin{enumerate}
4494 \item Xóa $states2$.
4495 \item Duyệt $i$ từ tiếng đầu tiên đến hết câu.
4496 \begin{enumerate}
4497 \item Thêm state mới (bắt đầu tại vị trí $i$) vào $states2$
4498 (\verb@WordStateFactory::create_new()@).
4499 \item Chuyển state cũ (trong $states1$) sang $states2$ mới (\verb@WordState::get_next()@).
4500 \item Duyệt tất cả các state trong $states2$, nếu tìm thấy từ hoàn
4501 chỉnh thì thêm vào danh sách \verb@WordEntry@ $we$.
4502 \item Hoán vị $states1$ và $states2$.
4503 \end{enumerate}
4504 \item Xóa $states1$. Trả về $we$.
4505 \end{enumerate}
4506 \end{algo}
4508 Cấu trúc \verb@WordState@ được dùng để lưu một từ chưa hoàn chỉnh
4509 trong danh sách các từ chưa hoàn chỉnh. Cấu trúc này bao gồm vị trí
4510 bắt đầu từ, mã \verb@fuzid@ của từ, và con trỏ đến nút của tiếng cuối cùng
4511 hiện thời của từ trong cây từ điển. Con trỏ này sẽ được chuyển cho
4512 \verb@WordNode::get_next()@ để tìm ra những tiếng kế tiếp giúp hình
4513 thành nên từ. Thành phần \verb@fuzid@ được cập nhật sau mỗi khi thêm
4514 tiếng mới vào từ, cho biết đó là tiếng chính xác trên câu, hay tiếng
4515 gần giống với tiếng trên câu (phát sinh nhờ so sánh mờ). Mỗi bit trong
4516 \verb@fuzid@ tượng trưng cho một tiếng trong từ.
4518 Hai lớp chính được dùng là lớp \verb@ExactWordState@ và lớp
4519 \verb@LowerWordState@. Lớp đầu chỉ thực hiện chuyển sang state kế nếu
4520 tiếng kế tiếp hoàn toàn trùng khớp với tiếng kế tiếp của từ. Lớp sau
4521 sẽ chuyển state nếu cách viết thường của tiếng kế tiếp giống với tiếng
4522 kế tiếp của từ. Lớp sau được dùng để không phân biệt chữ hoa/chữ
4523 thường khi tìm từ.
4525 Hàm \verb@post_construct()@ thực hiện nốt những gì còn lại để tạo nên
4526 lưới từ, bao gồm việc duyệt qua lưới từ, thêm các nút (như $UNK$)
4527 để bảo đảm đồ thị liên thông, đồng thời đưa danh sách toàn bộ các từ
4528 đã thu được vào lưới từ. Việc này được thực hiện bằng cách duyệt qua
4529 lưới từ, đánh dấu tất cả các tiếng được bao gồm trong các từ đã được
4530 tạo. Những tiếng chưa được đánh dấu là những tiếng không nằm trong bất
4531 cứ từ nào, do đó sẽ phá hủy tính liên thông của đồ thị. Trong trường
4532 hợp xấu nhất, ta sẽ tạo một từ $UNK$ chứa tiếng này.
4534 Lưới từ lưu danh sách từ trong mảng để đảm bảo hiệu suất, tuy nhiên
4535 kết quả trả về từ bước \verb@pre_construct()@
4536 lại là một tập hợp \verb@std::set@ chứ không phải một mảng. Mục đích
4537 của việc sử dụng tập hợp là để có thể truy xuất nhanh đến một phần từ
4538 trong lưới từ trong quá trình hiệu chỉnh lưới
4539 từ. \verb@post_construct()@ gọi hàm \verb@construct()@ (hàm override,
4540 không phải hàm \verb@construct()@ ban đầu) để điền các thông tin về
4541 \verb@WordInfos@ đảm bảo cho lưới từ có thể hoạt động.
4543 Sau khi hoàn tất tạo lưới từ, lưới từ xem như đã ổn định và sẽ không
4544 bao giờ thay đổi. Không một hiệu chỉnh nào được phép xảy ra sau khi đã
4545 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
4546 phần để tạo cơ hội can thiệp vào lưới từ ngay trong giai đoạn hình
4547 thành để có thể thêm các nút khác (phát sinh trong bước phục hồi
4548 lồi). Như đã nói, \verb@construct()@ gọi đến hàm
4549 \verb@mark_propername()@ hàm này tạo thêm những nút $PROP$ đại diện
4550 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
4551 cần thay đổi lưới từ nhiều hơn.
4553 \subsubsection{Tạo lưới từ DAG}
4555 Lưới từ \verb@DAG@ được hình thành dựa trên lưới từ \verb@Lattice@. Có
4556 thể coi đây là một vỏ bọc để dễ truy cập đến lưới từ, thêm vào những
4557 nút head, tail~\ldots{} cho hoàn chỉnh. Các hàm trong \verb@DAG@ chỉ
4558 là vỏ bọc cho các hàm của \verb@Lattice@. Hai nút giả head, tail được
4559 tạo ra và thêm vào lưới từ. Đó là trường hợp của lưới từ cơ bản
4560 \verb@WordDAG@.
4562 Với lưới~2-từ \verb@WordDAG2@, công việc phức tạp hơn. Thuật toán mở
4563 rộng lưới từ thành lưới~2-từ được cài đặt trong constructor của
4564 \verb@WordDAG2@. Do mỗi nút của \verb@WordDAG2@ bao gồm hai nút của
4565 lưới từ cơ bản, ta cần lưu trữ mã các nút này trong
4566 \verb@WordDAG2::Node@ (các biến \verb@n1@ và \verb@n2@). Ngoài ra còn
4567 có biến \verb@id@ là mã nút của lưới~2-từ. Tất cả các nút của
4568 lưới~2-từ được lưu trong biến thành phần \verb@WordDAG2::nodes@. Hàm
4569 \verb@WordDAG2::demange()@ được dùng để chuyển mã từ mã nút trong
4570 lưới~2-từ thành mã nút trong lưới từ \verb@WordDAG@.
4574 \subsection{Bổ sung lưới từ}
4576 Bổ sung lưới từ dựa theo lỗi phát âm được thực hiện ngay trong
4577 \verb@pre_construct()@ thông qua lớp \verb@FuzzyWordState@~(xem thêm
4578 phần~\ref{sec:impl:phonetic-error}).
4581 Lớp \verb@PenaltyDAG@ được dẫn xuất từ lớp \verb@DAG@. Lớp này điều
4582 chỉnh lại hàm \verb@DAG::edge_value()@ để thay đổi độ dài cạnh nhằm
4583 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
4584 tượng \verb@DAG@ khác, hoạt động như là một vỏ bọc cho đối tượng này.
4586 Lớp sử dụng thông tin \verb@WordEntry::fuzid@ để biết có bao nhiêu
4587 tiếng trong từ là tiếng phát sinh, sau đó giảm giá trị của cạnh theo
4588 một tỉ lệ tương ứng. Nếu có $n$ tiếng sai, giá trị cạnh sẽ bị mất đi
4589 một khoảng $nwV$
4590 với $V$ là giá trị ban đầu, $w$ là trọng số.
4592 Các hàm mới trong \verb@PenaltyDAG@:
4593 \begin{itemize}
4594 \item \verb@PenaltyDAG::set_weight()@: Đặt trọng số $w$ cho đối tượng.
4595 \item \verb@PenaltyDAG::get_weight()@: Lấy trọng số $w$ của đối tượng.
4596 \end{itemize}
4598 Giá trị $w$ được sử dụng trong chương trình minh hoạ là $0.05$.
4601 \subsection{Tìm cách tách từ tốt nhất}
4604 Thuật toán~\ref{algo:pfs} trình bày cài đặt PFS.
4605 Thuật toán~\ref{algo:bellman} trình bày cài đặt Bellman-Ford kèm chuẩn hoá.
4608 \begin{algo}
4609 \caption{Thuật toán tìm đường PFS}
4610 \label{algo:pfs}
4611 \begin{align*}
4612 last[head] &\leftarrow head\\
4613 val[head] &\leftarrow 0\\
4614 seen[head] &\leftarrow true\\
4615 candidates &\leftarrow \{ head \} (\text{candidates là một heap})
4616 \end{align*}
4618 \begin{enumerate}
4619 \item Nếu $candidates$ rỗng thì kết thúc thuật toán.
4620 \item Lấy một đỉnh $v$ ra khỏi $candidates$. $next\_nodes$ là tập điểm
4621 nối từ $v$ đến.
4622 \item Duyệt từng đỉnh $vv$ trong $next\_nodes$.
4623 \begin{enumerate}
4624 \item Nếu $seen[vv]$ là $false$.
4625 \begin{enumerate}
4626 \item Thêm $vv$ vào $candidates$.
4627 \item $seen[vv] \leftarrow true$
4628 \item $val[vv] \leftarrow val[v]+edge\_value(v,vv)$
4629 \item $last[vv] = v$
4630 \end{enumerate}
4631 \item Nếu $seen[vv]$ là $true$ và $val[vv] > val[v]+edge\_value(v,vv)$
4632 \begin{enumerate}
4633 \item $val[vv] \leftarrow val[v]+edge\_value(v,vv)$
4634 \item $last[vv] \leftarrow v$
4635 \item Sắp xếp lại $candidates$.
4636 \end{enumerate}
4637 \end{enumerate}
4638 \item Về bước 1.
4639 \end{enumerate}
4641 Lấy danh sách các nút.
4642 \begin{enumerate}
4643 \item $v \leftarrow tail$.
4644 \item Lưu $v$.
4645 \item $v \leftarrow last[v]$
4646 \item Nếu $v \ne last[v]$, lặp lại bước 2.
4647 \item Lưu $v$.
4648 \item Đảo ngược danh sách các nút đã lưu.
4649 \end{enumerate}
4650 \end{algo}
4653 \begin{algo}
4654 \caption{Thuật toán tìm đường Bellman-Ford kèm chuẩn hoá}
4655 \label{algo:bellman}
4656 \begin{align*}
4657 last[head] &\leftarrow head\\
4658 length[head] &\leftarrow 0\\
4659 node\_count[head] &\leftarrow 1\\
4660 nexts &\leftarrow \{head\}
4661 \end{align*}
4662 Lập danh sách cạnh.
4663 \begin{enumerate}
4664 \item $i \leftarrow 0$.
4665 \item $l \leftarrow size\_of(nexts)$
4666 \item Nếu $i >= l$, dừng.
4667 \item $v \leftarrow nexts[i]$. $i \leftarrow i+1$
4668 \item Nếu $done[v]$ là $true$ thì quay về bước 2. Nếu không thì
4669 $done[v] \leftarrow true$
4670 \item Thêm các nút kề $v$ vào phía sau $nexts$.
4671 \item Lặp $ii = l\ldots size\_of(nexts)$, thêm các cạnh
4672 $(v,nexts[ii])$ vào $edges$
4673 \item Quay về 2.
4674 \end{enumerate}
4675 Tìm đường
4676 \begin{enumerate}
4677 \item $cont \leftarrow true$. Duyệt lần lượt từ $0$ đến $n-1$ với điều kiện
4678 $cont$ vẫn còn là $true$.
4679 \item $cont \leftarrow false$. Duyệt lần lượt các cạnh trong $edges$, đặt đỉnh đầu, đỉnh cuối
4680 lần lượt là $i$ và $v$, bỏ qua các cạnh có $node\_count[i] = 0$.
4681 \item Nếu $node\_count[v] \ne 0$ và $length[v] > length[i] +
4682 \frac{edge\_value(i,v)-length[i]}{node\_count[i]+1}$
4683 \begin{enumerate}
4684 \item $length[v] \leftarrow length[i] +
4685 \frac{edge\_value(i,v)-length[i]}{node\_count[i]+1}$
4686 \item $last[v] \leftarrow i$
4687 \item $node\_count[v] \leftarrow node\_count[i]+1$
4688 \item $cont \leftarrow true$
4689 \end{enumerate}
4690 \end{enumerate}
4691 Lấy danh sách các nút tương tự như thuật toán~\ref{algo:pfs}.
4692 \end{algo}
4694 \subsection{Lỗi phát âm}
4695 \label{sec:impl:phonetic-error}
4696 \subsubsection{Phân tích cấu trúc âm tiết}
4698 Lớp \verb@Syllable@ được dùng để phân tích cú pháp âm tiết. Năm thành
4699 phần của âm tiết (âm đầu, âm đệm, âm chính, âm cuối, thanh điệu) được
4700 lưu trong mảng \verb@components@. Hàm \verb@Syllable::parse()@ nhận
4701 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
4702 tin vào \verb@Syllable::components@.
4704 \subsubsection{Tìm các tiếng tương tự cách phát âm}
4706 Việc tìm các tiếng tương tự cách phát âm được cài đặt trong lớp
4707 \verb@Syllable@ và hàm
4708 \verb@FuzzyWordState::get_next()@. Lớp
4709 \verb@Syllable@ sẽ thực hiện các thao tác cơ bản liên quan đến âm
4710 tiết, bao gồm hai hàm \verb@match@ và \verb@apply@.
4712 \verb@Syllable::match@ so sánh âm tiết với một mẫu âm tiết. Một mẫu
4713 â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
4714 những giá trị được phép đối với thành phần đó. Các thành phần có thể
4715 cho phép một giá trị, hoặc không quan tâm đến giá trị của nó, hoặc
4716 không được tồn tại thành phần đó, hoặc phải có thành phần đó. Các
4717 thành phần được liệt kê lần lượt theo thứ tự: âm đầu, âm đệm, âm
4718 chính, âm cuối, thanh điệu. Ví dụ, \verb@[?,?,a,i,?]@ sẽ
4719 khớp với bất cứ âm tiết nào có âm chính là `a' và âm cuối là
4720 `i'. \verb@[?,?,?,?,Hook]@ sẽ khớp với bất cứ âm nào dùng
4721 thanh hỏi.
4723 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
4724 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
4725 \verb@[?,?,ư,t,?]@ và \verb@[?,?,ư,c,?]@ thể
4726 hiện sự nhập nhằng giữa những âm tiết ``ưc'' và ``ưt''. Tập nhập nhằng
4727 có kiểu là \verb@confusion_set@. Tất cả các tập nhập nhằng được lưu
4728 vào một mảng, được truy cập thông qua hàm \verb@get_confusion_sets()@.
4730 Hàm \verb@Syllable::apply()@ dùng để áp mẫu vào âm tiết đã có. Các
4731 thành phần tường minh trong mẫu sẽ ghi đè các thành phần tương ứng
4732 trong âm tiết. Nhưng thành phần quy định không tồn tại trong mẫu sẽ bị
4733 loại bỏ khỏi âm tiết. Những thành phần không được quy định trong mẫu
4734 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
4735 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ó
4736 của thành phần đó.
4738 Sử dụng hai hàm trên, hàm
4739 \verb@FuzzyWordState::get_next()@ làm phần việc còn
4740 lại là gắn kết \verb@match()@, \verb@apply()@ và tập nhầm lẫn để tìm
4741 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
4742 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
4743 tiết trong tập nhầm lẫn (\verb@match()@), các âm tiết còn lại của tập
4744 nhầm lẫn sẽ được áp vào âm tiết đang xét (\verb@apply()@) để tạo ra
4745 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
4746 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ẽ
4747 dừng lại khi không có âm tiết mới nào được phát sinh. Sau đó, các âm
4748 tiết sẽ được so sánh với từ điển tiếng để lọc bỏ những âm tiết không
4749 đúng.
4751 \subsection{Danh từ riêng}
4753 Một danh sách 8000 tên riêng được sử dụng để tạo một tập các chữ
4754 thường hình thành tên riêng.
4755 Những chữ liên tiếp nhau nằm trong danh sách này được coi là một tên
4756 riêng. Hàm \verb@mark_proper_name()@ bổ sung những nút $PROP$ vào lưới
4757 từ cho những tên riêng được tìm ra.
4759 \subsection{Lỗi bàn phím}
4761 Lỗi bàn phím được cài đặt thông qua các lớp \verb@KeyRecover@,
4762 \verb@CharInserter@, \verb@CharEraser@, \verb@CharTransposer@ và
4763 hàm \verb@im_recover()@.
4765 Lớp \verb@KeyRecover@, cũng như các lớp Char\ldots{} khác, bao gồm ba hàm:
4766 \begin{itemize}
4767 \item \verb@init()@: khởi động đối tượng, nhận một chuỗi và số lỗi có
4768 thể có.
4769 \item \verb@step()@: trả về một chuỗi phát sinh từ lỗi bàn phím. Trả
4770 về \verb@false@ nếu không còn chuỗi nào nữa.
4771 \item \verb@done()@: hoàn tất sử dụng đối tượng, giải phóng các tài
4772 nguyên.
4773 \end{itemize}
4775 Hàm \verb@im_recover()@, gọi đến hai hàm \verb@vni_recover()@ và
4776 \verb@telex_recover()@ dùng để phục hồi phím từ hai kiểu gõ trên.
4778 Các hàm này được sử dụng trong hàm \verb@get_syllable_candidates()@.
4779 Các phần xử lý bàn phím khác cũng được xử lý trong hàm này.
4781 \section{Bắt lỗi chính tả}
4783 Trình bắt lỗi chính tả bao gồm hai lớp chính là lớp \verb@Text@. Lớp
4784 \verb@Text@ đại diện cho một đoạn văn bản trong toàn bộ văn bản. Lớp
4785 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ử
4786 dụng để giao tiếp giữa lớp này và các lớp khác là UTF-8.
4788 Các biến quan trọng trong lớp \verb@Text@:
4789 \begin{itemize}
4790 \item \verb@vspell@ trỏ đến đối tượng \verb@VSpell@ quản lý đối tượng
4791 này.
4792 \item \verb@offset@,\verb@length@: vị trí và độ dài của đoạn văn bản
4793 do đối tượng này xử lý, xét trong toàn bộ văn bản của \verb@vspell@.
4794 \end{itemize}
4796 Các hàm quan trọng trong lớp \verb@Text@:
4797 \begin{itemize}
4798 \item \verb@ui_syllable_check()@: Hàm ảo, được gọi khi đối tượng cần
4799 người dùng kiểm tra tính đúng sai của một tiếng.
4800 \item \verb@ui_word_check()@: Hàm ảo, được gọi khi đối tượng cần người
4801 dùng kiểm tra tính đúng sai của một từ.
4802 \item \verb@syllabel_check@: cho biết tiếng tại vị trí cho trước có
4803 đúng chính tả hay không.
4804 \item \verb@apply_separators()@: Áp dụng separator cho câu.
4805 \item \verb@get_separators()@: Lấy danh sách separator.
4806 \item \verb@sentence_check()@: Tiến hành kiểm tra chính tả một
4807 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ư
4808 toàn bộ công đoạn bắt lỗi chính tả, mô tả trong thuật
4809 toán~\ref{algo:Text::sentence_check}.
4810 \item \verb@syllable_check()@: Kiểm lỗi tiếng. Trả về \verb@true@ nếu
4811 không còn lỗi~(thuật toán~\ref{algo:Text::syllable_check}).
4812 \item \verb@word_check()@: Kiểm lỗi từ. Trả về \verb@true@ nếu
4813 không còn lỗi~(thuật toán~\ref{algo:Text::word_check}).
4814 \item \verb@replace()@: Thay thế một chuỗi con trong đoạn văn bản đang
4815 xét.
4816 \item \verb@substr()@: Lấy một chuỗi con trong đoạn văn bản đang xét.
4817 \end{itemize}
4819 \begin{algo}
4820 \caption{Text::sentence\_check()}
4821 \label{algo:Text::sentence_check}
4822 \begin{enumerate}
4823 \item Tách token.
4824 \item Chuẩn hoá các tiếng.
4825 \item Gọi \verb@syllable_check()@ để kiểm tra. Nếu có lỗi tiếng, gọi
4826 \verb@ui_syllable_check()@ để yêu cầu người dùng sửa lỗi, sau đó
4827 kết thúc (trả về \verb@false@ --- vẫn còn lỗi).
4828 \item Xây dựng lưới từ.
4829 \item Bổ sung lưới từ:
4830 \begin{itemize}
4831 \item Đánh dấu tên riêng.
4832 \item Áp dụng separator.
4833 \end{itemize}
4834 \item Xây dựng \verb@DAG@ tương ứng (tùy theo các thông số về
4835 trigram, penalty~\ldots).
4836 \item Tìm cách tách từ tốt nhất.
4837 \begin{itemize}
4838 \item Nếu có chuẩn hoá, sử dụng Bellman-Ford.
4839 \item Nếu không có chuẩn hoá, sử dụng PFS.
4840 \end{itemize}
4841 \item Gọi \verb@word_check()@ để kiểm tra. Nếu có lỗi, gọi
4842 \verb@ui_word_check()@ để yêu cầu người dùng sửa lỗi, sau đó kết
4843 thúc (trả về \verb@false@ --- vẫn còn lỗi).
4844 \item Kết thúc, trả về \verb@true@ --- sạch lỗi.
4845 \end{enumerate}
4846 \end{algo}
4848 \begin{algo}
4849 \caption{Text::syllable\_check()}
4850 \label{algo:Text::syllable_check}
4851 \begin{enumerate}
4852 \item Duyệt lần lượt từng tiếng trong câu. Thực hiện:
4853 \begin{enumerate}
4854 \item Gọi \verb@VSpell::in_dict()@, kiểm tra $id$ xem tiếng đó có
4855 chưa. Nếu đã có, kết thúc (trả về \verb@true@ --- không có lỗi).
4856 \item Gọi \verb@StringArchive::in_dict()@, kiểm tra xem $cid$ của
4857 tiếng có trong từ điển tiếng không. Nếu có, phân tích tiếng, lấy
4858 dạng chữ thường, đúng quy cách bỏ dấu của tiếng. Kiểm tra xem tiếng
4859 mới có giống với tiếng cũ hay không (lỗi bỏ dấu sai vị trí). Nếu có,
4860 kết thúc (trả về \verb@true@ --- không có lỗi).
4861 \item Trả về \verb@false@ --- lỗi.
4862 \end{enumerate}
4863 \item Nếu trả về \verb@false@, đưa tiếng vào danh sách tiếng gặp
4864 lỗi. Tiếp tục duyệt các tiếng còn lại.
4865 \item Trả về \verb@true@ nếu danh sách các tiếng gặp lỗi là rỗng.
4866 \end{enumerate}
4867 \end{algo}
4869 \begin{algo}
4870 \caption{Text::word\_check()}
4871 \label{algo:Text::word_check}
4872 \begin{enumerate}
4873 \item Duyệt lần lượt các từ trong cách tách từ đã có.
4874 \item Lấy danh sách $id$ của các tiếng của từ --- \verb@sylls2@.
4875 \item Lấy danh sách $cid$ của các tiếng của từ --- \verb@sylls@.
4876 \item Nếu \verb@sylls@ không trùng khớp với các tiếng trong câu (dùng
4877 $cid$) và \verb@sylls2@ không có trong từ điển riêng của
4878 \verb@VSpell@, lưu từ vào danh sách từ gặp lỗi.
4879 \item Trả về \verb@true@ nếu danh sách các từ gặp lỗi là rỗng.
4880 \end{enumerate}
4881 \end{algo}
4883 Ta thấy \verb@Text@ là một lớp abstract. Một số hàm như
4884 \verb@ui_syllable_check()@, \verb@ui_word_check()@ cần phải được cài
4885 đặ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
4886 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
4887 đặ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
4888 người dùng đưa ra quyết định. Sau khi lập danh sách từ đề nghị,
4889 \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ừ
4890 đề nghị và chờ người dùng quyết định chọn từ nào.
4893 Lớp \verb@VSpell@ là lớp chính, đại diện cho mô hình bắt lỗi chính tả,
4894 được dùng để giao tiếp với chương trình sử dụng bắt lỗi chính tả. Lớp
4895 này sử dụng \verb@Text@ để tiến hành bắt lỗi chính tả.
4897 Lớp \verb@VSpell@ quản lý một từ điển riêng của chính nó, được bổ sung bởi
4898 người dùng. Do chương trình không thể đạt được một từ điển hoàn chỉnh,
4899 từ điển này được dùng để bổ sung cho từ điển đã có. Những ký hiệu, các
4900 từ nước ngoài~\ldots{} không được nhận diện bởi chương trình cũng sẽ
4901 được thêm vào từ điển này sau khi người dùng đã kiểm tra những từ đó
4902 và xác định rằng những từ đó là chính xác. \verb@VSpell@ bao gồm hai
4903 từ điển: từ điển từ (\verb@VSpell:words@) và từ điển tiếng
4904 (\verb@VSpell::syllables@).
4906 Ngoài ra \verb@VSpell@ còn duy trì một danh sách các separator
4907 (\verb@VSpell::sepaparators@).
4909 Các hàm thường dùng trong \verb@VSpell@:
4910 \begin{itemize}
4911 \item \verb@init()@: Khởi động cơ chế bắt lỗi chính tả, nạp các tập
4912 tin liên quan~\ldots (bao gồm việc nạp từ điển, ngram, danh sách tên
4913 riêng).
4914 \item \verb@cleanup()@: Hủy bỏ toàn bộ dữ liệu của đối tượng, chuẩn bị để
4915 hủy bỏ đối tượng.
4916 \item \verb@check()@: tiến hành kiểm lỗi chính tả cho một đoạn văn
4917 bản~(thuật toán~\ref{algo:VSpell::check}). Văn bản được dùng ở dạng
4918 UTF-8.
4919 \item \verb@set_penalty()@: Đặt trọng số $w$ cho lớp \verb@PenaltyDAG@.
4920 \item \verb@get_penalty()@: Lấy trọng số $w$ của lớp
4921 \verb@PenaltyDAG@.
4922 \item \verb@set_normalization()@: Cho biết có áp dụng chuẩn hoá cách
4923 tách từ hay không.
4924 \item \verb@get_normalization()@: Như trên.
4925 \item \verb@set_trigram()@: Cho biết có áp dụng trigram hay không.
4926 \item \verb@get_trigram()@: Như trên.
4927 \end{itemize}
4929 \begin{algo}
4930 \caption{VSpell::check()}
4931 \label{algo:VSpell::check}
4932 \begin{enumerate}
4933 \item Văn bản UTF-8 được lưu vào \verb@utf8_text@.
4934 \item Lặp
4935 \begin{enumerate}
4936 \item Chuyển văn bản từ UTF-8 sang VISCII, dùng
4937 \verb@viet_to_viscii_force@.
4938 \item Tách câu (\verb@sentences_split()@).
4939 \item Duyệt từng câu.
4940 \begin{enumerate}
4941 \item Tạo đối tượng \verb@Text@ mới
4942 (\verb@TextFactory::create()@).
4943 \item Đặt \verb@offset@,\verb@length@ cho đối tượng \verb@Text@.
4944 \item Gọi \verb@Text::sentence_check()@.
4945 \item Nếu trả về \verb@false@, ngừng duyệt các câu còn lại.
4946 \end{enumerate}
4947 \item Nếu \verb@sentence_check()@ trả về \verb@true@ với mọi câu,
4948 dừng lặp.
4949 \end{enumerate}
4950 \item Trả về \verb@true@.
4951 \end{enumerate}
4952 \end{algo}
4954 Lớp \verb@VSpell@ không sử dụng trực tiếp \verb@Text@ mà sử dụng lớp
4955 dẫn xuất từ \verb@Text@. Để tạo ra một đối tượng \verb@Text@,
4956 \verb@VSpell@ dựa vào đối tượng thuộc lớp \verb@TextFactory@. Đối
4957 tượng này có nhiệm vụ tạo ra đối tượng \verb@Text@ cho \verb@VSpell@.
4960 \subsection{Separator}
4962 Phần trên có đề cập đến ``separator''. Separator tồn tại vì bộ tách từ
4963 của chương trình không thể nào hoàn chỉnh. Separator giúp hỗ trợ
4964 trình tách từ tách đúng hơn. Separator là những dấu hiệu, chỉ ra rằng
4965 một vị trí nào đó trong câu là ranh giới từ, không thể tồn tại một từ
4966 đi ngang qua vị trí đó. Ví dụ, chương trình tách từ ``\mybox{ông}
4967 \mybox{quan tài} \mybox{thật} \mybox{đấy}''. Ta sẽ chen một separator vào
4968 giữa ``quan'' và ``tài''. Nhờ vậy, chương trình sẽ chọn ra một cách
4969 tách từ khác ``\mybox{ông} \mybox{quan} \mybox{tài} \mybox{thật}
4970 \mybox{đấy}''.
4972 Separator được sử dụng trong phần hiệu chỉnh lưới từ. Sau khi đã hoàn
4973 tất tạo lưới từ, thuật toán~\ref{algo:Text::apply_separators} sẽ duyệt qua toàn bộ lưới từ, loại bỏ bất
4974 cứ từ nào vi phạm separator.
4975 \begin{algo}
4976 \caption{Text::apply\_separators()}
4977 \label{algo:Text::apply_separators}
4978 \begin{enumerate}
4979 \item Sắp xếp danh sách separator theo thứ tự xuất hiện.
4980 \item Duyệt lần lượt từng separator, bắt đầu từ $0$.
4981 \begin{enumerate}
4982 \item Duyệt lần lượt tất cả các từ trong lưới từ.
4983 \item Loại bỏ những từ cắt ngang qua separator đang xét.
4984 \end{enumerate}
4985 \end{enumerate}
4986 \end{algo}
4988 \subsection{vspell-gtk}
4990 Như đã nói, các lớp trong \verb@VSpell@, \verb@Text@ chỉ tập trung vào
4991 phần xử lý văn bản. Phần giao tiếp được tách riêng (nằm trong hai hàm
4992 \verb@Text::ui_word_check()@ và
4993 \verb@Text::ui_syllable_check()@). Chương trình vspell-gtk được tạo ra
4994 nhằm mục đích minh hoạ cách cài đặt hai hàm này. Chương trình là một
4995 bộ bắt lỗi chính tả độc lập. Tuy nhiên, để chương trình thực sự hữu
4996 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
4997 liên quan đến xử lý văn bản như AbiWord, OpenOffice, GEdit,
4998 Evolution~\ldots
5000 Chương trình có giao diện như trong
5001 hình~\ref{fig:vspell-gtk-ui}. Sau khi nhập liệu, ta nhấn nút
5002 ``Check''. Chương trình kiểm lỗi hai giai đoạn: kiểm lỗi tiếng và kiểm
5003 lỗi từ. Phần được kiểm tra sẽ được tô sẫm. Các từ nhiều tiếng được
5004 gạch dưới. Những từ/tiếng bị sai được
5005 tô đậm. Từ đang được sửa sẽ được tô đỏ. Nhấn ``Ignore'' sẽ bỏ qua
5006 lỗi hiện tại, chuyển sang lỗi kế, lần lượt xoay vòng lỗi. Nhấn
5007 ``Ignore all'' sẽ bỏ qua hoàn toàn một giai đoạn kiểm lỗi (tiếng hoặc
5008 từ), chuyển qua giai đoạn kế (hoặc kết thúc quá trình kiểm tra). Để
5009 sửa lỗi, ta chọn từ trong khung ``Candidates'' hoặc tự nhập từ mới,
5010 sau đó nhấn nút ``Enter'' bên cạnh.
5011 \begin{figure}[htbp]
5012 \centering
5013 \includegraphics[width=\textwidth]{vspell-gtk}
5014 \caption{Giao diện vspell-gtk}
5015 \label{fig:vspell-gtk-ui}
5016 \end{figure}
5018 vspell-gtk tạo lớp \verb@MyText@ dẫn xuất từ \verb@Text@. Các hàm
5019 \verb@ui_syllable_check()@ và \verb@ui_word_check()@ được cài đặt như
5020 trong thuật toán~\ref{algo:MyText::ui_syllable_check}
5021 và~\ref{algo:MyText::ui_word_check}. \verb@MyText@ có thêm vài hàm phụ
5022 để hiển thị như \verb@show_wrong_syllables()@,
5023 \verb@show_wrong_words()@ và \verb@show_words()@.
5026 \begin{algo}
5027 \caption{MyText::ui\_syllable\_check()}
5028 \label{algo:MyText::ui_syllable_check}
5029 \begin{enumerate}
5030 \item Duyệt lần lượt từng tiếng bị sai trong danh sách tiếng sai.
5031 \item Hiện tiếng sai dùng hàm \verb@show_wrong_syllables()@.
5032 \item Lập danh sách tiếng đề nghị dùng
5033 \verb@get_syllable_candidates()@, hiện thị danh sách tiếng lên màn
5034 hình.
5035 \item Đặt \verb@processed@, \verb@ignore_all@, \verb@ignore@ là
5036 \verb@false@.
5037 \item Lặp liên tục (nhường quyền xử lý cho Gtk+) cho đến khi biến
5038 \verb@ignore@ hoặc \verb@ignore_all@ hoặc \verb@processed@ là
5039 \verb@true@. (Khi các nút tương ứng được nhấn, giá trị các biến này
5040 sẽ bị thay đổi).
5041 \item Nếu \verb@ignore@ là \verb@true@, quay lại từ đầu (chuyển qua từ bị sai
5042 kế tiếp).
5043 \item Nếu \verb@ignore_all@ là \verb@true@, kết thúc (trả về
5044 \verb@true@ --- ``sạch lỗi'' do người dùng không muốn kiểm tra lỗi
5045 tiếng nữa).
5046 \item Nếu \verb@processed@ là \verb@true@.
5047 \begin{enumerate}
5048 \item Lấy tiếng do người dùng chọn (hoặc nhập mới).
5049 \item Thay thế tiếng bị sai trong câu bằng tiếng của người dùng.
5050 \item Thêm tiếng này vào từ điển tiếng của \verb@VSpell@.
5051 \item Kết thúc, trả về \verb@false@ --- còn lỗi.
5052 \end{enumerate}
5053 \end{enumerate}
5054 \end{algo}
5056 \begin{algo}
5057 \caption{MyText::ui\_word\_check()}
5058 \label{algo:MyText::ui_word_check}
5059 \begin{enumerate}
5060 \item Duyệt lần lượt từng từ bị sai trong danh sách từ sai.
5061 \item Hiện từ sai dùng hàm \verb@show_wrong_words()@.
5062 \item Lập danh sách từ đề nghị dùng từ được dùng trong cách tách từ
5063 đùng khi áp dụng mô hình ngôn ngữ.
5064 % \verb@get_syllable_candidates()@, hiện thị danh sách tiếng lên màn
5065 % hình.
5066 \item Đặt \verb@processed@, \verb@ignore_all@, \verb@ignore@ là
5067 \verb@false@.
5068 \item Lặp liên tục (nhường quyền xử lý cho Gtk+) cho đến khi biến
5069 \verb@ignore@ hoặc \verb@ignore_all@ hoặc \verb@processed@ là
5070 \verb@true@. (Khi các nút tương ứng được nhấn, giá trị các biến này
5071 sẽ bị thay đổi).
5072 \item Nếu \verb@ignore@ là \verb@true@, quay lại từ đầu (chuyển qua từ bị sai
5073 kế tiếp).
5074 \item Nếu \verb@ignore_all@ là \verb@true@, kết thúc (trả về
5075 \verb@true@ --- ``sạch lỗi'' do người dùng không muốn kiểm tra lỗi
5076 từ nữa).
5077 \item Nếu \verb@processed@ là \verb@true@.
5078 \begin{enumerate}
5079 \item Lấy từ do người dùng chọn (hoặc nhập mới).
5080 \item Tìm ký tự `\verb@|@'. Các ký tự này đại diện cho
5081 separator. Nếu có, thêm những separator này vào \verb@VSpell@, kết thúc
5082 --- trả về \verb@false@.
5083 \item Thay thế từ bị sai trong câu bằng từ của người dùng.
5084 \item Thêm từ này vào từ điển từ của \verb@VSpell@.
5085 \item Kết thúc, trả về \verb@false@ --- còn lỗi.
5086 \end{enumerate}
5087 \end{enumerate}
5088 \end{algo}
5090 \section{Huấn luyện}
5092 \subsection{Dữ liệu huấn luyện}
5093 \label{sec:data-preprocessing}
5095 Dữ liệu gốc bao gồm: danh sách từ và các văn bản tiếng Việt thu thập
5096 từ mạng VnExpress\footnote{http://www.vnexpress.net}.
5098 Nhiệm vụ:
5099 \begin{itemize}
5100 \item Tạo danh sách tiếng, chuẩn hoá danh sách tiếng.
5101 \item Tiền xử lý ngữ liệu.
5102 \item Huấn luyện ngram, tạo ra dữ liệu ngram.
5103 \end{itemize}
5106 \subsection{Dữ liệu nguồn}
5107 \label{sec:data-source}
5109 Dữ liệu nguồn bao gồm danh sách từ và ngữ liệu tiếng Việt. Dữ liệu
5110 được lưu dưới dạng mã VISCII.
5111 \subsubsection{Danh sách từ}
5113 Đâ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
5114 Việt, mỗi từ một dòng. Các chữ cách bởi một khoảng trắng.
5117 \subsubsection{Ngữ liệu huấn luyện}
5119 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
5120 văn bản.
5122 %% \subsection{Danh sách tiếng}
5123 %% \label{sub:syllable-list}
5125 %% Danh sách tiếng chứa mọi tiếng thông dụng nhất được sử dụng trong
5126 %% tiếng Việt. Danh sách này được rút trích từ danh sách từ, sau đó được
5127 %% lưu ở dạng chuẩn hoá.
5129 %% Danh sách tiếng được rút trích tự động khi chương trình nạp danh sách
5130 %% từ.
5132 %Chương trình syllable-extract được dùng để tạo danh sách này. Cách
5133 %dùng:
5134 %\begin{verbatim}
5135 %$syllable-extract < word-list > syllable-list
5136 %\end{verbatim}
5139 \subsection{Tiền xử lý ngữ liệu huấn luyện}
5140 \label{sec:training-data-preprocessing}
5142 Dữ liệu thu được từ VnExpress bao gồm một loạt các file html, chia
5143 thành nhiều thư mục.
5145 htmltidy được sử dụng để chuyển dữ liệu html về dạng xhtml. Các file
5146 html của VnExpress không hoàn toàn tuân theo chuẩn html, bao gồm hai
5147 trường hợp:
5149 \begin{itemize}
5150 \item Sử dụng tag <vne>
5151 \item Không đóng tag <frame>
5152 \end{itemize}
5154 Hai lỗi này được tự động phát hiện và sửa chữa trước khi chuyển dữ
5155 liệu cho htmltidy.
5157 Sau khi chạy htmltidy, ta được dữ liệu xhtml hợp khuôn dạng. Phân tích
5158 các tài liệu này cho thấy phần nội dung chính thường nằm trong tag
5159 <vne>, hoặc trong tag <table> với thuộc tính id là
5160 ``CContainer''. XSLT được sử dụng để lọc ra phần nội dung nằm giữa hai
5161 tag này (\verb#z.xslt#).
5163 Trình \verb#convert.sh# sẽ thực hiện bước htmltidy và xslt ở trên. Cách sử
5164 dụng:
5165 \begin{verbatim}
5166 $convert.sh < input > output
5167 \end{verbatim}
5169 Sau bước này, ta cần lọc bỏ các tag, loại bỏ các entity~\ldots{}{} để
5170 đưa dữ liệu về dạng văn bản thuần túy. Do số lượng tag được định nghĩa
5171 html rất nhiều nên chỉ xử lý những tag nào được sử dụng trong
5172 VnExpress (thông qua chương trình \verb#gettags.pl#). Các tag này được loại
5173 bỏ bằng \verb#html2text.pl#. Các mã utf-8 được sử dụng trong
5174 VnExpress (thông qua chương trình \verb#z.c#) được chuyển về mã VISCII
5175 qua \verb#z.cpp#. Các entity còn lại (lấy bằng \verb#list-entity.pl#)
5176 được xử lý trong \verb#html2text.pl#.
5178 \verb#html2text.pl# sử dụng các tag để tách dữ liệu thành các đoạn. Dữ
5179 liệu sau cùng là các tập tin văn bản, mỗi dòng là một đoạn.
5181 \subsection{Huấn luyện dữ liệu}
5182 \label{sub:training-data}
5184 Chương trình \verb#wfst-train# được dùng để huấn luyện dữ liệu. Thông
5185 tin nhập là danh sách từ, danh sách tiếng, ngram (nếu có). Thông tin
5186 xuất là ngram mới.
5188 Quy trình xử lý của trình huấn luyện được nêu trong thuật
5189 toán~\ref{algo:training}. Chương trình được lặp đi lặp lại nhiều lần.
5191 \begin{algo}
5192 \caption{Quy trình huấn luyện}
5193 \label{algo:training}
5194 \begin{enumerate}
5195 \item Đọc từng dòng.
5196 \item Tách câu.
5197 \item Táck token.
5198 \item Xây dựng lưới từ (\verb@Lattice::construct()@).
5199 \item Tìm cách tách từ tốt nhất.
5200 \item Thống kê ngram cho câu.
5201 \item Xử lý câu kế tiếp.
5202 \end{enumerate}
5203 \end{algo}
5205 \section{Linh tinh}
5207 \subsection{Xử lý bảng mã}
5209 Chương trình giao tiếp bằng Unicode UTF-8. Tuy nhiên, để tiện việc xử
5210 lý, nội bộ chương trình sử dụng mã VISCII. Do VISCII không thể bao
5211 quát hết Unicode, những ký tự Unicode không có trong VISCII sẽ được
5212 thay bằng một ký tự đặc biệt (coi như là ký tự không biết). Sau khi xử
5213 lý VISCII xong, chuỗi so sánh thật sự sẽ là chuỗi Unicode.
5215 \subsection{So sánh chuỗi}
5217 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
5218 hoa thường là không thể thực hiện được. Do vậy, ngoài strid ``id'' tham chiếu
5219 đến chuỗi gốc, ta sử dụng thêm ``cid'' tham chiếu đến chuỗi được dùng để
5220 so sánh chuỗi. ``cid'' mặc định trong câu tham chiếu đến chuỗi đã
5221 chuẩn hoá. Nếu cần, ``cid'' sẽ tham chiếu đến chuỗi chuẩn hoá, viết
5222 thường.
5224 Khi cần thiết phải so sánh chuỗi thật sự, chương trình sẽ dùng ``id''
5225 để truy ngược đến chuỗi gốc, sau đó thực hiện phép so sánh chuỗi thông thường.
5227 \subsection{Xử lý tiếng Việt}
5229 Một số hàm được tạo ra để hỗ trợ việc xử lý tiếng Việt, bao gồm:
5230 \begin{itemize}
5231 \item \verb@viet_toupper@, \verb@viet_tolower@, \verb@viet_isupper@, \verb@viet_islower@,
5232 \verb@viet_isalpha@, \verb@viet_isdigit@, \verb@viet_isxdigit@, \verb@viet_isspace@,
5233 \verb@viet_ispunct@: Các hàm tiếng Việt thay thế cho các hàm gốc (toupper,
5234 tolower~\ldots)
5235 \item \verb@viet_utf8_to_viscii()@: Chuyển từ UTF-8 sang VISCII. Trả
5236 về \verb@false@ nếu không thể chuyển đổi.
5237 \item \verb@viet_utf8_to_viscii()@: Chuyển từ UTF-8 sang VISCII. Những
5238 ký tự không thể chuyển được sẽ được thay bằng `z'.
5239 \item \verb@viet_viscii_to_utf8()@: Chuyển từ VISCII sang UTF-8.
5240 \end{itemize}
5244 \chapter{Đánh giá và kết luận}
5245 \tolerance=200%reset tolerance because i used infinitive tolerance in
5246 %the last chapter
5247 \label{cha:conclusion}
5248 \minitoc
5250 \section{Tóm tắt}
5252 Sau đây là tóm tắt các đặc điểm mô hình được đề nghị:
5253 \begin{itemize}
5254 \item Áp dụng mô hình tách từ mờ dựa trên ngram (bigram và trigram).
5255 \item Cấu trúc dữ liệu dựa trên lưới từ --- một dạng đồ thị có
5256 hướng không chu trình. Nhờ đó có thể áp dụng thuật toán tìm đường
5257 trên đồ thị có hướng để tìm ra cách tốt từ tốt nhất.
5258 \item Sử dụng lưới~2-từ cho trigram, các thuật toán làm việc trên
5259 bigram sẽ vẫn làm việc với trigram thông qua lưới~2-từ.
5260 \item Đồ thị được hiệu chỉnh để tạo
5261 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
5262 giá trị các cạnh nối đến từ phát sinh.
5263 \item Loại bỏ khả năng cách tách từ
5264 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ừ
5265 hơn bằng cách chuẩn hoá các cách tách từ thông qua lưới từ động.
5266 \item Áp dụng đảo ngược lỗi để phục hồi lỗi phát âm và lỗi bàn
5267 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,
5268 nhầm thứ tự hai lần gõ. Ngoài ra còn có lỗi do bộ gõ như VNI và
5269 TELEX.
5270 \item Sử dụng soft-count để huấn luyện ngram nhằm tạo ra mô hình ngôn
5271 ngữ tốt hơn.
5272 \end{itemize}
5274 %% \subsection{Ưu điểm}
5276 %% \begin{itemize}
5277 %% \item
5278 %% \end{itemize}
5280 \subsection{Hạn chế}
5282 Hạn chế đầu tiên của chương trình chính là lượng thông tin được sử
5283 dụng để khử nhập nhằng khi tách từ mờ. Do chỉ sử dụng thông tin về xác
5284 suất xuất hiện của một chuỗi từ liên tục nên kết quả có phần hạn
5285 chế. Trong nhiều trường hợp ta có thể khử nhập nhằng bằng từ loại,
5286 bằng thông tin cú pháp, hoặc thông tin về ngữ nghĩa. Thông tin xác
5287 suất lẽ ra chỉ là giải pháp bổ trợ cho các thông tin trên. Khi những
5288 thông trên không hoàn chỉnh, không bao quát hết hoặc không thể khử
5289 nhập nhằng toàn bộ, khi đó ta mới dùng thống kê như một giải pháp dự
5290 phòng.
5292 Chính vì chỉ sử dụng ngram dựa trên từ, đôi khi chương trình sẽ chọn
5293 lầm cách tách từ, dẫn đến việc thông báo từ sai chính tả trong khi từ
5294 đó hoàn toàn đúng.
5296 Phần kiểm tra viết hoa khá khó khăn.
5298 %% \begin{itemize}
5299 %% \item Không sử dụng những thông tin cấp cao hơn.
5300 %% \item Có khả năng nó tự động sửa từ đúng thành từ sai, do từ sai
5301 %% ``hay'' được dùng trong câu đó hơn là từ đúng :-P
5302 %% \end{itemize}
5304 \section{Kết quả thử nghiệm}
5307 \section{Đánh giá}
5310 \section{Hướng phát triển}
5311 \label{sec:todo}
5313 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!
5315 \begin{itemize}
5316 \item Loại bỏ SRILM.
5317 \item Các hướng cải tiến EM.
5318 \item Tư tưởng cơ bản hiện thời là phát sinh mọi trường hợp tương tự
5319 với trường hợp đang xét và hy vọng giải pháp đúng cũng nằm trong
5320 đó. Cách này có hai điểm cần bàn:
5321 \begin{itemize}
5322 \item Khi nào nên phát sinh, khi nào không? Nói cách khác, khi nào
5323 ta ``cảm thấy'' chỗ đó có thể bị sai? Statistic/Genetic approach?
5324 \item Khi phát sinh, nên đánh giá tầm quan trọng của các cách phát
5325 sinh cho hợp lý, không nên đánh đồng như hiện nay. How can i do
5326 that?
5327 \end{itemize}
5329 Tách từ không đúng thì bắt lỗi sai. Mà phát sinh quá nhiều thì có
5330 thể tách từ sẽ sai do có nhiều câu đúng trong đó (giả sử LM hoàn
5331 hảo).
5333 Chuyện phát sinh là chuyện hơi kẹt. Do hiện thời chỉ dựa trên lỗi
5334 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à
5335 lỗi bàn phím) thì số lượng sẽ tăng đáng kể và {\em xuất hiện những
5336 câu đúng mới} (giống như việc loại bỏ dấu, sau đó thêm dấu vô sẽ có
5337 nhiều câu hợp lý).
5338 \begin{itemize}
5339 \item Cách đầu tiên là chỉ phát sinh khi cần thiết ---
5340 khá khó vì làm sao biết chỗ nào cần phát sinh?
5341 \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
5342 tách từ thuần túy, lưới từ bắt lỗi chính tả chứa nhiều từ cùng độ
5343 dài (cùng một ``khuôn''). Làm cách nào đó để nhóm những từ này
5344 lại, tránh lãng phí khi truy tìm nhiều cách trên cùng một khuôn.
5345 \end{itemize}
5346 \item Ngoài cách đang làm, còn hướng nào khác không? Liệu speech
5347 recognition/OCR có ý kiến nào hay không? Cần tìm hiểu mọi thứ liên
5348 quan đến ``error tolerance''
5349 \end{itemize}
5351 \section{Khi nào cần phát sinh}
5353 Cách đầu tiên là dựa trên thông tin thống kê, tìm xem giá trị trung
5354 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ừ
5355 thấp hơn ngưỡng này thì phát sinh từ mới.
5357 Áp dụng CSS để phát sinh thêm từ ???
5359 Trước hết, tạo lưới từ cơ sở. Sau đó duyệt qua từng cách tách từ, áp
5360 dụng CSS để tạo thêm một số từ liên quan.
5361 \begin{itemize}
5362 \item Thay thế từ bằng từ do CSS đề nghị --> ảnh hưởng đến CSS ở các
5363 chỗ khác. Giải pháp genetic hay phân nhánh. Tách làm hai lưới từ
5364 (một cũ, một mới) sau đó lại áp dụng CSS trên các cách khác ???
5365 \item Thêm vào thay vì thay thế --> ``càng rộng thì càng dễ sai''
5366 \end{itemize}
5368 Chọn đại một cách tách từ, sau đó giao cho CSS. CSS được mở rộng để không
5369 chỉ thay từ, mà thay cả ranh giới từ.
5371 \section{Áp dụng context-sensitive spelling checking}
5373 Các giải pháp spelling checking đều dựa trên câu tách từ sẵn. Xét theo
5374 quan điểm của lưới từ là chọn một đường đi, sau đó áp dụng spelling
5375 checking. Để áp dụng CSS ta có thể đưa nó vô lưới từ thay vì chỉ nằm
5376 trên một đường đi duy nhất trên lưới từ. Nói cách khác, ta chuyển từ
5377 đồ thì ``một đường'' thành một đồ thị đúng nghĩa.
5379 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
5380 trên đường đi, ta xét những từ nằm trên các đường đi khác nhau --
5381 trong một phạm vi nhất định. Khi chọn được một từ thì cũng đồng nghĩa
5382 giới hạn số lưới từ có khả năng lại.
5384 Với các phương pháp dùng collocation, ta cũng có thể mở rộng ra lưới
5385 từ, tìm trên nhiều đường thay vì chỉ một đường.
5387 Vấn đề đối với việc áp dụng những phương pháp này là khả năng ``đoán
5388 sai''. Ví dụ, có một từ trong lưới từ có ảnh hưởng lớn đến quyết định
5389 chọn từ khác. Khi từ đó được sử dụng, nó sẽ loại bỏ các cách tách từ
5390 không chứ nó. Nếu từ đó {\em không} phải là từ đúng thì coi như ta đã
5391 suy luận dựa trên những chứng cớ không đáng tin cậy (độ tin cậy?).
5393 Có thể duyệt từng cách tách từ, áp dụng CSS. Sau đó làm sao biết nên
5394 dùng cách tách từ nào ??? Lại dùng ngram?
5396 Túm lại có ba vấn đề:
5397 \begin{itemize}
5398 \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
5399 loại bớt những cách tách từ nhảm nhí.
5400 \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
5401 hiện lỗi khác nhau. Cần LM hay cái gì đó khác để biết được nên dùng
5402 cách tách từ nào (hoặc dùng hết :)
5403 \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
5404 trên một đường đi nhất định.
5405 \end{itemize}
5407 \appendix\eject\addcontentsline{toc}{part}{Phụ lục}
5408 \chapter{Dữ liệu thử nghiệm}
5410 \eject\addcontentsline{toc}{chapter}{\listfigurename}\listoffigures
5411 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}\listfigurename}
5413 \eject\addcontentsline{toc}{chapter}{\listtablename}\listoftables
5414 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}\listtablename}
5416 \eject\addcontentsline{toc}{chapter}{Danh sách thuật toán}\listof{algo}{Danh sách thuật toán}
5417 %\refstepcounter{chapter}\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}Danh sách thuật toán}
5418 %\eject\addcontentsline{toc}{chapter}{\bibname}
5419 \bibliographystyle{alpha}
5420 \bibliography{reference}
5422 %% \begin{thebibliography}{}
5423 %% \bibitem{Ravishankar}Mosur K. Ravishankar. 1996. {\em Efficient Algorithms for
5424 %% Speech Recognition.} PhD thesis. %CMU-CS-96-143.ps
5425 %% \bibitem{Oflazer}Kemal Oflazer. 1996. {\em Error-tolerant Finite State
5426 %% Recognition with Applications to Morphological Analysis and Spelling
5427 %% Correction.} %oflazer96errortolerant.ps.gz
5428 %% \bibitem{LAH}Le An Ha. {\em A method for word segmentation in
5429 %% Vietnamese.} %Ha-03.pdf
5430 %% \bibitem{Chang}Chao-Huang Chang. {\em A New Approach for
5431 %% Automatic Chinese Spelling Correction.} %a-new-approach-for.ps
5432 %% \bibitem{Sproat}Richard Sproat, William Gale, Chilin Shih, Nancy
5433 %% Chang. {\em A Stochastic Finite-State Word-Segmentation Algorithm for
5434 %% Chinese.} ACL Vol 22 N3.%J96-3004.pdf
5435 %% \bibitem{Chunyu}Chunyu Kit, Zhiming Xu, Jonathan
5436 %% J. Webster. {\em Integrating Ngram Model and Case-based Learning For
5437 %% Chinese Word Segmentation.}%tsdx.ps.gz
5438 %% \bibitem{softcount}Xianping Ge, Wanda Pratt,
5439 %% Padhraic Smyth. {\em Discovering Chinese Words from Unsegmented
5440 %% Text.}%mlwordsigir.ps
5441 %% \bibitem{text-tiling}Jianfeng Gao, Hai-Feng Wang, Mingjing Li, Kai-Fu
5442 %% Lee. {\em A Unified Approach to Statistical Language Modeling for
5443 %% Chinese.}%icassp00.pdf
5444 %% \bibitem{}Nianwen Xue.{\em Chinese Word Segmentation as Character
5445 %% Tagging.}%paper2.pdf
5446 %% \bibitem{self-supervised}Fuchun Peng and Dale Schuurmans. {\em Self-Supervised Chinese
5447 %% Word Segmentation.}%IDA01.pdf
5448 %% \bibitem{phonetex}Victoria J. Hodge, Jim Austin. {\em An Evaluation of
5449 %% Phonetic Spell Checkers}%an-evaluation-of-phonetic.ps.gz
5450 %% \bibitem{soundex}K. Kukich. 1992. {\em Techniques for Automatically Correcting
5451 %% Words in Text.}
5452 %% \bibitem{}Cláudio L. Lucchesi and Tomasz Kowaltowski. {\em Applications of
5453 %% Finite Automata Representing Large Vocabularies.}%lucchesi92applications.ps.gz
5454 %% \bibitem{}Bo-Hyun Yun, Min-Jeung Cho, Hae-Chang Rim. {\em Segmenting Korean
5455 %% Compound Nouns using Statistical Information and a Preference
5456 %% Rule. }%PACLING97.ps
5457 %% \bibitem{}Roger I. W. Spooner and Alistair D. N. Edwards. {\em User
5458 %% Modelling for Error Recovery: A Spelling Checker for Dyslexic
5459 %% Users}%spooner97user.ps.gz
5460 %% \bibitem{}Theppitak Karoonboonyanan, Virach Sornlertlamvanich,
5461 %% Surapant Meknavin. {\em A Thai Soundex System for Spelling Correction.}%tsdx.ps.gz
5462 %% \bibitem{}Justin Zobel and Philip Dart. {\em Finding Approximate Matches in
5463 %% Large Lexicons.}%zobel95finding.ps.gz
5464 %% \bibitem{}Sun Maosong, Shen Dayang, Huang Changning. {\em CSeg\&Tag1.0: A
5465 %% Practical Word Segmenter and POS Tagger for Chinese Texts.}%A97-1018.pdf
5466 %% \bibitem{wordseg}Đinh Điền, Hoàng Kiếm, Nguyễn Văn Toàn. {\em Vietnamese Word
5467 %% Segmentation.}%0047-02.pdf
5468 %% \bibitem{}Bidyut Baran Chaudhuri. {\em Reversed word dictionary and
5469 %% phonetically similar word grouping based spell-checker to Bangla
5470 %% text.}%bangla.pdf
5471 %% \bibitem{}Timothy Gambell, Charles D. Yang. {\em Scope and Limits of
5472 %% Statistical Learning in Word Segmentation.}%gambell_yang.pdf
5473 %% \bibitem{iccc}Andi Wu, George Heidorn, Zixin Jiang, Terence
5474 %% Peng. {\em Correction of Erroneous Characters in Chinese Sentence
5475 %% Analysis.}%ICCC-2001.pdf
5476 %% \bibitem{}Fuchun Peng, Xiangji Huang, Dale Schuurmans, Shaojun
5477 %% Wang. {\em Text Clasification in Asian Languages without Word
5478 %% Segmentation.}%IRAL2003.pdf
5479 %% \bibitem{}Yalin Wang, Ihsin T. Phillips, Robert
5480 %% Haralick. {\em Statistical-based Approach to Word Segmentation.}%wordicpr.pdf
5481 %% \bibitem{}{\em Combining Syntactical And Statistical Language Constraints
5482 %% in Context-dependent Language Models for Interactive Speech
5483 %% Applications.}%K026.pdf
5484 %% \bibitem{LoiChinhTa}TS. Lê Trung Hoa. 2002. {\em Lỗi chính tả và cách khắc phục. NXB Khoa
5485 %% học Xã hội.}
5486 %% \bibitem{LoiTuVung}PGS. Hồ Lê, TS. Trần Thị Ngọc Lang, Tô Đình Nghĩa. 2002. {\em Lỗi từ
5487 %% vựng và cách khắc phục.} NXB Khoa học Xã hội.
5488 %% \bibitem{Tuoi}PTS. Phan Thị Tươi, KS. Nguyễn Hứa Phùng, KS. Huỳnh Vụ
5489 %% Như Liên, KS. Phạm Quyết Thắng. 1998. {\em Bắt lỗi chinh tả tự động cho
5490 %% tiếng Việt bằng máy tính.}
5491 %% \bibitem{worddef}Đinh Điền. 2000. {\em Từ tiếng Việt.} VNU-HCMC.
5492 %% \bibitem{}Andrew R. Golding. 1995. {\em A Bayesian hybrid method for
5493 %% context-sensitive spelling correction}. Proceedings of the Third
5494 %% Workshop on Very Large Corpora, pages 39-53.
5495 %% \bibitem{}Andrew R. Golding and Dan Roth. 1999. {\em A Winnow-based
5496 %% approach to context-sensitive correction}. Machine Learning,
5497 %% Special issue on Machine Learning and Natural Language Processing,
5498 %% 34:107-130.
5499 %% \bibitem{}Andrew R. Golding and Yves Schabes. 1996. {\em Combining
5500 %% trigram-based and feature-based methods for context-sensitive
5501 %% spelling correction}. Proceedings of the 34th Annual Meeting of
5502 %% the Association for Computational Linguistics.
5503 %% \end{thebibliography}
5506 \end{document}
5509 Giả sử câu S có $n$ tiếng $c_1,c_2,\ldots{},c_n$, có $|S|$ cách tách từ
5510 $S_1,S_2,\ldots{},S_{|S|}$ và cách tách từ $S_i$ được
5511 tách thành $|S_i|$ từ $W_{i_1},W_{i_2},\ldots{},W_{i_{|S_i|}}$ với
5512 $W_i$ là một từ xác định bắt đầu ở tiếng thứ $i$ chứa $|W_i|$ tiếng, và
5513 $i_j$ là vị trí từ thứ $j$ trong cách tách câu $i$.
5515 Ta có:
5516 $$p(i)=\sum_{j=1}^{|S_i|}{p(W_{i_j})}$$
5518 Một câu sẽ được tách thành:
5519 $$P(W_i) = P_{i}^{left}p(W_{i})P_{i+|W_i|}^{right}$$
5521 $P_i^{left}$ là xác suất tất cả các tổ hợp từ có thể có từ
5522 tiếng thứ nhất đến tiếng thứ $i$.
5524 $P_{i}^{right}$ là xác suất tất cả các tổ hợp từ có thể có từ tiếng
5525 thứ $i$ đến hết câu.
5527 Dễ thấy, với mỗi từ $C$ trong câu $S$, fractional count W của từ sẽ là
5528 $\displaystyle\frac{P(W)}{\sum_i^{|S|}p(i)}$.
5530 $\displaystyle\sum_i^{|S|}p(i)$ cũng chính là $P_{n+1}^{left}$ theo
5531 định nghĩa $P_i^{left}$.
5533 Ta sẽ dùng quy hoạch động để tính $P_i^{left}$ và $P_i^{right}$
5536 P_i^{left} = \left\{
5537 \begin{array}{lr}
5538 1 & i=1\\
5539 p(W_i) & i=2\\
5540 \sum_{j=1}^{i-1}p(c_j\ldots{} c_{i-1})P_j^{left} & i>2
5541 \end{array}
5542 \right.
5546 p(c_i\ldots{} c_j) = \left\{
5547 \begin{array}{ll}
5548 p(W_i)&\text{nếu } c_i\ldots{} c_j \text{ tạo thành } W_i\\
5549 0&\text{ngược lại}
5550 \end{array}
5551 \right.
5554 Thuật toán tính $P^{left}$ như sau:
5555 \begin{enumerate}
5556 \item Đặt $P_1^{left} = 1$
5557 \item Đặt $P_i^{left} = 0\quad \forall i \in [2\ldots{} n+1]$
5558 \item Duyệt i từ 1 đến n, tìm tất cả các từ $W_i$ (do tại có thể có
5559 nhiều từ bắt đầu tại tiếng $i$).
5560 Với mỗi từ $W_i$ tìm được, cộng thêm $p(W_i)$ vào $P_{i+|W_i|}^{left}$
5561 \end{enumerate}
5563 Thuật toán tương tự được áp dụng để tính $P^{right}$.
5565 Sau khi tính được $P^{left}$ và $P^{right}$, ta có thể tính fractional
5566 count trong câu bằng cách duyệt tất cả các từ có thể có trong câu,
5567 cộng thêm vào $\displaystyle\frac{P(W)}{P_{n+1}^{left}}$ cho từ
5568 $C$. Thực tế, ta sẽ lồng bước này vào trong thuật toán tính
5569 $P^{right}$, vì thuật toán cũng phải duyệt qua tất cả các từ.
5571 Vậy thuật toán tính $P^{right}$ là:
5572 \begin{enumerate}
5573 \item Đặt $P_{n+1}^{right} = 1$
5574 \item Đặt $P_i^{right} = 0\quad \forall i \in [1\ldots{} n]$
5575 \item Duyệt i từ n+1 đến 1.
5576 \begin{enumerate}
5577 \item tìm tất cả các từ $W_j$ sao cho $j+|W_j|=i$.
5578 Với mỗi từ $W_j$ tìm được, cộng thêm $p(W_j)$ vào
5579 $P_j^{right}$
5580 \item Tính fractional count cho tất cả các từ $W_i$ ($i \le n$)
5581 \end{enumerate}
5582 \end{enumerate}
5585 Ví dụ: câu ``học sinh học sinh học'' có 8 cách tách từ
5586 \begin{verbatim}
5587 học-sinh học-sinh học
5588 học-sinh học sinh học
5589 học-sinh học sinh-học
5590 học sinh học sinh học
5591 học sinh học sinh-học
5592 học sinh học-sinh học
5593 học sinh-học sinh học
5594 học sinh-học sinh-học
5595 \end{verbatim}
5596 \def\Zhs{\text{học-sinh}}
5597 \def\Zsh{\text{sinh-học}}
5598 \def\Zh{\text{học}}
5599 \def\Zs{\text{sinh}}
5600 Ta có
5602 \begin{array}{rl}
5603 P_1^{left}(\Zhs) &= p(\Zhs_1/\phi)\\
5604 P_1^{left}(\Zh) &= p(\Zh_1/\phi)\\
5605 P_2^{left}(\Zs) &= p(\Zs_2/\Zh_1)P_1^{left}(\Zh)\\
5606 &=p(\Zs_2/\Zh_1)p(\Zh_1/\phi)\\
5607 P_2^{left}(\Zsh) &= p(\Zsh_2/\Zh_1)P_1^{left}(\Zh)\\
5608 &=p(\Zsh_2/\Zh_1)p(\Zh_1/\phi)\\
5609 P_3^{left}(\Zhs) &= p(\Zhs_3/\Zhs_1)P_1^{left}(\Zhs)+p(\Zhs_3/\Zs_2)P_2^{left}(\Zs)\\
5610 &=p(\Zhs_3/\Zhs_1)p(\Zhs_1/\phi)+p(\Zhs_3/\Zs_2)p(\Zs_2/\Zh_1)p(\Zh_1/\phi)\\
5611 &=p(\Zhs_1,\Zhs_3)+p(\Zh_1,\Zs_2,\Zhs_3)\\
5612 P_3^{left}(\Zh) &= p(\Zh_3/\Zs_2)P_2^{left}(\Zs)+p(\Zh_3/\Zhs_1)P_1^{left}(\Zhs)\\
5613 &=p(\Zh_3/\Zs_2)p(\Zs_2/\Zh_1)p(\Zh_1/\phi)+p(\Zh_3/\Zhs_1)p(\Zhs_1/\phi)\\
5614 &=p(\Zh_1,\Zs_2,\Zh_3)+p(\Zhs_1,\Zh_3)\\
5615 \end{array}
5619 \begin{array}{rl}
5620 P_5^{right}(\Zh) &= p(\Phi/\Zh_5)\\
5621 P_4^{right}(\Zsh) &= p(\Phi/\Zsh_4)\\
5622 P_4^{right}(\Zs) &= p(\Zh_5/\Zs_4)P_5^{right}(\Zh)\\
5623 &=p(\Zh_5/\Zs_4)p(\Phi/\Zh_5)\\
5624 P_3^{right}(\Zh) &= p(\Zsh_4/\Zh_3)P_4^{right}(\Zsh)+p(\Zs_4/\Zh_3)P_4^{right}(\Zs)\\
5625 &=p(\Zsh_4/\Zh_3)p(\Phi/\Zsh_4)+p(\Zs_4/\Zh_3)(\Zh_5/\Zs_4)p(\Phi/\Zh_5)\\
5626 &=p(\Zh_3,\Zsh_4)+p(\Zh_3,\Zs_4,\Zh_5)\\
5627 P_3^{right}(\Zhs) &= p(\Zh_5/\Zhs_3)P_5^{right}(\Zh)\\
5628 &=p(\Zh_5/\Zhs_3)p(\Phi/\Zh_5)\\
5629 &=p(\Zhs_3,\Zh_5)\\
5630 \end{array}
5634 \begin{array}{rl}
5635 P_3(\Zhs) &= P_3^{left}(\Zhs)P_3^{right}(\Zhs)\\
5636 &=[p(\Zhs_1,\Zhs_3)+p(\Zh_1,\Zs_2,\Zhs_3)]p(\Zhs_3,\Zh_5)\\
5637 &=p(\Zhs_1,\Zhs_3)p(\Zhs_3,\Zh_5)+p(\Zh_1,\Zs_2,\Zhs_3)p(\Zhs_3,\Zh_5)\\
5638 &=p(\Zhs_1,\Zhs_3,\Zh_5)+p(\Zh_1,\Zs_2,\Zhs_3,\Zh_5)
5639 \end{array}
5643 Với \cite{Tuoi} thì việc xử lý lỗi bao gồm:
5644 \begin{itemize}
5645 \item Từ không có trong từ điển thì bắt lỗi ở cấp từ vựng.
5646 \item Từ có trong từ điển thị bắt lỗi ở cấp cú pháp.
5647 \end{itemize}