Định nghĩa nén dữ liệu

Một phần của tài liệu Xây dựng kho dữ liệu an toàn với mã huffman (Trang 55)

i. Mã hóa khóa công khai

4.2.1. Định nghĩa nén dữ liệu

Nén dữ liệu (tiếng Anh: Data compression): là việc chuyển định dạng thông tin sử dụng ít bit hơn cách thể hiện ở dữ liệu gốc.

Tùy theo dữ liệu có bị thay đổi trước và sau khi giải nén không, người ta chia nén thành hai loại: Nguyên vẹn (lossless) và bị mất dữ liệu (lossy).

Nén không mất dữ liệu thường dựa trên giả thuyết dư thừa trong dữ liệu và thể hiện dữ liệu chính xác hơn mà không mất các thông tin. Kỹ thuật này sử dụng trên các dữ liệu yêu cầu đảm bảo độ chính xác cao khi lưu trữ hay khi truyền qua mạng như các văn bản, cơ sử dữ liệu… Với các dữ liệu này dù chỉ sai lệch một vài bit thông tin cũng là điều không thể.

Nén mất dữ liệu giảm số lượng bit bằng cách xác định các thông tin không cần thiết và loại bỏ chúng để đạt được hiệu quả nén tốt. Việc loại bỏ các thông tin không cần thiết được thực hiện qua một phép phân tích và biến đổi, tiếp đó là quá trình nén dữ liệu. Nén mất mát dữ liệu thích hợp với việc nén các file hình ảnh, âm thanh… Các phương pháp nén như JPEG, MP3 …

Trong phạm vi luận văn này, chỉ quan tâm tới việc nén không mất mát dữ liệu. Dựa theo mức áp dụng thuật toán nén người ta chia nén thành các dạng sau:

- Nén tệp tin: Đây là dạng thức nén truyền thống và thuật toán nén được áp dụng cho từng tệp tin riêng lẻ. Tuy vậy nếu 2 tệp tin giống nhau thì vẫn được nén 2 lần và được ghi 2 lần. Tùy dữ liệu nhưng thông thường khả năng giảm sau khi nén chỉ từ 2-3 lần.

- Loại trừ trùng lặp file: Đây là dạng thức nén mà thuật toán nén được áp dụng cho nhiều tập tin. Các file giống hệt nhau sẽ chỉ được lưu một lần. Ví dụ một thư điện tử có tệp tin đính kèm được gửi cho 1000 người. Chỉ có một bản đính kèm được lưu và vì vậy có thể giảm khá nhiều. Thông thường có thể giảm từ 5-10 lần so với dữ liệu gốc. - Loại trừ trùng lắp ở mức sub-file: Đây là một dạng thức kết hợp cả nén tệp tin và loại trừ trùng lắp

56 4.2.2. Quá trình nèn và giải nén

Quá trình nén và giả nén có thể được minh họa như sau: - Quá trình nén dữ liệu:

Hình CIV.II.2 - 1. Quá trình nén dữ liệu

- Quá trình giải nén:

Hình CIV.II.2 - 2. Quá trình giải nén dữ liệu

Với quá trình nèn văn bản: phân tích và cắt văn bản gốc thành các đoạn, các câu/ từ, sau đó gán cho chúng ký hiệu để xác định chúng.

Quá trình giải nén: phân tích các đoạn mã và khôi phục các đoạn văn bản gốc. Tập hợp các đoạn, các câu/từ gọi là từ điển.

4.2.3. Nén văn bản

Bảng chữ cái: là một tập hợp các chữ cái hay ký tự.

Văn bản: Là một dãy gồm các chữ cái của một bảng chữ cái. Độ dài của văn bản: là số lượng các chữ cái trong văn bản.

Với một bảng chữ cái B={b1, b2, …, bn}, với xác suất hay tuần suất xuất hiện của các chức cái tương ứng là T={t1, t2, …, tn}; Ta có một văn bản V được sinh ra từ bảng chữ cái B.

Nén văn bản không phải là việc các văn bản này được ghi nén lại nhỏ hơn mà các thuật toán nén văn bản sẽ ghi lại văn bản ở một dạng khác.

Giới hạn nén của một văn bản: Giới hạn nén của một văn bản gọi là lương tin của văn bản. Lượng tin của văn bản chỉ phụ thuộc và chính văn bản đó mà không phụ thuộc vào

57 thuật toán. Mọi thuật toán nén văn bản đều không thể nén văn bản đến mức nhỏ hơn lượng tin mà văn bản đó có. Lượng tin còn được gọi là entropy.

4.3. Giải thuật mã hóa Huffman

4.3.1. Mã hóa dữ liệu trong máy tính

