MÔ HÌNH TỪ ĐIỂN

Một phần của tài liệu Nghiên cứu phối hợp hai phương pháp nén và mã hóa thông tin (Trang 62)

3.3.1 Giới thiệu

Các mô hình thống kê có đặc điểm chung là mã hoá và giải mã mỗi lúc một ký hiệu. Các mô hình từ điển làm việc với cơ chế hoàn toàn khác. Chúng đọc dữ liệu vào rồi tìm một nhóm ký hiệu tƣơng hợp hiện có trong từ điển. Nếu tìm thấy chúng xuất ra một con trỏ đến nhóm ký hiệu đó chứ không xuất ra một từ mã nhƣ mô hình thống kê. Dữ liệu vào càng tƣơng hợp với nhóm ký hiệu tìm thấy trong từ điển thì hiệu quả nén càng cao. Trong mô hình từ điển, phƣơng pháp nén không là vấn đề quan trọng, có thể chọn các phƣơng pháp mã hoá đơn giản, vấn đề chính là giải quyết vấn đề mô hình.

Một từ điển tĩnh tựa nhƣ một danh sách tài liệu tham khảo dùng trong khoa học, trong suốt bài báo, các tác giả thƣờng thay thế các sách tham khảo bằng một con số nằm trong ngoặc vuông. Con số đó trỏ đến một cuốn sách hoặc một bài báo khác trong danh sách tài liệu tham khảo. Dùng chỉ một con số thay cho việc phải viết đầy đủ các đầu đề của một bài báo hoặc một cuốn sách nhƣ vậy rõ ràng có tác dụng rút ngắn đƣợc bài đang viết.

Nhƣợc điểm của mô hình từ điển tĩnh cũng giống nhƣ nhƣợc điểm của mô hình thống kê tĩnh. Từ điển cần phải phát đi trƣớc khi dữ liệu đƣợc mã hoá. Do đó làm giảm hiệu quả nén. Để tránh nhƣợc điểm đó ta sử dụng từ điển động. Một từ điển động tự nhƣ cách ngƣời ta viết tắt trong sách báo. Muốn viết tắt một cụm từ nào đó thì lần xuất hiện đầu tiên nó sẽ đƣợc kèm theo các kí tự viết tắt trong cặp ngoặc đơn.

3.3.2 Kỹ thuật từ điển

3.3.2.1 Nguyên lý LZ

Nhƣ chúng ta đã biết, bản chất của nén dữ liệu là làm thế nào để chúng ta có thể dự đoán càng đúng càng tốt ký hiệu sẽ xuất hiện tiếp theo là ký hiệu nào. Ví dụ nhƣ trong tiếng Việt thì đang sau chữ “q” chỉ có thể là chữ “u”. Sau chữ “qu” thì có thể là một trong số các chữ “y, a, e, i, ê, â, ă”. Nếu đoán đƣợc chính xác hoàn toàn chữ sẽ xuất hiện thì lẽ dĩ nhiên chúng ta không cần lƣu chữ đó nữa. Đứng đằng sau khả năng đoán nhận là tính luật hay nói cách khác là sự phụ thuộc, mà entropy là số đo của nó. Entropy mà càng nhỏ thì khả năng nén một văn bản lại càng lớn.

Tính entropy, tức là tìm ra lƣợng tin. Đối với một quyển truyện thì lƣợng tin phân bố theo các tầng kiến tạo tin sau đây:

Hình 3.9: Lượng tin

