ĐẠI HỌC THÁI NGUN
TRƯỜNG ĐẠI HỌC CNTT & TRUYỀN THƠNG
HÀ DIỆU THÚY
NÉN DỮ LIỆU TIẾNG VIỆT SỬ DỤNG PHƯƠNG PHÁP
MÃ HĨA SỐ HỌC
Chun ngành: Khoa học máy tính
Mã số: 60 48 01
TĨM TẮT LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
Thái Ngun – 2013
Số hóa bởi trung tâm học liệu />
ii
Cơng trình được hồn thành tại
TRƯỜNG ĐẠI HỌC CNTT & TRUYỀN THƠNG
Người hướng dẫn khoa học: PGS.TS Nguyễn Hữu Điển
Phản biện 1: TS. Lê Quang Minh
Phản biện 2: TS. Trần Đức Sự
Luận văn sẽ được bảo vệ trước Hội đồng chấm luận văn họp tại:
Trường Đại học Cơng nghệ thơng tin & Truyền thơng
Vào hồi 11 giờ 00 ngày 09 tháng 11 năm 2013
Có thể tìm hiểu luận văn tại:
- Trung tâm học liệu Đại học Thái Ngun
- Thư viện trường Đại học CNTT & Truyền thơng Thái Ngun
Số hóa bởi trung tâm học liệu /> 1
MỞ ĐẦU
1. Đặt vấn đề
Nén dữ liệu là một kỹ thuật quan trọng trong rất nhiều lĩnh vực khác
nhau. Chính nhờ có kỹ thuật nén dữ liệu mà ngày nay chúng ta có những
phương tiện truyền thơng hiện đại phục vụ cho cuộc sống như truyền hình
cáp, truyền hình số, điện thoại, internet, các hệ thống lưu trữ, văn bản và rất
nhiều khía cạnh khác. Do đó kỹ thuật nén dữ liệu ngày càng được quan tâm
và phát triển nhiều hơn.
Tiếng Việt là một ngơn ngữ thuộc hệ thống chữ cái Latinh, sử dụng
nhiều dấu đi kèm với ngun âm, ngồi bảng chữ cái của tiếng Anh, tiếng
Việt còn có thêm các ký tự:
Sáu ngun âm a, e, i, o, u, y với 5 dấu thanh (sắc, huyền, hỏi, ngã,
nặng) tổ hợp thành 30 ký tự.
Sáu ngun âm ă, â, ê, ơ, ơ, ư với sáu dấu thanh (sắc, huyền, hỏi, ngã,
nặng, khơng dấu) tổ hợp thành 36 ký tự.
Một phụ âm đặc biệt đ.
Vậy cần thêm (30 + 36 +1) x 2 = 134 ký tự cho tiếng Việt.
Với bảng mã ASCII 8 bit sử dụng phổ biến trên máy tính, chúng ta có
thể mã hóa 256 ký tự. Tuy nhiên, các ký tự có mã từ 0 đến 127 đã được chuẩn
hóa và thuộc diện “cấm vi phạm” vì vậy chỉ còn 128 chỗ (mã từ 128 đến 255)
là được “tự do”. Vậy nếu xây dựng mỗi chứ ứng với một mã thì sử dụng hết
vùng tự do mà vẫn thiếu 134 – 128 = 6 chỗ.
Hiện nay chúng ta đang sử dụng chuẩn Unicode để lưu trữ các ký tự
tiếng Việt. Như chúng ta biết chuẩn Unicode là chuẩn 2byte, do vậy khi lưu
trữ các văn bản tiếng Việt trên các hệ thống lưu trữ sẽ xẩy ra tình trạng dư
thừa dữ liệu. Điều này dẫn đến việc lưu trữ và xử lý sẽ lãng tài ngun hệ
Số hóa bởi trung tâm học liệu /> 2
thống, khi truyền tải trên các đường truyền mạng sẽ chiếm băng thơng nhiều
hơn. Từ các u cầu thực tế đó đòi hỏi chúng ta phải loại bỏ sự dư thừa dữ
liệu đó trước khi lưu trữ và xử lý. Chính vì thế em chọn đề tài “Nén dữ liệu
tiếng Việt sử dụng thuật tốn mã hóa số học”
2. Đối tượng và phạm vi nghiên cứu
- Các chuẩn lưu trữ tiếng Việt (Unicode, TCVN3, VNI-Vindows…)
- Các phương pháp và kỹ thuật nén dữ liệu
- Các phần mềm nén dữ liệu hiện nay
3. Hướng nghiên cứu đề tài
- Nghiên cứu các phương pháp nén dữ liệu như nén bảo tồn dữ liệu
(lossless data compression)
và nén mất mát dữ liệu (lossy data compression).
- Nghiên cứu các kỹ thuật nén dữ liệu như: kỹ thuật xử lý sự lặp lại của
xâu (RLE), mã hóa Huffman, kỹ thuật nén LZW (Lempel - Zip và Welch)…
- Nghiên cứu về kỹ thuật nén bảo tồn dữ liệu Arithmetic Coding
(Phương pháp mã hóa số học).
- Cài đặt thực nghiệm việc nén dữ liệu bằng Arithmetic Coding.
- Phân tích, so sánh và đánh giá kết quả thực nghiệm với các kỹ thuật
nén dữ liệu (văn bản tiếng Việt) khác.
Số hóa bởi trung tâm học liệu /> 3
4. Phương pháp nghiên cứu
- Nghiên cứu các tài liệu về các kỹ thuật mã hóa và nén dữ liệu.
- Tìm hiểu các chuẩn tiếng Việt hiện nay ở Việt Nam.
- Khảo sát thực tế các phần mềm nén dữ liệu hiện nay đối với việc nén
các văn bản tiếng Việt.
- Phân tích, đánh giá các kỹ thuật (thuật tốn) nén dữ liệu.
- Cài đặt kỹ thuật nén Arithmetic Coding
- Triển khai thử nghiệm trên các loại dữ liệu văn bản tiếng Việt.
5. Ý nghĩa khoa học và ý nghĩa thực tiễn của đề tài
- Nghiên cứu hồn thiện các kỹ thuật nén bảo tồn dữ liệu cho các văn
bản tiếng Việt.
- Xây dựng ứng dụng nén dữ liệu cho các văn bản tiếng Việt.
Số hóa bởi trung tâm học liệu /> 4
Chương 1: TỔNG QUAN VỀ NÉN DỮ LIỆU
1.1. Tổng quan về nén dữ liệu
1.1.1. Sơ lược về nén dữ liệu
1.1.1.1 Khái niệm nén dữ liệu
Nén dữ liệu là q trình làm giảm lượng thơng tin “dư thừa” trong dữ
liệu gốc và do vậy, lượng thơng tin thu được sau nén thường nhỏ hơn so với
dữ liệu gốc rất nhiều.
1.1.1.2 Ngun tắc nén dữ liệu
Thơng thường, hầu hết các tập tin trong máy tính có rất nhiều thơng tin
dư thừa, việc thực hiện nén tập tin thực chất là mã hố lại các tập tin để loại
bỏ các thơng tin dư thừa.
Nhìn chung khơng thể có phương pháp nén tổng qt nào cho kết quả
tốt đối với tất cả các loại tập tin vì nếu khơng ta sẽ áp dụng n lần phương pháp
nén này để đạt được một tập tin nhỏ tuỳ ý. Kỹ thuật nén tập tin thường được
áp dụng cho các tập tin văn bản (Trong đó có một số kí tự nào đó có xác suất
xuất hiện nhiều hơn các kí tự khác), các tập tin ảnh bitmap (Mà có thể có
những mảng lớn đồng nhất), các tập tin dùng để biểu diễn âm thanh dưới dạng
số hố và các tín hiệu tương tự (analog signal) khác (Các tín hiệu này có thể
có các mẫu được lặp lại nhiều lần). Ðối với các tập tin nhị phân như tập tin
chương trình thì sau khi nén cũng khơng tiết kiệm được nhiều.
Ngồi ra, trong một số trường hợp để nâng cao hệ số nén người ta có
thể bỏ bớt một số thơng tin của tập tin.
1.1.2. Các phương pháp nén dữ liệu
1.1.2.1 Nén bảo tồn dữ liệu
Đó là mơ hình nén dữ liệu mà nó cho phép người sử dụng bảo tồn
thơng tin trong suốt q trình nén. Điều này được giải thích như sau:
Số hóa bởi trung tâm học liệu /> 5
Giả sử ta có dữ liệu nguồn là A và dữ liệu nén là A'. Sau khi ta giải nén
A' thì được tập A'' mà tập A'' hồn tồn giống với tập A ban đầu khi được giải
nén. Thơng thường, kỹ thuật này được áp dụng với các loại dữ liệu như văn
bản vì độ chính xác của văn bản.
1.1.2.2 Nén hao hụt dữ liệu
Trong kỹ thuật nén, bên cạnh nén bảo tồn thì người ta còn đưa ra khái
niệm nén khơng bảo tồn (hay còn gọi là nén hao hụt dữ liệu). Nén khơng bảo
tồn là mơ hình nén dữ liệu mà tính bảo tồn của dữ liệu khơng được coi
trọng. Nó có nghĩa là nếu ta có tập dữ liệu A, tập nén A' thì sau khi giải nén ta
thu được tập A'' khác tập A ban đầu. Kỹ thuật này thường áp dụng cho việc
nén dữ liệu là các loại tệp ảnh vì nói chung nó cũng khơng ảnh hưởng gì
nhiều đến hình dạng ảnh.
1.2 Các kỹ thuật nén dữ liệu văn bản
1.2.1 Xử lý lặp lại của xâu ký tự (Run – Length Encoding)
Mục đích của thuật tốn là tìm ra được ký tự lặp lại nhiều lần và số lần
lặp lại của ký tự đó, thay thế cụm lặp lại bằng một biểu diễn nhỏ gọn hơn.
Có thể biểu diễn rút gọn dưới dạng cặp 3 ký hiệu (r,s,l) với s là ký hiệu
của một dãy các ký tự nằm trong bảng chữ cái, r và l sẽ là các ký hiệu khơng
được xuất hiện trong bảng chữ cái, tùy từng trường hợp mà r và l lại có ý
nghĩa khác nhau.
Ví dụ: Cho chuỗi đầu vào là MMMMMMM (chữ M được lặp lại 7 lần),
chuỗi này có thể thay thế bằng (r,7,M) hay viết tắt là r7M. r với ý nghĩa ký
hiệu cho việc xuất hiện sự lặp lại (repeating) đòi hỏi chữ r khơng được xuất
hiện trong bảng chữ cái của đầu vào.
Cho chuỗi đầu vào là ABCDEFG (khơng xuất hiện sự lặp lại) chuỗi
này có thể thay thế bằng (n,7,ABCDEFGH), hay viết tắt là n7ABCDEFG. n
Số hóa bởi trung tâm học liệu /> 6
với ý nghĩa là ký hiệu cho việc khơng xuất hiện sự lặp lại (non-repeating), chữ
n khơng được xuất hiện trong bảng chữ cái đầu vào.
Thuật tốn này hiệu quả nếu như dữ liệu đầu vào gồm nhiều ký tự bị
lặp lại liên tiếp. Ký tự đầu vào có thể ở dạng chữ trong bảng chữ cái, có thể là
các bit 0, 1 nhị phân; các thơng số về màu của các điểm ảnh, cũng có thể là
các khối hợp thành của dữ liệu kiểu âm thanh. Trên thực tế, thuật tốn này
vẫn còn được áp dụng cho tới ngày nay: thuật tốn HDC (hardware data
compression), được sử dụng trong các ổ băng kết nối với hệ thống máy tính
IBM, và cả thuật tốn tương tự được dùng trong chuẩn SNA (System network
architecture) của IBM.
1.2.2 Mã hóa Huffman
1.2.2.1. Mã Huffman tĩnh
* Ngun lý:
Ngun lý của phương pháp Huffman là mã hố các bytes trong tệp
dữ liệu nguồn bằng biến nhị phân. Nó tạo mã độ dài biến thiên là một tập
hợp các bits. Đây cũng là một phương pháp nén kiểu thống kê, những ký
tự xuất hiện nhiều hơn sẽ có mã ngắn hơn.
Mã Huffman có một tính chất quan trọng: mã của một ký hiệu này
khơng thể là phần đầu của mã một ký hiệu khác.
Nếu như một ký hiệu được mã hố bằng tổ hợp nhị phân 101 thì tổ
hợp 10110 khơng thể là mã của một ký hiệu khác trong tệp nguồn. Do đó
khi giải mã cần phải đọc lần lượt các bit cho đến khi gặp mã của ký hiệu
nào đó.
* Thuật tốn:
Việc xây dựng cây mã hố Huffman được tiến hành bởi một thuật
tốn khác với thuật tốn Fano - Shannon. Nếu như cây Fano - Shannon
được xây dựng từ trên xuống dưới bằng cách chia đơi và gán cho mỗi
Số hóa bởi trung tâm học liệu /> 7
phần 1 bít, cơng việc kết thúc khi khơng thể tiến hành phân chia tiếp thì
cây Huffman lại được thiết kế từ dưới lên, bắt đầu từ các lá của cây và
cơng việc kết thúc tại điểm gốc.
Ví dụ :
Cho mơ hình nguồn có các trạng thái và tần suất tương ứng như sau:
(A, 0.2); (E, 0.3); (I, 0.1), (0. 0,2); (U, 0.1); (Ơ, 0.1) ta có:
Ký tự Tần xuất Mã 0 1
A 0.2 10
E 0.3 01
I 0.1 001
O 0.2 11
U 0.1 0000
Ơ 0.1 0001
Bước1: Nhóm 2 chữ cái có tần suất nhỏ nhất tạo ra chữ cái kép. Sau
mỗi lần nhóm số chữ cái ít đi 1.
c -> 0.3 e -> 0.3 e -> 0.3 {a, 0} -> 0.4 {{{u, ơ},:}
a -> 0.2 a -> 0.2 {{u,ơ},i} -> 0.3 e -> 0.3 {a, o{ ->
o -> 0.2 o -> 0.2 a -> 0.2 {{u, ơ}, i} -> 0.3
i -> 0.1 {u,ơ} -> 0.2 o -> 0.2
u -> 0.1 i -> 0.1
ơ -> 0.1
Bước 2: Tạo cây phân nhánh ngược với q trình nhóm từ nhánh
trái có mã 0, nhánh phải mã 1.
0 1
0 1 0 1
0 1 e a o
0 1 i
u ơ
Số hóa bởi trung tâm học liệu /> 8
{{{{u, ơ}, 1}, e}, {a, o}}
0 1
{{{u, ơ}, i}, e} {a, o}
0 10 1
{{{ u, ơ}, i}, e a o
0 1
{u, ơ} i
0 1
u ơ
Vậy mã của ký tự là: u -> 0000; e -> 01
ơ -> 0001; a -> 10
i -> 001; o -> 11
Thuật tốn nén:
Bước 1: Tìm hai ký tự có trọng số nhỏ nhất ghép lại làm một, trọng số của ký
tự mới bằng tổng trọng số của hai ký tự đem ghép.
Bước 2: Trong khi số lượng ký tự trong danh sách còn lớn hơn một thì thực
hiện bước một, nếu khơng thì thực hiện bước ba.
Bước ba: Tách ký tự cuối cùng và tạo cây nhị phân với qui ước bên trái mã 0,
bên phải mã 1.
Thuật tốn giải nén:
Bước 1: Đọc lần lượt từng bit trong tập tin nén và duyệt cây nhị phân đã được
xác định cho đến khi hết một lá. Lấy ký tự ở lá đó ghi ra tệp giải nén.
Bước 2: Trong khi chưa hết tập tin nén thì thực hiện bước một, ngược lại thực
hiện bước ba.
Bước 3: Kết thúc thuật tốn.
Số hóa bởi trung tâm học liệu /> 9
Một số những hạn chế của mã Huffman:
+ Mã Huffman chỉ thực hiện được khi biết được tần xuất xuất hiện của
các ký tự.
+ Mã Huffman chỉ giải quyết được độ dư thừa phân bố ký tự.
+ Huffman tĩnh đòi hỏi phải xây dựng cây nhị phân sẵn chứa các khả
năng. Điều này đòi hỏi thời gian khơng ít do ta khơng biết trước kiểu dữ liệu
sẽ được thực hiện nén.
+ Q trình giải nén phức tạp do chiều dài mã khơng biết trước cho đến
khi ký tự đầu tiên được tìm ra.
1.2.2.2. Thuật tốn Huffman động
Trong thuật tốn Huffman động chúng ta sử dụng hai cây nhị phân cân và một
của sổ χ.
Khái niệm cửa sổ χ:
Cửa sổ χ là một số lượng rất lớn các ký tự được thêm vào cây nhị phân
Huffman trong q trình nén văn bản.
Trong q trình nén dữ liệu, ta tiến hành thống kê các ký tự. Nhờ việc thống
kê này mà sinh ra bộ nén.
Thuật tốn nén:
Bước 1: Khởi tạo bảng mã Huffman(front tree) với ký tự đặc biệt, có số đếm
bằng 1.
Bước 2: Tạo mã thứ tự theo ngun tắc cân bằng.
Bước 3: While not eof(f) do
Begin
Getchar-> ch
If ch thuộc bảng mã thứ tự then
Begin
Ghi mã 0/1 của ký tự đó và ký tự đặc biệt ra tệp đích
Xóa ký tự đó ở bảng mã thứ tự, thêm ký tự đó vào bảng mã Huffman
(trong cây front tree) với số đếm bằng 1.
End Else
Begin
Số hóa bởi trung tâm học liệu /> 10
If ch thuộc bảng mã Huffman then
Begin
Tăng số đếm của ký tự đó lên một đơn vị
If số đếm của ký tự đó lớn hơn số đếm của ký tự ngay trên nó then
Begin
Đổi chỗ hai ký tự đó
End;
Ghi mã 0/1 của ký tự đó và ký tự đặc biệt ra tệp đích
End;
End;
If số lượng ký tự trong bảng mã Huffman>=χ then
Begin
Tìm một ký tự, giảm số đếm của ký tự đó đi một đơn vị
If dưới ký tự đó là ký tự đặc biệt then
Giảm số đếm của ký tự đặc biệt đi một đơn vị
Begin
If số đếm của ký tự sau khi giảm < số đếm của ký tự dưới nó then
Begin
Đổi chỗ
End;
End;
If số đếm của ký tự đó bằng khơng then
Begin
Loại ký tự đó ra khỏi bảng mã Huffman.
Tăng số lượng ký tự ở cây thứ tự lên một.
Giảm số lượng ký tự ở cây Huffman đi một.
Thêm ký tự vừa loại ra khỏi bảng mã Huffman đó và bảng mã thứ
tự ở vị trí đầu tiên.
End;
Tạo lại bảng mã thứ tự, mã Huffman cho bảng mã Huffman theo
ngun tắc cân bằng.
End;
Số hóa bởi trung tâm học liệu /> 11
Bước 4: Dừng chương trình.
Thuật tốn giải nén:
Bước 1: Khởi tạo bảng mã thứ tự theo ngun tắc cân bằng
Bước 2: While not eof(f) do
Begin
Lấy ra lần lượt từng ký tự và gán chuỗi ư cho đến khi gặp ký tự đặc
biệt.
If ký tự đặc biệt đó chỉ tới bảng mã thứ tự then
Begin
Tra trong bảng mã thứ tự và ghi ký tự đó ra tệp đích.
Thêm ký tự đó vào bảng mã Huffman với số đếm bằng 1.
End;
If ký tự đặc biệt đó chỉ tới bảng mã Huffman then
Begin
Tra trong bảng mã Huffman và ghi ký tự đó ra tệp đích.
Tăng số đếm của ký tự lên 1 đơn vị.
If số đếm của ký tự đó lớn hơn số đếm của ký tự trên nó then
Begin
Đổi chỗ.
End;
End;
If số lượng ký tự trong bảng mã Huffman>=χ then
Begin
Tìm ký tự nào đó giảm đi 1 đơn vị.
If số đếm của ký tự đó < số đếm của ký tự đứng trước nó then
Begin
If bên dưới nó là ký tự đặc biệt then
Giảm số đếm của ký tự đặc biệt đó đi 1.
Đổi chỗ hai ký tự đó.
End;
If số đếm của ký tự đó sau khi giảm đi 1 bằng khơng then
Begin
Số hóa bởi trung tâm học liệu /> 12
Tăng số lượng ký tự ở cây thứ tự lên một.
Giảm số lượng ký tự ở cây Huffman đi một.
Loại ký tự đó ra khỏi bảng mã Huffman.
Thêm ký tự vừa loại ra vào bảng mã thứ tự.
End;
Tạo lại mã cho bảng mã thứ tự, bảng mã Huffman theo ngun lý
cân bằng.
End;
Bước 4: Kết thúc.
Đánh giá: Q trình mã và giải mã tương đối chậm do phải xây dựng cây nhị
phân ứng với dữ liệu nhập. Thuật tốn nén Huffman thường được dùng để
nén các tệp dạng văn bản, các tệp có kích thước lớn.
1.2.3. Thuật tốn LZW
Thuật tốn này là sự chuyển giao của thuật tốn LZ78. Như chúng ta đã
biết ở thuật tốn LZ78, việc lưu trữ các ký tự theo sau mỗi đoạn thường gây
lãng phí về bộ nhớ nên hiệu quả nén khơng cao. Thuật tốn LZW quản lý
bằng cách loại bỏ ký tự sau mỗi đoạn do đó đầu ra của mỗi đoạn chỉ chứa con
trỏ mà thơi. Thuật tốn này lưu trữ bằng việc chuẩn bị một danh sách các
đoạn bao gồm rất nhiều ký tự trong đầu vào là một bảng chữ cái nào đó, nó
thực hiện một q trình mở rộng các bảng chữ cái hay nói cách khác là nó
dùng ký tự bổ sung để biểu diễn lại các chuỗi của ký tự chính quy. Để nén
LZW trên mã ASCII 8 bits ta cần mở rộng bảng chữ cái bằng cách dùng 9 bits
hay nhiều hơn 256 ký tự bổ sung mà mã 9 bits cung cấp được dùng để lưu trữ
các chuỗi mã được quyết định từ các chuỗi trong nguồn tin. Thuật tốn sẽ
khơng đạt hiệu quả nén cao nếu có những điều kiện sau:
+ Nguồn tin khơng đồng nhất và đặc tính dư thừa của nó thay đổi trong
suốt tập tin.
+ Nguồn tin dài một cách đáng kể vượt q tầm giới hạn của bảng
chuỗi.
Thuật tốn nén:
Bước 1: Thống kê tạo ra từ diển, ghi vào tệp nén, t:=false
Số hóa bởi trung tâm học liệu /> 13
đọc ký tự đầu tiên -> w
Bước 2: While not eof(f) do
Begin
Đọc một ký tự -> ch
if t=false then w:=w+ch
else
begin
w:=ww+ch;t:=false;
end;
TIMCHU(w,tl);
If tl=false then
Begin
Code(ư,j);
Ghi j ra tệp nén.
Thêm w vào từ điển.
w:=ch;
end else
begin
ww:=w;
t:=true;
end;end;
Bước 3: Code(ch), Dừng chương trình.
Thuật tốn giải nén:
Bước 1: Đọc thơng tin từ điển ở trong tệp nén, đọc byte tiếp theo và giải
nén gán vào w, t=false;
Bước 2: While not eof(f) do
Begin
Đọc byte tiếp theo -> b
Decode(b,s,t);
If t=true then
Begin
Số hóa bởi trung tâm học liệu /> 14
For i:=1 to length(s) do
Begin
If t=false then w:=w+s(i)
Else begin
w:=ww+s(i); t:=false; end;
TIMCHU(w,t);
If t=false then
Begin
Thêm vào từ điển.
Ghi ra tệp giải nén.
W:=s(i);
End;end;
End
Else
Begin
Ghi ra tệp giải nén;
w:=w+w(i);
thêm w vào từ điển
End;
End;
Bước 3: Decode(b,s,t); ghi s ra tệp giải nén. Dừng chương trình.
Đánh giá: Thuật tốn LZW đã khắc phục được sự lãng phí về bộ nhớ mà các
thuật tốn trước khơng tận dụng được hết. Thuật tốn có thời gian chạy
chương trình nhanh nếu chúng ta sử dụng cấu trúc cây( nhị phân, tam phân).
Một trong những ưu điểm nữa là thuật tốn có hiệu quả nén cao.
1.2.4. Phương pháp mã hóa số học (Arithmetic Coding)
Phương pháp này giống với mã hóa Huffman ở chỗ nó cũng dựa trên
bảng chữ cái và tần số xuất hiện của từng chữ, nó cũng có thể áp dụng dạng
động hoặc dạng tĩnh dựa vào việc thay đổi các khoảng tần số trong q trình
mã hóa.
Số hóa bởi trung tâm học liệu /> 15
Mục đích của phương pháp là tìm ra một khoảng duy nhất thể hiện một
chuỗi ký tự có độ dài cố định, tiếp theo cần chọn trong khoảng này một số
thập phân thích hợp, và coi đấy là mã biểu diễn cho chuỗi ký tự trên. Q
trình mã hóa được khởi tạo với khoảng ban đầu là [0, 1).
Ví dụ:
Cho tần số xuất hiện ký tự A là 1/4 và tần số xuất hiện ký tự B là 3/4.
Xét việc mã hóa trong trường hợp chuỗi mã hóa là những ký tự đơn.
Chia [0, 1) thành hai nửa, nửa [0, 1 4) biểu diễn cho A và nửa [1 4 , 1)
biểu diễn cho B. Có thể chọn mã hóa cho A là 0, và cho B là 0.5.
0 1
0 A 1/4 B 1
Cho tần số xuất hiện ký tự A là 1/4 và tần số xuất hiện ký tự B là 3/4.
Xét việc mã hóa trong trường hợp chuỗi mã hóa là hợp thành của 2 ký tự một
p
A
=1/4, p
B
=3/4, p
AA
= p
A
x p
A
= 1/16
,
p
AB
= p
A
x p
B
= 3/16, p
BA
= p
B
x
p
A
= 3/16
,
p
BB
= p
B
x p
B
= 9/16
0 1
A B
AB BA BB
Số hóa bởi trung tâm học liệu /> 16
Sau khi đã chia được các khoảng cho mỗi ký tự đơn, tiếp tục chia các
khoảng của bước trước cho 2 ký tự ghép. Cụ thể là khoảng [0, 1/ 4) của A
được chia thành hai khoảng cho AA, AB dựa vào tần số xuất hiện của chúng.
Thực hiện chia khoảng cho BA, BB dựa vào khoảng chia cho B tương tự.
Thuật tốn tổng qt:
Cho bảng chữ cái S = (s
1
, s
2
, … , s
n
) và tần số xuất hiện từng ký tự là
P = (p
1
, p
2
, … , p
n
). Dựa vào tần số xuất hiện để chia khoảng [0,1) thành n
mảnh thể hiện của n ký tự:
Đầu vào của q trình giải mã là một phân số thập phân, và đầu ra là
một chuỗi ký tự, q trình mã hóa và giải mã đối với thuật tốn này là tương
đồng.
Thuật tốn được áp dụng hiệu quả đối với những bảng chữ cái nhỏ, nó
có ứng dụng cao chỉ sau mã hóa Huffman. Thuật tốn QM áp dụng cho ảnh,
PPM áp dụng cho văn bản, đều dựa trên nền của phương pháp số học dưới
dạng động. Thuật tốn PPM quan tâm tới những chuỗi ký tự có tần số xuất
hiện cao để ưu tiên mã hóa ít tốn kém bộ nhớ nhất. Với mỗi ký tự là đầu vào
của thuật tốn, chuơng trình tiến hành phân tích sự xuất hiện của ký tự này
trong các chuỗi đã được mã hóa ở các bước trước nhằm tìm ra chuỗi có tần số
xuất hiện cao chứa ký tự vừa đọc. Khi thực hiện chia khoảng [0, 1), chọn giá
trị biểu diễn của một chuỗi ký tự, sử dụng các thơng tin về tần số xuất hiện để
tiến hành ưu tiên đúng đối tượng.
1.2.5 Mã hóa kiểu từ điển
Kỹ thuật này đã được 1 bài báo xuất bản vào năm 1967 khẳng định:
"Phương pháp nén tốt nhất có thể đạt được đó là việc thay thế các xâu ký
tự thường xun lặp đi, lặp lại nhiều lần bằng chỉ số mà nó đã xảy ra
trong q khứ". Phương pháp thay một đoạn ký tự bằng vị trí một đoạn
Số hóa bởi trung tâm học liệu /> 17
giống hệt nó trong q khứ được gọi là Ziv - Lempel do 2 nhà bác học
Jacob Zib và Abraham Lempel phát triển năm 1977. Như vậy ta có:
Kỹ thuật từ điển là kỹ thuật sử dụng phương pháp phân đoạn văn
bản thành các đoạn nhỏ hơn sao cho nó đạt được độ dài nhất có thể được
mà nó đã xuất hiện ở trong q khứ.
Định nghĩa (phân đoạn văn bản)
Phân đoạn văn bản A là chia nó ra thành các đoạn nhỏ hơn. Mỗi
đoạn được gọi là một phân đoạn.
Giả sử chúng ta có từ điển D thì tồn tại một ánh xạ f: D -> Ω trong
đó Ω là tập các đoạn bit 0/1. Việc nén sẽ tối ưu khi chúng ta phân được
đoạn văn bản có độ dài lớn nhất mà sao cho khi đi tìm trong q khứ thì
chúng ta được đoạn 0/1 trong Ω là nhỏ nhất.
Trong kỹ thuật từ điển, tương tự như kỹ thuật thống kê, ta cũng có
hai phương án sau:
+ Mã tĩnh (từ điển tĩnh).
+ Mã động (từ điển động).
1.2.5.1. Từ điển tĩnh
Mã có từ điển cố định được gọi là mã tĩnh hay nói cách khác là từ
điển tĩnh.
Một số những nhược điểm của từ điển tĩnh:
+ Kích thước của từ điển tĩnh khơng thể mở rộng ra, để cập nhật các
thơng tin mới so với các loại dữ liệu khác.
+ Q trình nghiên cứu thiết kế từ điển đòi hỏi nhiều cơng sức.
+ Các thuật tốn sử dụng từ điển tĩnh chạy tương đối chậm.
+ Tốn khơng gian lưu trữ dữ liệu.
Số hóa bởi trung tâm học liệu /> 18
Tuy nhiên bên cạnh những nhược điểm này thì từ điển tĩnh cũng có ưu
điểm là: Thiết kế các thuật tốn áp dụng cho việc tìm kiếm trên từ điển
tĩnh đơn giản tốn ít thời gian.
Do những đặc tính hạn chế của từ điển tĩnh, kết hợp với những đặc
điểm nổi bật của thuật tốn nén là "sự cứng nhắc" đã làm cho người dùng
chương trình để tiết kiệm bộ nhớ nhàm chán khơng thích sử dụng các
chương trình nén nữa. Vậy phải có cách để khắc phục những hạn chế đó
và làm cho chương trình nén dữ liệu trở nên mềm dẻo hơn. Chính vì vậy
những thuật tốn nén chỉ đạt hiệu quả cao nếu chúng ta xử lý tốt "từ điển"
được sử dụng trong các thuật tốn nói chung.
1.2.5.2. Từ điển động
Để khắc phục những hạn chế của từ điển tĩnh, biện pháp được xét
đến là:
Chúng ta khơng thiết kế một từ điển sẵn mà " từ điển" đó được xây
dựng trong q trình chạy chương trình. Một từ điển như vậy người ta gọi
là từ điển động.
Những đặc điểm chính của từ điển động:
+ Kích thước của từ điển có thể thay đổi tuỳ theo kích thước của tập
tin.
+ Khơng tốn thời gian lưu trữ từ điển.
+ Thời gian thực hiên q trình nén nhanh.
+ Từ điển khơng phụ thuộc vào kiểu dữ liệu.
+ Thời gian thực hiện q trình giải nén chậm.
Với từ điển động thì khơng những làm cho thuật tốn nén đạt hiệu
quả cao hơn, khắc phục được sự cứng nhắc của thuật tốn nén, góp phần
làm cho thuật tốn trở nên mềm dẻo hơn. Nhưng kích thước cảu từ điển
tăng lên rất nhanh khi các tập tin đem nén mà độ dư thừa của chúng
Số hóa bởi trung tâm học liệu /> 19
khơng cao. Vậy để tăng kích thước của từ điển và khơng làm cho chúng
lớn q mức bộ nhớ mà máy tính có thì chúng ta phải thực hiện xử lý từ
điển sao cho lượng thơng tin mà từ điển đó đem lại nén đạt hiệu quả cao
và cải thiện sự cứng nhắc của thuật tốn nén. Như chúng ta đều biết, việc
nén dữ liệu chẳng qua là việc mã các thơng tin thương xun xuất hiện
bằng một từ mã ngắn và thơng tin ít xuất hiện bằng từ mã dài và được lưu
trữ trong một từ điển. Vậy chúng ta có một số phương án sau:
+ Sử dụng loại mã có chiều dài cố định:
Trong phương án này, số bits cần nén dữ liệu cần được quyết định
trước khi tiến hành nén. Nén sử dụng số bits ít thì từ điển sẽ nhanh chóng
bị đầy do đó hiệu quả nén khơng cao. Ngược lại nếu chúng ta sử dụng số
bits q lớn thì sẽ gây lãng phí và cũng dẫn đến khơng có hiệu quả cao
trong việc nén.
+ Sử dụng loại mã có chiều dài thay đổi:
Phương án này nảy sinh một vấn đễ là chiều dài mã là bao nhiêu
hay nói cách khác đó là kích thước của mảng làm từ điển có phạm vi bao
nhiêu là phù hợp?. Nếu kích thước của từ điển nhỏ thì có ưu điểm trong
việc tìm kiếm trên từ điển vì vậy thuật tốn chạy nhanh khắc phục được
một hạn chế của thuật tốn nén là thời gian. Ngược lại nếu chúng ta sử
dụng một từ điển có kích thước lớn thì làm cho thuật tốn chạy chậm. Do
vậy chúng ta phải tìm ra kích thước của từ điển sao cho phù hợp để đảm
bảo thời gian thực hiện chương trình khơng q lâu mà vẫn đạt hiệu quả
nén cao. Để đạt được những u cầu trên người ta sử dụng loại mã có
chiều dài thay đổi từ 8 đến 13 bit. Có nghĩa là khi bộ nén dùng hết mã 8
bits thì nó sẽ dùng mã 9 bits, 10 bits, Tuy nhiên nếu dùng hết số bits cho
phép mà nguồn thơng tin vẫn còn thì chúng ta lại có cách giải quyết sau:
* Dừng q trình thêm các đoạn mới vào từ điển, tiến hành xố từ
điển hiện tại và bắt đầu xây dựng lại từ điển cho dữ liệu mới. Theo cách
Số hóa bởi trung tâm học liệu /> 20
nói trên thì phương pháp nén khá mềm dẻo nhưng hiệu quả nén lại khơng
cao do chúng ta khơng tận dụng được thơng tin trên từ điển cũ.
Tóm lại, mã có từ điển cố định được gọi là mã tĩnh và ngược lại nếu
từ điển biến đổi thì ta gọi đó là mã động.
Để tiến hành nén theo kỹ thuật từ điển ta có thuật tốn phân đoạn.
Đây chính là tiền đề cho hệ thống mã thuộc họ LZ. Thuật tốn phân đoạn
bao gồm 3 giai đoạn sau:
+ Bước 1: Phân đoạn văn bản theo một ngun lý nào đó.
+ Bước 2: Mã hố các đoạn văn bản đó.
+ Bước 3: Sử dụng một tập phân tích để nén.
Khơng thể có một cơ sở lý luận chắc chắn nào cho phép tìm thuật
tốn phân đoạn tốt nhất. Chúng ta cho rằng nếu xuất phát từ việc tìm lại
sự tương tự trong q khứ thì nén tìm sự tương tự nào gần giống nhất.
Chính vì thế mà các khúc khi phần ra từ văn bản nguồn nên được tính
tốn sao cho chúng là các phần dài nhất có thể lặp lại được trong q khứ.
Ngun lý như trên được gọi là ngun lý kinh nghiệm
Số hóa bởi trung tâm học liệu /> 21
Chương 2: NGHIÊN CỨU KỸ THUẬT NÉN VĂN BẢN
TIẾNG VIỆT SỬ DỤNG KỸ THUẬT MÃ HĨA SỐ HỌC
2.1 Các bảng mã tiếng Việt
2.1.1 Chuẩn lưu trữ Unicode
Unicode (hay gọi là mã thống nhất; mã đơn nhất) là bộ mã chuẩn quốc
tế được thiết kế để dùng làm bộ mã duy nhất cho tất cả các ngơn ngữ khác
nhau trên thế giới, kể cả các ngơn ngữ sử dụng ký tự tượng hình phức tạp
như tiếng Trung Quốc, tiếng Thái,.v.v. Vì những điểm ưu việt đó, Unicode đã
và đang từng bước thay thế các bộ mã truyền thống, kể cả bộ mã tiêu
chuẩn ISO 8859 và hiện đang được hỗ trợ trên rất nhiều phần mềm cũng như
các trình ứng dụng, chẳng hạn Windows.
2.1.1.1.Kho chữ
Unicode chiếm trước 1.114.112 (= 220+216) mã chữ, và hiện nay đã
gán ký hiệu cho hơn 96000 mã chữ. 256 mã đầu tiên phù hợp với ISO 8859-1,
là cách mã hóa ký tự phổ biến nhất trong "thế giới phương Tây"; do đó, 128
ký tự đầu tiên còn được định danh theo ASCII.
Khơng gian mã Unicode cho các ký tự được chia thành 17 mặt phẳng
(plane) và mỗi mặt phẳng có 65536 code point. Mặt phẳng đầu tiên (plane 0),
"Mặt phẳng đa ngơn ngữ căn bản" (Basic Multilingual Plane - BMP), là nơi
mà đa số các ký hiệu được gán mã. BMP chứa các ký hiệu cho hầu hết các
ngơn ngữ hiện đại, và một số lượng lớn các ký tự đặc biệt. Đa số các code
point được phân bố trong BMP được dùng để mã hóa các ngơn ngữ
CJKV (Hán-Nhật-Hàn-Việt).
Hai mặt phẳng tiếp theo được dùng cho các ký tự "đồ họa". Mặt
phẳng 1, "Mặt phẳng đa ngơn ngữ bổ sung" (Supplementary Multilingual
Plane - SMP), được dùng chủ yếu cho các loại chữ viết cổ, ví dụ Egyptian
hieroglyph (chưa được mã hóa), nhưng cũng còn được dùng cho các ký hiệu
Số hóa bởi trung tâm học liệu /> 22
âm nhạc. Mặt phẳng 2, (Supplementary Ideographic Plane - SIP), được dùng
cho khoảng 40000 chữ Trung Quốc ít gặp mà đa số là các ký hiệu cổ, ngồi ra
cũng có một số ký hiệu hiện đại. Mặt phẳng 14 hiện chứa một số các ký tự thẻ
ngơn ngữ khơng được khuyến khích và một số ký hiệu lựa chọn biến thể. Mặt
phẳng 15 và Mặt phẳng 16 được mở cho các sử dụng cá nhân.
Vẫn còn nhiều tranh luận giữa các chun gia về ngơn ngữ CJK (Hoa-
Nhật-Hàn), đặc biệt là các chun gia người Nhật, về nhu cầu và lợi ích kỹ
thuật của việc "thống nhất chữ Hoa", tức là việc chuyển những bộ chữ Hoa và
chữ Nhật vào trong một bộ chữ hợp nhất. (Xem thêm mã hóa chữ Hoa)
Kho ≈220 điểm mã bảo đảm sự tương thích với bộ mã UTF-16. Việc
mới chỉ dùng hết có 10% kho chữ cho thấy rằng kho chữ cỡ ≈20 bit này khó
bị đầy trong một tương lai gần.
2.1.1.2. Bảng mã
Unicode là một cách để đánh số duy nhất cho tất cả các ký tự được
dùng bởi con người trong ngơn ngữ viết. Nhưng những con số đó được ghi
trong các hệ thống xử lý văn bản lại là những vấn đề khác; những vấn đề đó là
hậu quả của việc phần lớn các phần mềm ở phương Tây chỉ biết tới các hệ
thống mã hóa 8-bit, và việc đưa Unicode vào các phần mềm chỉ mới diễn ra
chậm chạp trong những năm gần đây.
Các chương trình 8-bit cũ chỉ nhận biết các ký tự 8 bit, và khơng thể
dùng nhiều hơn 256 điểm mã nếu khơng có những cách giải quyết đặc biệt.
Do đó người ta phải đề ra nhiều cơ chế để dùng Unicode; tùy thuộc vào khả
năng lưu trữ, sự tương thích với chương trình nguồn và sự tương tác với các
hệ thống khác mà mỗi người chọn một cơ chế.
UTF-32
Số hóa bởi trung tâm học liệu /> 23
Cách đơn giản nhất để lưu trữ tất cả các 220+216 Unicode code points
là sử dụng 32 bit cho mỗi ký tự, nghĩa là, 4 byte – do đó, cách mã hóa này
được Unicode gọi là UTF-32 và ISO/IEC 10646 gọi là UCS-4. Vấn đề chính
của cách này là nó hao chỗ hơn 4 lần so với trước kia, do đó nó ít được dùng
trong các vật nhớ ngồi (như đĩa, băng). Tuy nhiên, nó rất đơn giản, nên một
số chương trình sẽ sử dụng mã hóa 32 bit bên trong khi xử lý Unicode.
UTF-16
UTF-16 là một cách mã hóa dùng Unicode 20 bit. Các ký tự trong
BMP được diễn tả bằng cách dùng giá trị 16-bit của code point trong Unicode
CCS. Có hai cách để viết giá trị 16 bit trong một dòng (stream) 8-bit. Có lẽ
bạn đã nghe qua chữ endian. Big Endian có nghĩa là cho Most Significant
Byte đi trước, tức là nằm bên trái – do đó ta có UTF-16BE. Còn Little Endian
thì ngược lại, tức là Least Significant Byte đi trước – do đó ta có UTF-16LE.
Thí dụ, giá trị 16-bit của con số Hex1234 được viết là Hex12 Hex34 trong
Big Endian và Hex34 Hex12 trong Little Endian.
Những ký hiệu khơng nằm trong BMP được biểu diễn bằng cách
dùng surrogate pair (cặp thay thế). Code points có giá trị từ U+D800 đến
U+DFFF được dành riêng ra để dùng cho mục đích này. Trước hết, một code
point có 20 bit được phân ra làm hai nhóm 10 bit. Nhóm Most Significant 10
bit được map vào một giá trị 10 bit nằm trong khoảng từ u+D800 đến
u+DBFF. Nhóm Least Significant 10 bit được map vào một giá trị 10 bit nằm
trong khoảng từ U+DC00 đến U+DFFF. Theo cách đó UTF-16 có thể biểu
diễn được những ký hiệu Unicode có 20 bit.
Số hóa bởi trung tâm học liệu />