Khối chuẩn hóa văn bản

Một phần của tài liệu Thiết kế board nhúng hệ điều hành linux, xây dựng ứng dụng tổng hợp tiếng việt trong đọc báo điện tử (Trang 72 - 77)

CHƯƠNG 3: XÂY DỰNG HỆ THỐNG TTS TIẾNG VIỆT VÀ ỨNG DỤNG ĐỌC BÁO ĐIỆN TỬ

3.2. Phân tích và thực hiện giải thuật TTS

3.2.1. Khối chuẩn hóa văn bản

Khối chuẩn hóa chuyển đối các thành phần đặc biệt như số, ngày, tháng, ký hiệu, dấu câu, từ viết tắt … thành chữ viết đầy đủ để hệ thống có thể tổng hợp chính xác nội dung của văn bản đầu vào. Quá trình chuẩn hóa gồm hai phần: phần chuẩn hóa nhóm các đối tượng có quy luật và phần chuẩn hóa từ viết tắt, tiếng nước ngoài. Đề tài sử dụng phương pháp thống kê để xây dựng các tập luật cho các đối tượng có chung quy luật như ngày, tháng, năm, số ... và xây dựng các bộ từ điển từ viết tắt, từ điển phiên âm tiếng nước ngoài thông dụng.

Biểu thức chính quy sử dụng kết hợp với các tập luật để xác định các đối tượng như: thứ trong tuần, ngày, tháng, khoảng thời gian, chiều dài, diện tích… Sau khi xác định, các đối tượng được thay thế bằng chữ viết in hoa đầy đủ. Các đối tượng từ viết tắt và tiếng nước ngoài được chuẩn hóa bằng cách tra từ điển từ viết tắt và từ điển phiên âm. Hầu hết các đối tượng được chuẩn hóa, tuy nhiên một số trường hợp như:

từ nước ngoài hay từ viết tắt … không có trong từ điển sẽ không chuẩn hóa được. Các đối tượng này được giải quyết bằng cách đánh vần chữ cái của từng đối tượng.

3.2.1.1. Lưu đồ giải thuật của khối Chuẩn hóa văn bản

Đọc nội dung văn bản Bắt đầu

Chuyển đổi thành chữ in hoa

Văn bản có mẫu pattern[n]

Gọi hàm chuẩn hóa f[n]

Đ

Thay thế chuỗi trùng khớp bằng chuỗi chuẩn hóa

S n++

Pattern[n] == NULL? S Đ

Lưu văn bản đã chuẩn hóa

Kết thúc

Hình 3-2 Lưu đồ giải thuật khổi chuẩn hóa văn bản Giải thích sơ đồ khối:

- Sau khi đọc file văn bản, chương trình thực hiện việc chuyển đổi toàn bộ các từ trong văn bản thành chuỗi in hoa để đồng nhất với định dạng các từ trong

- Chương trình bắt đầu thực hiện tìm kiếm các chuỗi có dạng giống với mô tả

được định nghĩa trong mảng pattern[]. Cấu trúc của mảng pattern này sẽ được thảo luận chi tiết ở các mục tiếp theo.

- Khi một chuỗi được phát hiện có dạng trùng với dạng được mô tả, hàm chuẩn hóa tương ứng sẽ được thực thi nhằm biến đổi chuỗi trùng khớp thành dạng chuỗi đầy đủ. Ví dụ, chuỗi “30.12.2014” sẽ được biến đổi thành

“NGÀY BA MƯƠI THÁNG MƯỜI HAI NĂM HAI NGÀN KHÔNG TRĂM MƯỜI BỐN”.

Quá trình diễn ra cho đến khi văn bản không còn chuỗi nào trùng khớp với các dạng chuỗi mô tả nữa. Chương trình sẽ được kết thúc sau khi file văn bản chuẩn hóa được lưu và giải phóng các vùng nhớ đã được cấp phát.