Phân tích chi tiết hơn tầng từ ngữ bao gồm các lớp phụ thuộc tin nhƣ các chữ cái, qui tắc tạo từ, qui tắc tạo câu, qui tắc tạo đoạn văn, qui tắc tạo chƣơng… Về mặt nguyên lý để tính đƣợc lƣợng tin có trong một văn bản một cách tốt nhất thì ta cần phải có thuật toán phân tích tìm ra mô hình phụ thuộc phân tầng nói trên. Việc làm này rất khó, chính vì vậy mà ngƣời ta thƣờng tạo ra thuật toán nén dựa trên sự lý giải có lý. Sự thật thì khi dự đoán chúng ta luôn sử dụng những điều xảy ra trong quá khứ. Việc tính toán để dự báo cái gì sắp xảy ra đƣợc chuyển về sự tƣơng tự với cái đã xảy ra trong quá khứ. Vì thế việc tính toán để tìm các thông số phục vụ cho một thuật toán nén là không còn cần thiết nữa. Nhƣ vậy, tƣ duy thì thông qua các khái niệm, khái niệm lại đƣợc thể hiện thông qua từ ngữ. Khái niệm là các yếu tố tƣơng đối ổn định dẫn tới ngôn ngữ thƣờng dùng có rất nhiều từ và cụm từ lặp đi lặp lại. Vì lý do đó mà thay vì phải tìm cách ghi nhận khái niệm, ngƣời ta nghĩ đến việc mô tả một từ hay cụm từ theo vị trí của nó đã gặp ở đâu đó.

Nguyên lý LZ (viết tắt của Ziv-Lempel do Jacob-Ziv và Abraham Lemple phát triển năm 1977): thay một từ (một cụm từ) bằng vị trí của một từ (một cụm từ) giống hệt nó trong quá khứ.

Toàn bộ nguyên lý LZ dựa trên một nhận xét sau: ngôn ngữ thƣờng dùng hàng ngày có rất nhiều từ và cụm từ lặp đi lặp lại. Một quyển truyện càng dày thì càng có nhiều từ và cụm từ. Chính vì vậy mà ngƣời ta nghĩ đến việc mô tả một từ hay cụm từ theo vị trí của nó trong một quyển truyện nào đó mà chúng ta sẽ gọi là từ điển.

Phƣơng pháp mã hoá theo nguyên lý LZ cho phép nén ở tầng từ ngữ. Đối với các tầng ở cao hơn phƣơng pháp này không có khả năng thực hiện đƣợc.

Triết lý Quan niệm Ý tƣởng tác giả Nội dung câu chuyện Tình tiết diễn biến

Nhân vật của câu chuyện Từ ngữ Từ ngữ Đoạn Câu Cụm từ Từ Chữ cái ....

1/. Từ điển

Dựa vào từ điển một văn bản có thể phân ra thành nhiều cụm từ và văn bản đƣợc mã hoá thành toạ độ của các cụm từ cùng với độ dài của cụm từ. Điều phải quan tâm là làm sao chọn đƣợc quyển từ điển tốt và làm sao cho chúng ta luôn tìm đƣợc cụm từ dài nhất có thể. Từ điển mà các thuật toán LZ sử dụng có đặc điểm:

Từ điển có thể tĩnh hoặc động.

Từ điển đƣợc xây dựng tuỳ thuộc vào từng văn bản cụ thể.

2/. Mã với từ điển tĩnh

Mã từ điển tĩnh không khác gì phƣơng pháp ký hiệu là mấy. Có điều ở đây chúng ta tiến hành ký hiệu một cách có hệ thống tất cả các đoạn copy. Lấy ví dụ coi truyện Kiều của Nguyễn Du là từ điển. Trong truyện có câu:

“Sè sè nấm đất ven đƣờng Rầu rầu ngọn cỏ nửa vầng nửa xanh”

Chúng ta có thể tìm thấy trong truyện Kiều một phần của câu “đất ven đƣờng đƣợc ƣu tiên để trồng cây…”. Nhƣ vậy, thay vì ghi cả đoạn “đất ven đƣờng” trong câu trên, chúng ta chỉ cần ghi vị trí toạ độ của nó trong từ điển là đủ. Giả sử toạ độ của đoạn này trong từ điển là từ số 1156 đến 1158 thì ta có văn bản “11561158 đƣợc ƣu tiên để trồng cây…”.

Nhƣ vậy, một văn bản bất kỳ nào đó có thể phân thành các “đoạn chữ” mà chúng ta sẽ gọi chúng là các đoạn copy, mỗi đoạn copy này có thể đƣợc tìm thấy trong truyện Kiều ở một toạ độ xác định nào đấy. Nhờ truyện Kiều mà một văn bản có thể cắt thành các đoạn copy. Sau đó sử dụng các con số là toạ độ của các đoạn này trong truyện Kiều để ký hiệu thay cho nó. Truyện Kiều là một công cụ cho phép biến đổi một đoạn copy thành các con số. Ngƣợc lại dựa vào truyện Kiều và các con số toạ độ này chúng ta xác định lại đƣợc văn bản ban đầu. Quá trình này đƣợc gọi là quá trình “số hoá” văn bản hay là tra từ điển.