Để mã hóa các kí hiệu (bao gồm kí tự, chữ số, …) trong máy tính, ta thay chúng bằng các xâu nhị phân, được gọi là từ mã của kí hiệu đó.

Ví dụ bộ mã ASCII ra đời năm 1967, mã hóa cho 256 kí hiệu là biểu diễn nhị phân của các số từ 0 đến 255, mỗi từ mã gồm 8 bit. Trong ASCII từ mã của kí tự “a” là 1100001, của kí tự “A” là 1000001. Trong cách mã hóa này các từ mã của tất cả 256 kí hiệu có độ dài bằng nhau (mỗi từ mã 8 bít). Nó được gọi là mã hóa với độ dài không đổi.

Khi mã hóa một tài liệu có thể không sử dụng đến tất cả 256 kí hiệu. Hơn nữa trong tài liệu chữ cái “a” chỉ có thể xuất hiện 1000000 lần còn chữ cái “A” có thể chỉ xuất hiện 2, 3 lần. Như vậy ta có thể không cần dùng đủ 8 bit để mã hóa cho một ký hiệu, hơn nữa độ dài (số bit) dành cho mỗi kí hiệu có thể khác nhau, kí hiệu nào xuất hiện nhiều lần thì nên dùng số bit ít, ký hiệu nào xuất hiện ít thì có thể mã hóa bằng từ mã dài hơn. Như vậy ta có việc mã hóa với độ dài thay đổi. Để phân biệt được xâu bít nào là mã hóa của ký hiệu nào, một trong các giải pháp là dùng các dấu phẩy (“,”) hoặc một kí hiệu quy ước nào đó để tách từ mã của các kí tự đứng cạnh nhau. Nhưng như thế số các dấu phẩy sẽ chiếm một không gian đáng kể trong bản mã. Một cách giải quyết khác dẫn đến khái niệm mã phi tiền tố.

4.3.2. Mã phi tiền tố

Mã phi tiền tố là bộ các từ mã của một tập hợp các kí hiệu sao cho từ mã của mỗi ký hiệu không là tiền tố (phần đầu) của từ mã một ký hiệu khác trong bộ mã ấy.

Ví dụ có từ “CNTT” gồm 3 chữ cái là C,N,T. Nếu dùng cách mã hóa với độ dài không đổi thì mỗi chữ cái được mã hóa tối thiểu là 2 bit chẳng hạn C=00, N=01, T=10. Khi đó xâu được mã hóa là 00011010.

Nếu mã hóa C=0, N=01, T=11 thì bộ từ mã này không là mã phi tiền tố vì từ mã của chữ C là tiền tố của từ mã của N. Để mã hóa cả từ này ta phải đặt dấu ngăn cách vào giữa các từ mã 0,01,10,10.

58 Nếu mã hóa C=0, N=10, T=11 thì bộ mã này là mã phi tiền tố. Với bộ mã phi tiền tố này thì xâu được mã hóa là 0101111.

4.3.3. Lý thuyết Mã Huffman

Mẫ hóa Huffman là một thuật toán mã hóa dùng để nén dữ liệu, dựa trên tần suất xuất hiện các ký tự cần mã hóa để xây dựng một bộ mã nhị phân cho các ký tự sao cho dung lượng (số bit) thu được sau khi mã hóa là nhỏ nhất.

Mỗi ký tự với độ dài mã nhị phân cố định (ASCII) được thay bằng một đoạn mã có độ dài biến đổi, độ dài này phụ thuộc vào số lần xuất hiện của ký tự đó trong file sao cho việc giải hiện của ký tự đó trong file sao cho việc giải mã là duy nhất đối với mỗi loại ký tự:

- Ký tự xuất hiện nhiều lần có độ dài mã thấp hơn các ký tự ít xuất hiện - Bộ mã tạo ra phải có tính chất tiền tố:

o Mã của ký tự này không được là tiền tố cho mã của ký tự khác

- Mã Huffman dựa trên cơ sở của cây Huffman, là một cây nhị phân với các tính chất:

o Mỗi ký tự được biểu diễn bằng một nút lá.

o Mã cho một ký tự được lấy thông qua đường dẫn từ gốc đến nút lá với quy tắc:

 Đi sang trái được bit 0  Đi sang phải được bit 1  Các ký tự phải nằm ở nút lá.

a. Bài toán:

Tìm cách mã hóa tối ưu, tức là tìm cây nhị phân T làm tối thiểu hóa tổng độ dài có trọng số

B(T) = ∑ f(c) depth(c)

trong đó f(c) và depth(c) là tần số và độ dài đường đi từ gốc đến lá tương ứng với ký tự c.