Quá trình chuẩn hóa cực kỳ quan trọng trong hệ thống TTS vì nó quyết định mức độ bất thường trong phát âm. Vì hướng tới ứng dụng đọc báo điện tử nên các từ thường được viết tắt hoặc tiếng ngoài thường xuất hiện trên các trang báo sẽ được quy ước trong từ điển từ viết tắt và từ điển phiên âm tiếng nước ngoài. Quá trình chuẩn hóa sẽ sử dụng hai từ điển này để chuẩn hóa văn bản.

Báo điện tử rất nhiều và linh động trong từ ngữ, các từ viết tắt và tiếng nước ngoài có thể chỉ xuất hiện một vài lần trong các tin tức. Do vậy, từ điển từ viết tắt và từ điển phiên âm tiếng nước ngoài không thể bao quát tất cả các trường hợp được. Nhưng người dùng có thể cập nhập thêm vào hai từ điển này một cách dễ dàng, vì nó chỉ là file văn bản quy ước các từ viết tắt hoặc phiên âm tiếng nước ngoài thành cụm các từ tiếng Việt có phát âm gần giống, nhờ vậy quá trình chuẩn hóa sẽ tốt hơn.

3.2.1.2. Biểu thức chính quy

Biểu thức chính quy (tiếng Anh: regular expression, viết tắt là regexp, regex hay regxp) miêu tả một tập hợp các chuỗi khác, theo những quy tắc cú pháp nhất định.

Biểu thức chính quy thường được dùng trong các trình biên tập văn bản và các tiện ích tìm kiếm và xử lý văn bản dựa trên các mẫu được quy định.

Trong bộ thư viện GNU C đã có tích hợp sẵn thư viện regex. Để sử dụng được thư viện này, chúng ta chỉ cần khai báo header regex.h. Công việc tiếp theo, chúng ta cần định nghĩa mẫu mô tả những chuỗi cần tìm kiếm theo một cấu trúc quy định. Một số kí tự đặc biệt sử dụng trong biểu thức chính quy bao gồm:

- ‘?’: chỉ định rằng có không hoặc một phần tử phía trước. Ví dụ, chuỗi mô tả

“ab[c]?” sẽ trùng khớp với “ab” hoặc “abc” nhưng không trùng khớp với

“abcc”

- ‘*’: chỉ định rằng có không hoặc nhiều hơn phần tử phía trước. Ví dụ, chuỗi mô tả “a*b” sẽ trùng khớp với chuỗi “b”, “ab”, “aaab”

- ‘+’: chỉ định rằng có một hoặc nhiều hơn phần tử phía trước. Ví dụ, chuỗi mô tả “ab+c” trùng khớp với “abc”, “abbc”, “abbbc” nhưng không trùng khớp với chuỗi “ac”

- ‘.’: Kí tự đặc biệt chỉ định rằng sẽ trùng khớp với bất kì kí tự đơn trừ kí tự xuống dòng. Ví dụ “a.b” sẽ trùng khớp bất kì chuỗi 3 kí tự nào bắt đầu bằng a và kết thúc bằng b như “a1b”, “a2b” …

- ‘^’: Kí tự chỉ định sẽ trùng khớp với vị trí ở đầu chuỗi. Ví dụ mẫu “^ab” sẽ trùng khớp với các chuỗi bắt đầu là “ab” như “abcd”, “abef” và không trùng khớp với các chuỗi “xab”

- ‘$’: Kí tự chỉ định sẽ trùng khớp với vị trí kết thúc chuỗi. Ví dụ mẫu “x+$”

sẽ trùng khớp với các chuỗi kết thúc bằng kí tự “x”

- ‘[…]’: chỉ định sẽ trùng khớp với bất kì kí tự nào trong ngoặc. Ví dụ “[ad]”

sẽ trùng khớp với chuỗi chỉ chứa “a” hoặc “d”. Do đó, chuỗi “c[ad]*r” trùng khớp với chuỗi “cr”, “car”, “cdr”, “caddaar” …

- ‘[^…]: chỉ định sẽ trùng khớp với bất kì kí tự nào không có trong ngoặc. Ví dụ “[^ab]cd” sẽ trùng khớp các chuỗi “ecd”, “xcd” và không trùng khớp với các chuỗi “acd”, “bcd”