3/. Mã với từ điển động

Độ dài đoạn copy càng lớn thì chúng ta càng có khả năng nén tốt hơn. Bởi vậy, chúng ta cần sử dụng từ điển lớn. Tuy nhiên để giải mã văn bản chúng ta cần không chỉ bản mã mà còn cần cả từ điển. Việc lƣu giữ một từ điển lớn cùng với bản mã nén là không kinh tế. Vì tổng cộng dung lƣợng của từ điển phải lƣu để giải nén và dung lƣợng của bản mã nén có khi lớn hơn cả dung lƣợng của văn bản ban đầu. Chính vì thế mà tƣ tƣởng chủ đạo của mã nén LZ động là sử dụng ngay văn bản cần nén làm từ điển. Đặt giả sử nhƣ chúng ta đã nén đến kí tự thứ m và chuẩn bị mã cho các kí tự tiếp theo, chúng ta có thể dùng toàn bộ quá khứ của văn bản làm từ điển. Khi đó cả lúc mã lẫn lúc giải mã chúng ta đều có ngay từ điển mà không cần phải lƣu giữ chúng.

4/. Quá trình thực hiện khi nén bằng mã LZ

Hình 3.10: Quá trình thực hiện nén bằn mã LZ

Quá trình đƣợc tiến hành qua 3 giai đoạn:

Giai đoạn 1: Cắt khúc văn bản theo một nguyên lý nào đó. Mỗi khúc văn bản sẽ gồm một nhóm các kí tự liên tiếp trong văn bản. Mỗi nhóm kí tự đó còn gọi là một đoạn copy.

Giai đoạn 2: Mã hoá các đoạn copy thu đƣợc thành một bộ mã phân tách. Giai đoạn 3: Thay thế các đoạn copy nằm trong văn bản ban đầu bằng từ mã tƣơng ứng trong bộ mã phân tách vừa tạo đƣợc để đƣa ra bản mã.

Không thể có một cơ sở lý luận chắc chắn nào cho phép tìm thuật toán cắt khúc 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ự nhƣ trong quá 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 cắt ra từ văn bản nguồn nên đƣợc tính toán sao cho chúng là các phần dài nhất có thể tìm thấy trong quá khứ. Thuật toán cắt khúc đóng vai trò quan trọng trong các thuật toán LZ. Văn bản Cắt khúc văn bản Mã hoá các khúc Mã hoá văn bản Bản mã

3.3.2.2 Các thuật toán nén LZ

1/. Thuật toán LZ77

LZ77 đƣợc phát minh ra năm 1977. Nó sử dụng từ điển là một đoạn văn bản gần với hiện tại.

Quá trình nén

Gọi vị trí kí tự đang đọc là hiện tại.

Gọi khoảng văn bản bắt đầu từ vị trí của kí tự đang đƣợc đọc đến hết văn bản là tƣơng lai.

Gọi khoảng văn bản từ bắt đầu văn bản đến ngay trƣớc vị trí kí tự đang đƣợc đọc là quá khứ.

Chúng ta chỉ tìm trong một khoảng N kí tự của quá khứ mà gần hiện tại nhất và tìm trong khoảng F kí tự đầu tiên trong tƣơng lai và gọi F kí tự này là buffer.

Nguyên tắc nén như sau:

Bước 1: F – 1 kí tự đầu tiên giữ nguyên.

Bước 2: Cho buffer gồm F kí tự trong tƣơng lai dịch dần về quá khứ N lần. Mỗi lần đếm số kí tự trùng nhau liên tiếp kể từ đầu của buffer với quá khứ và ghi nhớ con số ấy tƣơng ứng với các vị trí quá khứ mà buffer dịch đến. Tìm số lớn nhất trong tất cả các con số ấy.