Ý tưởng: Chữ cái có tần suất nhỏ hơn cần được gán cho lá có khoảng cách đến gốc là lớn hơn, chữ cái có tần suất xuất hiện lớn hơn cần được gán cho nút gần gốc hơn.

59

b. Thuật toán xây dựng cây mã Huffman

Bước 1: Tìm 02 ký tự có trọng số nhỏ nhất ghép lại làm 01, trọng số của ký tự mới bằng tổng trọng số của 02 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 01 thì thực hiện bước 1, ngược lại thực hiện bước 3.

Bước 3: Tách ký tự cuối cùng và tạo cây nhị phân với quy ước bên trái mã 0, bên phải mã 1.

Ví dụ: Xây dựng cây mã Huffman với bảng tần suất dưới đây:

Quá trình xây dựng cây Huffman diễn ra như sau:

60

Hình CIV.III.2.b – 2 Xây dựng mã Huffman – bước 2

Hình CIV.III.2.b – 3 Xây dựng mã Huffman – bước 3

61 Từ đó, khi đi từ gốc đến từng lá, ta thu được bảng mã của các chữ cái như sau:

Chữ cái Tần suất Mã Huffman T 61 11 D 43 01 L 70 10 C 23 000 G 12 001

c. Thuật toán giải mã

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 vào 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 1, ngược lại thực hiện bước 3.

Bước 3: Kết thúc thuật toán.

d. Ứng dụng mã hóa Huffman để nén file

Các bước thực hiện nén:

- Đọc file và xác định các ký tự xuất hiện trong file & tần suất của chúng - Dựng cây mã Huffman

- Dựa vào cây mã thu được mã hóa từng ký tự và ghi vào file nén - Lưu cây mã vào cuối file nén

Các bước giải nén ngược lại.

Nhược điểm của thuật toán Huffman trên (Huffman tĩnh) là quá trình mã hóa phải duyệt dữ liệu 2 lần: một lần để xác định tần suất & dựng cây mã, một lần nữa để mã hóa. Do đó, thuật toán Huffman động được đề xuất (độc lập) bởi Faller (1973), Gallager (1978) vào năm 1985, Knuth đưa ra một số cải tiến và hoàn chỉnh thuật toán (vì thế thuật toán này còn được gọi là thuật toán FGK). Nó có một số ưu điểm so với Huffman tĩnh là

62 không cần tính trước số lần xuất hiện của các kí tự, không cần lưu thông tin phục vụ cho việc giải nén, quá trình nén chỉ cần một lần duyệt file và có thể nén trên dữ liệu phát sinh theo thời gian thực.

63 CHƯƠNG 5. GIỚI THIỆU BÀI TOÁN MÃ HÓA VĂN BẢN TIẾNG VIỆT 5.1. Yêu cầu bài toán

Văn bản trước khi đưa lên kho lưu trữ cần được mã hóa, để đảm bảo tính bí mật và riêng tư của người sử dụng, với từ khóa do người dùng tự nhập vào (như vậy mỗi người sử dụng sẽ có một từ khóa riêng cho mỗi văn bản mà họ đưa lên kho lưu trữ)

Sau khi các văn bản được mã hóa sẽ được nén lại để đảm bảo tối ưu kho lưu trữ. Việc mã hóa cũng như nén giữ liệu sẽ được thực hiện trên các văn bản Tiếng Việt với các từ (đơn và ghép) để nâng cao hiệu quả bảo mật cũng như tỷ lệ nén dữ liệu.

5.2. Đề xuất giải pháp cho mã hóa và nén văn bản tiếng Việt

5.2.1. Mã hóa văn bản tiếng Việt với phương pháp mã hóa Vigenere

Áp dụng phương pháp mã hóa Vigenere để mã hóa văn bản tiếng Việt trước khi nén. Để nâng cao tính bảo mật và độ phức tạp cho các phương pháp thám mã Vigenere, việc mã hóa vă bản được thực hiện trên các từ tiếng Việt (bao gồm cả từ đơn và từ ghép) thay vì chỉ là mã hóa các ký tự.

Như vậy, chỉ cần với một bộ từ điển Tiếng Việt khoảng 30.000 từ thì hình vuông Vigenère hay bảng Vigenère sẽ là một ma trận 30.000 x 30.000; Và với một từ khóa có độ dài là d = 3 (ví dụ với từ khóa “Bài tập Tiếng Anh về nhà” với 3 từ ghép trong từ điển là “bài tập”, “Tiếng Anh”, “về nhà”) thì các thuật toán vét cạn sẽ phải quét với tổng số là: 30.000*30.000*30.000 = 27.000.000.000.000 khóa hợp lệ thay vì 26*26*26 = 17.576 khóa hợp lệ nếu tiến hành việc mã hóa trên các ký tự.