- ‘(…): chỉ định nhóm một chuỗi con trong một chuỗi lớn

- ‘|’: chỉ định sẽ trùng khớp với 1 trong hai chuỗi kế cận nó. Ví dụ “(ab|cd)ef”

sẽ trùng khớp với chuỗi có dạng “abef” hoặc “cdef”

- ‘\’: dùng để quote kí tự đặc biệt theo sau để nó trở thành kí tự thường. Ví dụ chuỗi “\?” chỉ trùng khớp với chuỗi “?”

Một số lớp kí tự (character classes) dùng trong biểu thức chính quy gồm:

- [:ascii:]: sẽ trùng khớp với bất kì kí tự ascii nào (mã từ 0-127) - [:alnum:]: sẽ trùng khớp với bất kì kí tự chữ cái hoặc số - [:alpha:]: sẽ trùng khớp bất kì kí tự chữ cái

- [:blank:]: sẽ trùng khớp với bất kì kí tự khoảng trắng (tab hoặc space) - [:digit:]: sẽ trùng khớp với các kí tự chữ số (0 –9)

- [:lower:]: sẽ trùng khớp với bất kì tự chữu cái viết thường - [:upper:]: sẽ trùng khớp với bất kì kí tự chữ cái viết hoa

Để có thể phát hiện chính xác các chuỗi đặc biệt trong văn bản, cần thiết kể các mẫu biểu thức chính quy phù hợp. Ví dụ mẫu biểu thức chính quy dưới đây dùng để phát hiện các chuỗi có dạng ngày tháng năm "NGÀY dd.mm.yyyy":

“(NGÀY )*([[:digit:]]\{1,2\})\.([[:digit:]]\{1,2\})\.([[:digit:]]\{4\})”

Danh sách các mẫu biểu thức chính quy và các dạng chuỗi trùng khớp của nó sẽ được nêu ở Phần Phụ Lục.

Sau khi đã định nghĩa, các mẫu biểu thức chính quy cần được biên dịch trước khi bắt đầu quá trình tìm kiếm. Hai cấu trúc dữ liệu quan trọng trong biểu thức chính quy của GNU gồm:

- regex_t: cấu trúc lưu trữ các thông tin về mẫu biểu thức chính quy đã được biên dịch

- regmatch_t: là một struct gồm hai phần tử rm_so và rm_eo dùng để xác định vị trí bắt đầu và kết thúc của chuỗi trùng khớp

Để biên dịch chuỗi biểu thức chính quy, sử dụng hàm sau:

regcomp(&regex, “mẫu biểu thức chính quy”, REG_EXTENDED);

Trong đó:

- REG_EXTENDED là cờ báo biên dịch mẫu biểu thức chính quy theo kiểu mở rộng

Để bắt đầu tìm kiếm các dạng chuỗi trùng khớp chúng ta sử dụng hàm sau:

regexec(&regex, string, pmatch, count, FLAG);

Trong đó:

- regex là kiểu dữ liệu regex_t đã được biên dịch ở trên - string là chuỗi kí tự cần tìm kiếm

- pmatch là một mảng có kiểu dữ liệu regmatch_t. Khi phát hiện ra trùng khớp, pmatch[0].rm_so sẽ là vị trí bắt đầu của chuỗi trùng khớp, pmatch[0].rm_eo sẽ là vị trí kết thúc của chuỗi trùng khớp. Các phần tử còn lại trong mảng pmatch[n].rm_so và pmatch[n].rm_eo sẽ là vị trí bắt đầu và kết thúc của các chuỗi con khác trong mẫu biểu thức chính quy

- count là số phần tử có trong mảng pmatch

- FLAG: có thể là REG_NOTBOL để không sử dụng kí tự trùng khớp đầu dòng ‘^” hoặc REG_NOTEOL để không sử dụng kí tự trùng khớp cuối dòng

‘$’

Một phần của tài liệu Thiết kế board nhúng hệ điều hành linux, xây dựng ứng dụng tổng hợp tiếng việt trong đọc báo điện tử (Trang 72 - 77)

Tải bản đầy đủ (PDF)

(104 trang)