Giải nén dữ liệu văn bản tiếng Việt

Một phần của tài liệu Nén dữ liệu tiếng việt sử dụng phương pháp mã hóa số học (Trang 33 - 54)

5. Ý nghĩa khoa học và ý nghĩa thực tiễn của đề tài

2.2.2. Giải nén dữ liệu văn bản tiếng Việt

Thuật tốn của bộ giải mã như hình dưới. Với V là cửa sổ hiện tại mở

rộng với b bit vào luồng bit đã nén. Ở đây cĩ 2 hàm là decode_target(t) và arithmetic_decode(l,h ,t) tương đương với hai bước cơ bản được yêu cầu để

giải mã một kí hiệu. Qui định đầu tiên là giá trị target dựa trên V và giá trị của t đã dùng trong mã hĩa tương đương, nĩ đáp ứng cho quá trình tìm kiếm cấu trúc dữ liệu và xác định kí hiệu s, tìm kí hiệu với điều kiện l < target < h. Rồi gọi hàm arithmetic_decode(l, h, t), nĩ khơng mang theo tỉ lệ liên kết và chuyển dịch dãy bit, nĩ giống với kết quả của mã hĩa.

Hàm arithmetic_decode() thay đổi giá trị của các biến L và R để phản ánh sự thay đổi tương đương trong bộ mã hĩa trong khi gọi hàm arithmetic_encode(). Hàm decode_target() trả về giá trị nguyên target, 0 < target < t đảm bảo rằng target nằm trongvùng [l, h) tương đương với khi gọi arithmetic_encode().

Đầu vào là các biến thành phần l, h, t.

Đầu ra là các kí hiệu tương ứng với các bit đã mã hĩa.

