Các bộ nén ngữ nghĩa

Một phần của tài liệu luận văn: tìm hiểu và so sánh một số kỹ thuật nén XML (Trang 33)

XML thường được dùng để biểu diễn các loại dữ liệu như số nguyên, ngày tháng, mã sân bay… mà được nén tốt nhất bởi các bộ nén ngữ nghĩa có tính chuyên môn hóa (specialized semantic compressor).

Có 3 loại bộ nén ngữ nghĩa bao gồm bộ nén ngữ nghĩa nguyên tử, bộ nén ngữ nghĩa kết hợp và bộ nén ngữ nghĩa do người dùng tự định nghĩa.

ộ nén ngữ nghĩa nguyên tử (automic semantic compressor): có tám bộ nén ngữ nghĩa nguyên tử được mô tả trong bảng 3.2.

ảng 3.2: Các bộ xử lý ngữ nghĩa nguyên tử (Atomic Semantic Compressors) [11] ộ nén (compressor) Mô tả

t Bộ nén văn bản mặc định .

u Bộ nén số nguyên dương.

i Bộ nén số nguyên.

u8 Bộ nén số nguyên dương <256.

di Bộ nén delta cho số nguyên.

ri Run-length code.

e Mã hóa từ điển liệt kê.

“…” Bộ nén hằng số.

Bộ nén văn bản t không nén nhưng sao chép chuỗi ký tự đến bộ chứa, nó sẽ được nén bởi gzip sau đó.Trong bộ nén u, các số nguyên dương được mã hóa nhị phân như sau: các số nhỏ hơn 128, sử dụng 1 byte, các số nhỏ hơn 16384 sử dụng 2 bytes, các trường hợp c n lại sử dụng 4 bytes. Các số nguyên có dấu trong bộ nén i được lưu trữ giống bộ nén u. Bộ nén số nguyên u8 lưu trữ một số giữa 0 và 255 trong 1 byte đơn lẻ. Bộ nén delta delta compressor) áp dụng cho số nguyên, lưu trữ sự khác nhau giữa các số liên tiếp. Bộ mã hóa run-length mã hóa chuỗi có những giá trị dữ liệu giống nhau như các cặp val, count . Bộ mã hóa liệt kê e enumeration encoder sẽ gán một số nguyên dương cho mỗi giá trị dữ liệu mới và giữ một từ điển của tất cả các giá trị trước đó. Bộ nén hằng constant compressor không tạo ra bất kỳ đầu ra nào nhưng kiểm tra đầu vào là hằng số, điều này đặc biệt hữu ích trong các bộ nén kết hợp combined compressor .

Các bộ nén ngữ nghĩa thường được xác định trong các d ng lệnh như sau:

Trong đó, c là một biểu thức chứa container expression và s là một bộ nén ngữ nghĩa. Khi bị thiếu bộ nén mặc định là bộ nén ngữ nghĩa văn bản.

Ví dụ 3.8: Xét d ng lệnh sau:

xmill -p //price=>i -p //state=>e -p //description// file.xml file.xmi

Dữ liệu price được nén như các số nguyên, state như các giá trị liệt kê, và text nằm dưới description bất kể độ sâu nào được đặt trong bộ chứa riêng sử dụng bộ nén ngữ nghĩa. Tất cả dữ liệu c n lại được nhóm dựa trên các thẻ của cuối cùng và không sử dụng nén ngữ nghĩa.

Bộ nén được kết hợp (Combined compressor): XMill có ba sự kết hợp bộ nén như sau:

Bộ nén tuần tự Sequence Compressor : seq s1 s2 ... hoặc một biến thể khác là seqcomb s1 s2... . Ví dụ u8 “.”u8“.”u8“.”u8 nén một địa chỉ IP như 4 số nguyên.

Bộ nén luân phiên Alternate Compressor or s1 s2 ... . Một bộ nén kết hợp là or seq u u u hoặc một biến thể khác là orcomb s1 s2 ... .

Bộ nén lặp Repetition Compressor hoặc rep d s . Ở đây d là dấu phân cách delimiter , và s là một bộ nén ngữ nghĩa khác. Ví dụ, một chuỗi dấu phẩy được tách ra từ các từ khóa có thể được nén bởi rep "," e .

Ví dụ 3.9: Minh họa việc sử dụng các bộ nén ngữ nghĩa kết hợp cho dữ liệu Weblog. -p//apache:host=>seqcomb u8 ”.” u8 ”.” u8 ”.” u8 -p//apache:userAgent=>seq(e "/" e) -p//apache: byteCount=>u -p//apache:statusCode=>e -p//apache:contentType=>e -p//apache:requestLine=>seq("GET " rep("/" e) " HTTP/1." e) -p//apache:date=>seq u "/" u8 "/" u8 “-” u8 “:” di “:” di

-p//apache:referer=>or seq "file:" t seq “http://" or seq rep "." e "/" rep "/" e rep "." e))) t)

ộ nén ngữ nghĩa do người dùng tự định nghĩa (User-defined Compressor): một số ứng dụng đ i hỏi các bộ nén có tính chuyên môn hóa cao như các chuỗi DNA, người dùng có thể viết ra các bộ nén/ giải nén của riêng mình và liên kết chúng vào trong XMill và XDemill bằng cách cài dặt sử dụng SCAPI Semantic Compressor API . API yêu cầu người dùng cài đặt một số phương thức C++ và định nghĩa bộ nén với tên duy nhất.

Ví dụ 3.10: Giao diện SCAPI cho quá trình cài đặt các bộ nén ngữ nghĩa class UserCompressorFactory {

virtual char *GetName()=0;

virtual UserCompressor *InstantiateCompressor (char *paramstr, int len)=0;

virtual UserDecompressor *InstantiateDecompressor(char *paramstr, int len)=0;

};

class UserCompressor { (adsbygoogle = window.adsbygoogle || []).push({});

virtual unsigned GetContainerNum()=0; virtual bool IsRejecting()=0;

virtual bool ParseString (char *

str, int len, void *state)=0;

virtual void CompressString(char *str, int len,

Container *contarray, void *state)=0; class

virtual void FinishCompress(Container *contarray, void *state)=0;

};

class UserDecompressor {

virtual void DecompressItem(DecomprCont *contarray, XMLOutput *output, void *state)=0;

};

Một phần của tài liệu luận văn: tìm hiểu và so sánh một số kỹ thuật nén XML (Trang 33)