Bước 3: Ghi ra mã gồm [i, j, w] trong đó i là khoảng cách từ vị trí hiện tại đến vị trí tƣơng ứng với số lớn nhất vừa tìm đƣợc, j là số các kí tự trùng nhau hay chính là số lớn nhất vừa tìm đƣợc, w là kí tự ở vị trí thứ j + 1 trong buffer.

Bước 4: Lặp lại bƣớc 2 cho đến khi hết văn bản.

Quá trình giải nén

Bước 1: Đọc F – 1 kí tự đầu tiên của bản mã ghi ra bản giải mã.

Bước 2: Đọc một bộ mã [i, j, w]. Lùi về đoạn văn bản đã giải mã i vị trí và copy j kí tự từ vị trí thứ i đó để ghi ra bản giải mã, sau đó ghi ra w.

Bước 3: Nếu còn bộ mã thì quay lại bƣớc 2. Nếu không còn thì kết thúc.

Ví dụ:

Quá trình nén nhƣ sau:

TT Quá khứ Vị trí hiện tại Buffer Ghi ra

1 bca

2 bca 4 bbcb [3,1,b]

3 bcabb 6 cbcc [4,1,b]

4 bcabbcb 8 ccba [2,1,c]

5 bcabbcbcc 10 baba [3,1,a]

6 bcabbcbccba 12 babc [2,2,b]

7 bcabbcbccbaba 15 c [5,1,””]

Bảng 3.4: Quá trình nén xâu “bcabbcbccbababc” theo thuật toán LZ77

Bản mã là bca[3,1,b][4,1,b][2,1,c][3,1a][2,2,b][5,1,””]

Quá trình giải nén

TT Bộ mã đọc vào Ghi ra Bản giải mã

1 bca bca 2 [3,1,b] bb bcabb 3 [4,1,b] cb bcabbcb 4 [2,1,c] cc bcabbcbcc 5 [3,1,a] ba bcabbcbccba 6 [2,2,b] bab bcabbcbccbabab 7 [5,1,””] c bcabbcbccbababc

Bảng 3.5: Quá trình giải nén theo thuật toán LZ77bản mã bca[3,1,b][4,1,b][2,1,c][3,1a][2,2,b][5,1,””]

2/. Thuật toán LZ78

Đây là một trong các thuật toán từ điển động khá mạnh đƣợc phát minh và sử dụng trong những năm 1978. Từ điển xây dựng trong mã hoá và giải mã đơn giản và hoàn toàn động, do đó không cần lƣu từ điển cùng file nén.

Quá trình nén

Thuật toán nén.

Bước 1: Khởi tạo từ điển có một phần tử là xâu rỗng có chỉ số 0. Xâu trung gian P rỗng.

Bước 2: Đọc kí tự tiếp theo trong văn bản vào C.

Bước 3: Tìm khúc (P + C) đã có trong từ điển chƣa? Nếu có thì P ← P + C và quay lại bƣớc 2. Nếu không thì:

i. Cập nhật P + C vào trong từ điển. ii. W ← chỉ số của P trong từ điển. iii. Ghi cặp (W, C) ra bản mã. iv. P ← rỗng.

Bước 4: Còn kí tự trong văn bản vào? Nếu còn thì quay lại bƣớc 2.

Sơ đồ nén

Hình 3.11: Sơ đồ nén LZ78

Bắt đầu

Khởi tạo từ điển. Xâu trung gian P rỗng

Đọc kí tự tiếp theo vào C

P + C đã có

trong từ điển? P ← P + C

W ← chỉ số của P trong từ điển

Ghi ra bản mã (W, C) Cập nhật P + C vào từ điển P ← rỗng Còn kí tự trong văn bản? C ← rỗng Kết thúc Ghi ra bản mã (W, C) Đúng Đúng Sai Sai

Quá trình giải nén

Với mỗi cặp (W, C) ta ký hiệu .W nội dung của đoạn copy thứ W trong từ điển. Nếu W = 0 thì .W là rỗng.

Thuật toán giải nén.

Bước 1: Khởi tạo từ điển có một phần tử là xâu rỗng có chỉ số 0. Bước 2: Đọc một cặp (W, C).

Bước 3: Ghi xâu (.W + C) ra bản giải mã. Cập nhật xâu này vào từ điển.