Arithmetic_decode(l, h, t) { 1- Đặt T = (R x l) /t 2- Đặt L = L + T 3- Đặt R = ((R x h) /t) - T 4- Trong khi R < 2b -2 làm { Chuẩn hĩa lại R

Hàm decode_target() chỉ cĩ một lệnh: decode_target( ) { return (((V - L + 1) x t ) - 1) / R } 2.2.3. Nhng hn chế

Thứ nhất liên quan đến sự tràn của mã hĩa Số học. Giả sử rằng máy

đang dùng hỗ trợ w bit số học. Ví dụ, trên máy làm việc hiện tại w = 3, rồi nếu vượt quá thì hủy bỏ khơng thực hiện các bước 1 và bước 3 của arithmetic_encode tương đương với việc tính R.l và R.h, ở đây phải cĩ sự

thỏa mãn 2w - 1 > 2b - 1.t, khi w ≥ b -1+ f và t < 2f. Hơn nữa, nếu ở mức dưới tức là chưa tràn và R= 0 là xảy ra bước 3, R > t được yêu cầu, đĩ là 2b - 2 > 2f. Trong việc liên kết hai cái ép buộc này chỉ thỏa mãn khi w ≥ 2f+1. Từ đây, với w = 3L của trị lớn nhất của giá trị f cĩ thể hỗ trợ là 15 và tổng tần số { Trong khi R < 2b - 2 làm { Nếu L + R < 2b - 1 thì Khơng làm gì cả Khác Nếu 2b - 1 < L thì - Đặt L = L - 2b = 1 - Đặt V = V - 2b = 1 Khác - Đặt L = L - 2b -2 - Đặt V = V - 2b = 1 } Gán - L = 2 .L, R = 2 .R - V = 2 x V + read_one_bit() }

trong bất kì ngữ cảnh nào đều phải khơng vượt quá 32767. Với nén mơ hình từ và mơ hình khác sử dụng bảng alphabet lớn thì đây là một hạn chế khắt khe.

Thứ hai là cĩ một mất mát nhỏ của việc tràn trong số học là sự nguy hiểm trong việc tính tốn bits_outstanding. Tưởng tượng là một mơ hình tĩnh của ba kí hiệu A, B, C và giả sử rằng một file cĩ một tỷ hoặc vài tỷ kí tự được mã hĩa. Do đĩ bits_outstanding sẽ tăng và trên thực tế khơng một bit nào

được phát ra. Cái rủi ro của việc tràn là nhỏ, xác xuất của 232 bit tất cả cùng sự khác biệt, trong một mơ hình thích hợp bậc một sẽ mã hĩa 232, tuy nhiên

điều đĩ là cĩ thể. Cĩ ba cách để hạn chế vấn đề này.

Thứ nhất và cách thực hiện kinh tế nhất là xuất ra màn hình bits_outstanding trong bộ mã hĩa, và nĩ sẽ trở thành rất lớn.

Thứ hai là ghi một thơng báo lỗi và bỏ qua chương trình. Nếu đây là

điều khơng chấp nhận được nên xử lí nén phải mạnh để mở rộng cho cả một trong một tỷ thay đổi, sự thất bại khơng thể khơng tổn hao, rồi bộ giải mã nên sửa lại để nhận biết giá trị hiện tại của bits_outstanding, do đĩ cho phép cả bộ

mã hĩa và bộ giải mã đồng bộ thực hiện finish_encode và start_encode để làm

đầy bit hiện tại và thiết lập lại trạng thái của bộ mã hĩa bất kì khi mà bits_outstanding tiến đến gần giá trị hiện tại của nĩ. Tuy nhiên với điều này thì một sự bất lợi đối với bộ giải mã là làm chậm tốc độ.

Cái thay đổi thứ ba là cho rằng một ưu tiên kết nối với độ dài của một file nào sẽ được xử lí và mở rộng độ chính xác số học cho bits_outstanding để

Chương 3: XÂY DNG NG DNG NÉN D LIU CHO VĂN BN TING VIT

3.1 Bài tốn nén dữ liệu văn bản tiếng Việt

Nén dữ liệu là việc thực hiện thu gọn kích thước các tập tin hoặc làm cho thơng tin lưu trữ chiếm khơng gian đĩa ít nhất cĩ thể. Cĩ nhiều cách để

thực hiện điều này tùy vào từng đối tượng cụ thể.

Văn bản tiếng Việt ta lưu trữ hàng ngày cĩ rất nhiều các đoạn dữ liệu

được lặp đi lặp lại. Vì vậy yêu cầu tất yếu là phải giảm sự dư thừa dữ liệu

3.2 Xây dựng ứng dụng

3.2.1 Cài đặt thut tốn nén d liu văn bn tiếng Vit

Chương trình cài đặt trên ngơn ngữ Visual Studio

Khi mã hĩa dùng các thao tác di chuyển /cộng các số nguyên để tính tốn, với độ chính xác thấp đã được chấp nhận, trong một vài cấu trúc nĩ thực thi nhanh hơn. Một đặc điểm nổi bật của mã hĩa là dùng sự chính xác rõ ràng khi thực hiện. Tổng tần số cĩ thể lên đến 30 bit (giả sử rằng số nguyên là 32 bit, hoặc hơn nữa là n - 2 cho n bit các số nguyên). Tổng tần số cĩ thể cĩ lên

đến giá trị rất lớn là 1.073.741.824 trước khi các tần số cần phải được chia

đều. Giá trị ngầm định của số bit dùng cho việc đếm tần số là 27.

Mơ hình từ thực hiện việc đọc vào dãy liên tiếp các từ và khơng từ

xen kẽ nhau. Sau khi đọc vào dãy các từ và khơng từ nĩ đưa vào bảng lộn xộn và sắp xếp lại chúng để tìm số thứ tự tương ứng của số lượng các từ để gửi đi cùng với ngữ cảnh tương đương của từ và khơng từ. Một ngữ cảnh cất giữ tấn số tương ứng với thứ tự của các kí hiệu. Đây là mơ hình minh họa các ưu

điểm của cách thực hiện mã hĩa mới khi dùng bảng alphabet lớn và sự thao tác của một ngữ cảnh trong một chương trình riêng lẽ.

3.2.2 Cài đặt thut tốn gii nén d liu văn bn tiếng Vit

Hồn tồn ngược lại với mã hĩa thì giải mã dựa vào từ mã và các giá trị L và R để xác định và đưa ra các kí hiệu. Để giải mã ta tìm kí tự đầu tiên của thơng điệp bằng cách tìm xem giá trị của từ mã mà bộ mã hĩa gửi đến là bao nhiêu và nằm trong khoảng nào và nĩ tương đương với kí hiệu nào và xuất kí hiệu đĩ ra. Sau đĩ ta tính lại giá trị từ mã cho kí hiệu tiếp theo dựa vào L và R.

Một vấn đề đặt ra là làm thế nào để bộ giải mã biết được đã kết thúc luồng đầu vào. Ơ đây cĩ 2 cách để giải quyết vấn đề này là ta gửi cho bộ giải mã biết độ dài của thơng điệp hoặc một kí hiệu đặc biệt để báo cho bộ giải mã biết là đã kết thúc thơng điệp.

3.3. Triển khai thử nghiệm

Hình 3.2 Giao diện đường dẫn đến file cần nén

3.4 Đánh giá

Sau thời gian nghiên cứu luận văn, tác giảđã hồn thiện cơ sở lý luận về kỹ thuật nén mã hĩa số học. Đã triển khai cài đặt thử nghiệm chương trình nén văn bản tiếng Việt bằng phương pháp mã hĩa số học. So với các phương pháp nén khác vẫn chưa phải là phương pháp tối ưu.

File so sánh đầu vào là 1 file word, dung lượng ban đầu của file là 4319744bytes. Sau khi nén bằng 2 phương pháp mã hĩa số học và phương pháp Gzip, đạt được kết quả như sau:

Bảng so sánh Thời gian nén Độ nén Mã hĩa số học 10s54 3845058 bytes Gzip 3s57 2859008 bytes Bảng so sánh khi giải nén Thời gian giải nén Mã hĩa số học 11s20 Gzip 2s80

Qua các kết quả thực nghiệm thể hiện bằng bảng ở trên nhằm đưa ra cách nhìn tổng thể về phương pháp nén mã hĩa Số học và so sánh nĩ với phương pháp khác. Các kết quả so sánh này chỉ mang tính chất tương đối vì nĩ phụ thuộc vào nhiều yếu tố khác nhau như quá trình đọc ghi ở mức bit và mức byte ngồi ra cịn phụ thuộc vào kiểu dữ liệu lựa chọn.

Thời gian nén và giải nén, của mơ hình từ xấp xỉ với thời gian nén và giải nén của phương pháp nén gzip. Điều này chứng tỏ rằng nén số học dùng mơ hình từ mang lại tỷ số rất tốt.

KT LUN

Hiện nay nén số liệu khơng phải là một vấn đề mới mẽ đối với người sử

dụng máy tính, bởi vì tất cả các máy hầu như đều được cài đặt một hoặc vài tiện ích nén cho người sử dụng. Tuy nhiên để cĩ một sự hiểu biết về cơ chế

làm việc của quá trình nén thì chưa cĩ một tài liệu tiếng Việt nào đề cập đến. Do việc tiếp cận các cơng nghệ nén trong thời gian ngắn, kinh nghiệm lập trình của bản thân cịn yếu và cịn gặp nhiều khĩ khăn trong việc dịch tài liệu nước ngồi nên khơng tránh khỏi một số sai sĩt. Thêm vào đĩ sự hiểu biết của cá nhân về tất cả các khía cạnh chưa thật sâu sắc, nên đề tài chưa hồn chỉnh và cần cĩ sự cải tiến khác để nâng cao hiệu suất. Rất mong được sự gĩp ý của các thầy cơ, các anh chịđi trước và các bạn để em cĩ thể hồn thành luận văn

được tốt hơn.

Để nâng cao hơn tỷ số nén chương trình cần lựa chọn cấu trúc dữ liệu tối ưu hơn để xây dựng mơ hình bậc cao hơn bởi vì kết quả thực nghiệm ở

trên chỉ thực hiện ở mơ hình bậc khơng. Do đĩ với mơ hình bậc cao hơn thì kết quả mang lại cĩ lẽ là rất tốt. Cải tiến các thao tác đọc ghi tệp ở mức bít để

nâng cao tốc độ .v.v.. Chương trình cần được phát triển để phát huy tác dụng với tất cả các loại tập tin (văn bản, hình ảnh, âm thanh, tập tin nhị phân, ...)

TÀI LIỆU THAM KHẢO

Tài liệu tiếng Việt

1. Đỗ Ngọc Anh (2006), Nén ảnh sử dụng biến đổi Wavelet và ứng dụng trong các dịch vụ dữ liệu đa phương tiện tự động”, Luận văn thạc sỹ khoa học-Đại học Bách Khoa Hà Nội.

2. Phạm Văn Ất (2006), Kỹ thuật lập trình C cơ sở và nâng cao, NXB Giao

thơng vận tải, Hà Nội.

3. Nguyễn Hữu Điển (2004), Một số vấn đề về thuật tốn, NXB Giáo dục.

Tài liệu tiếng Anh:

4. Maxime Crochemore, Thierry Lecroq (2010), Text data compression

algorithms, Chapman & Hall/CRC

5. Darrel R.Hankerson, Greg A.Haris, Peter D.Johnson, Introduction to

Information theory and compression, Chapman&Hall/CRC.

6. Ida Mengyi Pu (2006), Fundamental Data Compression, Elsevier,

Burlington.

7. Amir Said (2004), Introduction to arithmetic coding – Theory and Practice,

Imaging system Laboratory .

8. Khalid Sayood (2006), Introduction to Data compression, Elsevier.

Tài liệu trên Internet:

9. http://wikipedia.org 10. http://en.wikibooks.org

11. http://unikey.org

MC LC

MỞĐẦU... 1

1. Đặt vấn đề... 1

2. Đối tượng và phạm vi nghiên cứu... 2

3. Hướng nghiên cứu đề tài ... 2

4. Phương pháp nghiên cứu... 3

5. Ý nghĩa khoa học và ý nghĩa thực tiễn của đề tài ... 3 Chương 1: TỔNG QUAN VỀ NÉN DỮ LIỆU ... 4 1.1. Tổng quan về nén dữ liệu... 4 1.1.1. Sơ lược về nén dữ liệu ... 4 1.1.1.1 Khái niệm nén dữ liệu ... 4 1.1.1.2 Nguyên tắc nén dữ liệu ... 4 1.1.2. Các phương pháp nén dữ liệu ... 4 1.1.2.1 Nén bảo tồn dữ liệu ... 4 1.1.2.2 Nén hao hụt dữ liệu ... 5 1.2 Các kỹ thuật nén dữ liệu văn bản ... 5

1.2.1 Xử lý lặp lại của xâu ký tự (Run – Length Encoding)... 5

1.2.2 Mã hĩa Huffman ... 6

1.2.2.1. Mã Huffman tĩnh... 6

1.2.2.2. Thuật tốn Huffman động ... 9

1.2.3. Thuật tốn LZW... 12

1.2.4. Phương pháp mã hĩa số học (Arithmetic Coding) ... 14

1.2.5 Mã hĩa kiểu từ điển... 16

1.2.5.1. Từ điển tĩnh ... 17

1.2.5.2. Từ điển động ... 18

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 ... 21 2.1 Các bảng mã tiếng Việt ... 21 2.1.1 Chuẩn lưu trữ Unicode... 21 2.1.1.1.Kho chữ... 21 2.1.1.2. Bảng mã ... 22 2.1.1.3. Phơng chữ của Unicode ... 26 2.1.2 Chuẩn lưu trữ tiếng Việt TCVN3 ... 26 2.1.3 Chuẩn lưu trữ VNI-Windows... 26 2.2 Kỹ thuật mã hĩa số học... 27

2.3 Phân tích thuật tốn mã hĩa số học... 28

2.2.1. Nén dữ liệu văn bản tiếng Việt ... 28

2.2.2. Giải nén dữ liệu văn bản tiếng Việt ... 31

Chương 3: XÂY DỰNG ỨNG DỤNG NÉN DỮ LIỆU CHO VĂN BẢN TIẾNG VIỆT... 34 3.1 Bài tốn nén dữ liệu văn bản tiếng Việt... 34 3.2 Xây dựng ứng dụng... 34 3.2.1 Cài đặt thuật tốn nén dữ liệu văn bản tiếng Việt... 34 3.2.2 Cài đặt thuật tốn giải nén dữ liệu văn bản tiếng Việt... 35

3.3. Triển khai thử nghiệm... 35

3.4 Đánh giá ... 37

Bảng so sánh khi giải nén... 37

PH LC using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using ACLib; namespace ArithmeticCoder {

public partial class frmArithmeticCoder : Form {

//Khởi tạo form

public frmArithmeticCoder()

{

InitializeComponent(); }

//Sự kiện click button để chọn file đầu vào

private void browseSourceButton_Click(object sender, EventArgs e)

{

//Mở file dialog

sourceOpenFileDialog.ShowDialog(); }

private void sourceOpenFileDialog_FileOk(object sender,

CancelEventArgs e) {

//gán đường dẫn file cho TextBox

sourceText.Text = sourceOpenFileDialog.FileName; }

//Sự kiện click button để chọn file đầu ra

private void browseTargetButton_Click(object sender, EventArgs e)

{

//Mở file dialog

targetOpenFileDialog.ShowDialog(); }

private void targetOpenFileDialog_FileOk(object sender,

CancelEventArgs e) {

//gán đường dẫn file cho TextBox

targetText.Text = targetOpenFileDialog.FileName; }

// Sự kiện chọn nút mã hĩa dữ liệu

private void encodeButton_Click(object sender, EventArgs e)

{

AbstractModel model = new ModelOrder0();

//Khai báo biến lấy thơng tin file đầu vào, đầu ra

FileInfo sourceFile, targetFile;

//Khai báo biến lấy cấu trúc file đầu vào, đầu ra

FileStream sourceStream, targetStream;

{

//Đọc file đầu vào

sourceFile = new FileInfo(sourceText.Text);

sourceStream = sourceFile.OpenRead(); }

catch (Exception openSourceException)

{

MessageBox.Show("Lỗi 1! Khơng thể đọc được file đầu

vào");

return;

}

try

{

//Ghi ra file kết quả

targetFile = new FileInfo(targetText.Text);

targetStream = targetFile.OpenWrite(); }

catch (Exception openTargetException)

{

MessageBox.Show("Lỗi 2! Khơng thể mở được file đầu ra để

ghi!");

return;

}

// Thơng tin về độ lớn file đầu vào

sourceFileSizeValueText.Text = sourceFile.Length.ToString();

sourceStream.Seek(0, SeekOrigin.Begin);

byte[] writtenBytes =

Encoding.Default.GetBytes(Program.g_Signature);

targetStream.Write(writtenBytes, 0, 4);

DateTime firstTime = DateTime.Now;

// Chức năng nén chính

model.Process(sourceStream, targetStream, ModeE.MODE_ENCODE);

// Đo thời gian nén

DateTime secondTime = DateTime.Now;

TimeSpan duration = secondTime - firstTime;

// Đĩng file

sourceStream.Close(); targetStream.Close();

// Thơng tin về độ lớn file đầu ra

targetFileSizeValueText.Text = targetFile.Length.ToString();

compressionRatioValueText.Text = ((double)sourceFile.Length /

(double)targetFile.Length).ToString();

timeValueText.Text = duration.TotalMilliseconds.ToString();

MessageBox.Show("Mã hĩa (nén) thành cơng!"); }

// Sự kiện chọn nút mã hĩa dữ liệu, tương tự như mã hĩa

private void decodeButton_Click(object sender, EventArgs e)

{

AbstractModel model = new ModelOrder0();

FileInfo sourceFile, targetFile;

try {

sourceFile = new FileInfo(sourceText.Text);

sourceStream = sourceFile.OpenRead(); }

catch (Exception openSourceException)

{

MessageBox.Show("Lỗi 1! Khơng thể mở file đầu vào để

đọc!");

return;

}

try

{

targetFile = new FileInfo(targetText.Text);

targetStream = targetFile.OpenWrite(); }

catch (Exception openTargetException)

{

MessageBox.Show("Lỗi 2! Khơng thể mở file đầu ra để

ghi!");

return;

}

sourceFileSizeValueText.Text = sourceFile.Length.ToString();

byte[] readBytes = new byte[4];

sourceStream.Read(readBytes, 0, 4);

string signature = Encoding.Default.GetString(readBytes);

if (signature != Program.g_Signature)

{

MessageBox.Show("Lỗi 3! nén khơng hợp lệ!");

return;

}

DateTime firstTime = DateTime.Now;

model.Process(sourceStream, targetStream, ModeE.MODE_DECODE);

DateTime secondTime = DateTime.Now;

TimeSpan duration = secondTime - firstTime;

sourceStream.Close(); targetStream.Close();

targetFileSizeValueText.Text = targetFile.Length.ToString();

compressionRatioValueText.Text = ((double)targetFile.Length /

(double)sourceFile.Length).ToString();

timeValueText.Text = duration.TotalMilliseconds.ToString();

MessageBox.Show("Giải mã (giải nén) thành cơng!"); }

}

namespace ArithmeticCoder {

partial class frmArithmeticCoder {

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;

/// <summary>

Một phần của tài liệu Nén dữ liệu tiếng việt sử dụng phương pháp mã hóa số học (Trang 33 - 54)