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 “11561158 đƣợ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ã