Bước 4: Còn kí tự trong bản mã không?

Nếu còn thì đọc cặp (W, C) tiếp theo và quay lại bƣớc 2. Nếu không thì kết thúc.

Sơ đồ giải nén

Hình 3.12: Sơ đồ giải nén thuật toán LZ78

Bắt đầu

Khởi tạo từ điển

Đọc một cặp (W, C) Ghi (.W + C) ra bản giải mã Cập nhật (.W + C) vào từ điển Còn kí tự trong bản mã? Kết thúc Đúng Sai

Ví d:

Cho văn bản aaabbabaabaaabab.

Quá trình nén TT Đoạn văn bản đã P C Từ điển W Ghi ra 1 a “” a 0 – “”, 1 – a 0 (0,a) 2 aaa a a 0 – “”, 1- a, 2 - aa 1 (1,a) 3 aaab “” b 0 – “”, 1- a, 2 – aa, 3- b 0 (0,b) 4 aaabba b a 0 – “”, 1- a, 2 – aa, 3 – b, 4 - ba 3 (3,a) 5 aaabbabaa ba a 0 – “”, 1- a, 2 – aa, 3 – b, 4 – ba,

5 – baa 4 (4,a)

6 aaabbabaabaaa baa a 0 – “”, 1- a, 2 – aa, 3 – b, 4 – ba,

5 – baa, 6 - baaa 5 (5,a) 7 aaabbabaabaaabab ba b 0 – “”, 1- a, 2 – aa, 3 – b, 4 – ba,

5 – baa, 6 – baaa, 7 - bab 4 (4,b)

Bảng 3.6: Quá trình nén xâu “ aaabbabaabaaabab” bằng thuật toán LZ78

Quá trình giải nén

TT Cặp mã đọc vào

Ghi

ra Từ điển Xâu kết quả

1 (0,a) a 0 – “”, 1 - a a

2 (1,a) aa 0 – “”, 1 – a, 2 – aa aaa

3 (0,b) b 0 – “”, 1 – a, 2 – aa, 3 – b aaab 4 (3,a) ba 0 – “”, 1 – a, 2 – aa, 3 – b, 4 - ba aaabba 5 (4,a) baa 0 – “”, 1 – a, 2 – aa, 3 – b, 4 – ba, 5 –

baa aaabbabaa

6 (5,a) baaa 0 – “”, 1 – a, 2 – aa, 3 – b, 4 – ba, 5 –

baa, 6 – baaa aaabbabaabaaa

7 (4,b) bab 0 – “”, 1 – a, 2 – aa, 3 – b, 4 – ba, 5 –

baa, 6 – baaa, 7 - bab aaabbabaabaaabab

Bảng 3.7: Quá trình nén bằng thuật toán LZ78 bản mã “(0,a)(1,a)(0,b)(3,a)(4,a)(5,a)(4,b)”

Kết quả giải mã ta đƣợc: aaabbabaabaaabab

Thuật toán này có ƣu điểm là mã hoá và giải mã tƣơng đối nhanh tuy nhiên vẫn còn hạn chế trong hiệu quả nén (đối với file văn bản đạt trung bình 40%, chỉ đạt hiệu quả cao khi nén các file lớn).

3/. Thuật toán LZW

LZW đƣợc đặt tên từ những ngƣời tạo ra nó A.Lempel, J.Ziv và Terry A.Welch. Đây là phƣơng pháp nén file mới nhất, hiệu quả nén trung bình là 50%. Nó không chỉ đƣợc sử dụng cho file .doc, .txt mà còn cho cả file hình ảnh nhƣ file .gif…

Điểm khác biệt giữa LZ78 và LZW trong nguyên lý nén.

Khởi tạo từ điển bao gồm tất cả các kí tự trong bảng chữ cái ban đầu. Kí tự cuối cùng của đoạn copy này là kí tự đầu của đoạn copy sau. Bản mã chỉ là chỉ số các đoạn copy chứ không có các kí tự nữa.

Một phần của tài liệu Nghiên cứu phối hợp hai phương pháp nén và mã hóa thông tin (Trang 62)

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

(99 trang)