5.2.2. Nén văn bản tiếng Việt với phương pháp mã hóa Huffman

Áp dụng thuật toán mã Huffman để nén và giải nén các văn bản tiếng Việt: thay vì thay thế một ký tự bằng 1 chuỗi các bít 0,1 thì sẽ thay thế 1 từ bằng một chuổi bít (ví dụ: thay thế từ “Ngày” bằng một chuổi bít 0,1).

Khắc phục nhược điểm của thuật toán Huffman: khi nén văn bản phải liệt kê tỷ lệ xuất hiện từng từ, và cây Huffman sẽ khác nhau giữa các văn bản khác nhau. Như vậy để nén và giải nén thì cần gửi kèm cây mã Huffman.

64 Để khắc phục điểm này cần xây dựng một bộ mã Huffman dựa trên số lần xuất hiện của từng từ trên một bộ dữ liệu đầu vào (là căc văn bản được dùng làm dữ liệu mẫu). 5.2.3. Tập văn bản mẫu cho việc mã hóa và nén văn bản Tiếng Việt

Việc kết hợp hai phương pháp mã hóa Vigenere và Huffman trên văn bản Tiếng Việt sẽ đưa ra các bài toán yêu cầu cần xử lý:

- Để mã hóa Vigenere cần có 01 hình vuông Vigenere với mỗi hàng/cột là 01 từ Tiếng Việt (là từ đơn hay ghép có nghĩa trong Từ điển Tiếng Việt).

- Phương pháp mã Huffman yêu cầu xây dựng bộ thư viện mẫu bằng cách phân tích một tập các văn bản, tài liệu … đầu vào, qua đó thống kê tần suất xuất hiện của các từ (đơn và ghép) qua đó xây dựng lên bộ mã Huffman.

- Tuy nhiên việc phân tích các văn bản với văn phong hiện đại sẽ phát sinh những trường hợp như:

o Các từ cổ trong Tiếng Việt không xuất hiện đầy đủ ở các văn bản tài liệu. Điều này dẫ tới tập thư viện của mã Huffman sẽ nhở hơn bộ từ điển của mã Vigenere.

o Việc vay mượn hay giữ nguyên các từ phiên âm tiếng Anh cũng như sự phát sinh từ mới trong văn phong hiện đại sẽ làm cho bộ mã Huffman chứa những từ không có trong bộ từ điển tiếng Việt.

 Nói cách khác các tập từ điển cho hai phương pháp mã hóa là không trùng lặp, không phủ kín nhau:

65

Từ điển Tiếng Việt

Thư viện từ của mã Huffman Các từ trong Từ điển

Tiếng Việt được sử dụng trong tập văn bản mẫu

Văn phong hiện đại, các từ giữ nguyên từ tiếng nước ngoài Các từ Tiếng Việt cổ ít hoặc không còn sử dụng trong các văn bản, tài liệu mới

Hình CIII.II.3 – 1 Độ giao giữa các Tập văn bản mẫu

Việc chênh lệch về bộ thư viện mẫu sẽ dẫn tới việc dữ liệu sau khi được mã hóa bằng phương pháp mã Vigenere sẽ không thể nén và giải nén bằng phương pháp mã Huffman, do từ trong văn bản sau khi mã hóa với Vigenere không hề tồn tại trong cây mã Huffman.

Để khắc phục vấn đề này, bộ từ điển Tiếng Việt chỉ được sử dụng như một thư viện mẫu giúp phân tích và bóc tách văn bản Tiếng Việt thành các từ (đơn và ghép) cho việc xây dựng mã Huffman. Kết quả phân tích các tập văn bản mẫu sẽ sinh ra, hay “Thư viện từ của mã Huffman” trong hình trên, sẽ được dùng xây dựng hình vuông Vigenere. Phương pháp này ngoài việc giải quyết được vấn đề chênh lệch giữa 02 bộ thư viện cho Vigenere và Huffman còn làm tăng độ phức tạp cho các phương pháp thám mã Vigenere do bộ thư viện từ của hã Huffman được sinh ra dựa trên tập văn bản mẫu đưa vào, tức là nó không cố định. Hacker nếu không có được bộ “thư viện từ của mã Huffman” này sẽ không thể tiến hành các phương pháp vét cạn để giải mã các văn bản.

66 - Xây dựng tập văn bản mẫu: tập các tài liệu, văn bản … sẽ dùng để xây dựng lên

cây mã Huffman.

- Xử lý và phân tích văn bản mẫu từ đó liệt kê tỷ lệ xuất hiện của các từ.

Một phần của tài liệu Xây dựng kho dữ liệu an toàn với mã huffman (Trang 55)

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

(78 trang)