Tìm kiếm trên văn bản nén

Một phần của tài liệu Tìm kiếm mờ và ứng dụng tìm kiếm thông tin trong các văn bản nén (Trang 59)

3.2.1. Các mô hình nén văn bản

Nén dữ liệu là một lĩnh vực của lý thuyết thông tin mà mục đích chính là làm giảm thiểu khối lượng dữ liệu được lưu trữ và trao đổi. Nén dữ liệu text thực chất là một quá trình mã hóa, chuyển các thông báo nguồn (trong bảng chữ nguồn A) thành các bản mã (trong bảng chữ mã B) và ngược lại là quá trình giải mã. Các dạng mã hóa có thể là block - block, block - variable, variable - block và variable - variable , trong đó block - block là các thông báo nguồn và các bản mã đều có thể thay đổi. Một cách phân loại khác chỉ ra 2 phương pháp nén là tĩnh và động. Trong phương pháp tĩnh, ánh xạ từ tập thông báo nguồn đến tập từ mã được xác định trước khi bắt đầu quá trình chuyển đổi nên với một thông báo cho trước thì tất cả các lần xuất hiện của nó đều tương ứng với một bản mã. Với phương pháp động, ánh xạ từ tập thông báo đến tập bản mã thay đổi theo thời gian. Cho đến nay đã có nhiều thuật toán nén dữ liệu text được đưa ra [15], như nén Hufman, LZ, LZW,...

3.2.2. Thuật toán tìm kiếm trên dữ liệu nén dạng text

Thuật toán theo tiếp cận mờ đã nêu ở mục 2.2 có thể áp dụng trên các tệp dữ liệu nén mà không cần giải nén toàn bộ. Ý tưởng cơ bản là đọc tuần tự trên tệp nén và mở nén một số mã nén, lưu kết quả giải nén

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

51

cục bộ vào vùng đệm và áp dụng thuật toán theo tiếp cận mờ trên vùng đệm này. Khi đó một số vấn đề đặt ra là:

(i) Vùng đệm phải có độ dài đáp ứng được yêu cầu:

- Luôn có thể đọc được một khối kí tự w độ dài m+1 (với m là độ dài xâu mẫu).

- Kích thước phải đủ lớn để vùng đệm không bị tràn khi gặp trường hợp một mã nén tương ứng với một đoạn văn bản dài (chẳng hạn như trong thuật toán Run - length, giải nén mã nén a256 sẽ được 256 kí tự a liên tiếp).

(ii) Truy xuất đến các phần tử trên vùng đệm nhanh, thuận tiện. Để đáp ứng yêu cầu (i), ta đưa ra hai điều kiện cho vùng đệm: - Điều kiện dưới: Dữ liệu trên vùng đệm phải có > m+1 kí tự (nếu chưa đọc hết văn bản).

- Điều kiện trên: Dữ liệu trên vùng đệm phải có độ dài nhỏ hơn hoặc bằng kích thước của vùng đệm, trong đó kích thước của vùng đệm bằng độ dài tối đa khi giải nén của một mã nén cộng với m+1. Ở đây ta cần xem như độ dài tối đa của một mã nén khi giải nén đã được xác định cụ thể trong từng phương pháp giải nén khác nhau.

Để đáp ứng yêu cầu (ii) ta sử dụng cấu trúc dữ liệu dạng hàng đợi vòng tròn (circular queue) dựa trên vùng đệm là một mảng kí tự như sau:

buffer: array[1...bur_len] of char;

trong đó buf_len = max_encode_len+m-1, với max_encode_len là độ dài tối đa khi mở nén của một mã nén.

Hàng đợi vòng tròn trên vùng đệm được xác định bởi 2 con trỏ: F trỏ vào đầu lấy ra một phần tử trong queue, B trỏ vào đầu đưa một phần tử vào hàng đợi. Độ dài của hàng đợi (ký hiệu là len_queue) bằng số phần tử trên hàng đợi, cụ thể được tính theo công thức sau:

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn 52 len_queue =              F B , 1 F B len _ buf ) 1 B F _( len _ buf F B , 1 F B

Hoạt động của queue

Phép định vị con trỏ T trên hàng đợi sau bước nhảy qua k phần tử được xác định theo chiều kim đồng hồ bởi công thức:

Tk =           len _ buf k T , len _ buf k T len _ f bu k T , k T

Khi vùng đệm không thỏa mãn điều kiện dưới, cần phải bổ sung thêm một đoạn dữ liệu giải nén. Ta đặt giả thiết là từng phương pháp giải nén đều có thể xây dựng được thủ tục Decompress (buffer, B, len_queue) theo yêu cầu sau: (Hình 3.3)

+ Đọc một số mã nén, giải nén và lưu vào buffer bắt đầu từ vị trí b 1 + Kết thúc thủ tục, B trỏ vào kí tự cuối cùng được ghi vào buffer + Kết thúc thủ tục thì vùng đệm thỏa mãn điều kiện trên và dưới, có nghĩa m+1 < len_queue  buf_len.

Nếu đã đọc hết văn bản mà điều kiện dưới vẫn chưa được đáp ứng thì chấp nhận len_queue  m+1.

Hình 3.3. Queue trước (a) và sau (b) khi thực hiện thủ tục Decompress B Decompress B F len_queue len_queue m+1 (a) (b) m+1 F

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

53

Ở đây ta chỉ xét loại hình thức giải nén mà một mã nén cho ra một khối kí tự (như Hufman, LZ, LZW...). Với những giải thuật nén mà dữ liệu giải nén không ở dạng khối kí tự thì chỉ cần thay đổi nguyên tắc họat động của thủ tục Decompress. Có thể tăng thêm cơ chế quản lý buffer nếu dữ liệu là mảng các bit thì phải có con trỏ quản lý tới bit.

Thuật toán 3.1.

Vào: Mẫu P độ dài m, dòng dữ liệu S ở dạng nén, AP là bảng các

kí tự xuất hiện trong mẫu P.

Ra: - Mảng apr lưu vị trí xuất hiện của mẫu trên văn bản sau khi mở nén. (adsbygoogle = window.adsbygoogle || []).push({});

- Counter lưu số lần xuất hiện mẫu P.

Hình 3.4. Queue trước (a) và sau (b) bước nhảy n2‟ Phương pháp : (Hình 3.4) Begin F := 0; B := 0; lenqueue := 0; counter := 0; j := 0; n1 := 0; n2 := 1; repeat F := F n2; j := j + n2; if len_queue <= m +1 then B F len_queue m+1 (a) B len_queue (b) F new = F old  n2‟ F old m+1

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

54

Decompress (buffer, B, len_queue); if n2 > 1 then n1 := 0; n1’ := TFuzz (n1, buffer [F]); n2’ := 1; if n1’ = m then begin counter: =counter + 1; apr [counterr]:=j - m+1; end

else if n1’ < m and n1’ < n1 then begin t:=F (m-n1’) if t > B then return; if buffer[t] Ap then n2’:= 1 + m - n1’; end; len_queue := len_queue - n2’; n1:=n1’; n2:= n2’; until len_queue <= 0; End.

Khả năng mở rộng của phương pháp

Trong từng giải thuật nén và giải nén cụ thể, với những cấu trúc cụ thể, chẳng hạn dạng cây (Hufman, LZW) ta có thể dựa trên giải thuật trên, cải biên để xây dựng các giải thuật sử dụng một danh sách của vài con trỏ, trỏ vào những điểm thích hợp trên cây để tận dụng ngay cấu trúc cây trực tiếp, thay cho việc cần một hàng đợi thực sự, nhằm tăng hiệu quả của chương trình.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

55

3.3. Tìm kiếm trên văn bản mã hóa

3.3.1. Tìm kiếm trên văn bản mã hóa dạng khối kí tự

Nén dữ liệu text thực chất là một quá trình mã hóa, vì vậy thuật toán tìm kiếm trên văn bản nén có thể áp dụng đối với văn bản mã hóa dạng khối kí tự, trong đó thủ tục giải nén Decompress được thay thế bằng thủ tục giải mã.

3.3.2. Mã đàn hồi

Trong mã thông thường, tích hai từ là phép đặt 2 từ cạnh nhau và tập X là mã nếu một từ bất kỳ có sự phân tích thành tích của các từ mã trong X thì sự phân tích đó là duy nhất. Đã có nhiều phương pháp mở rộng khái niệm tích sử dụng kỹ thuật khác nhau để từ đó đề xuất xây dựng các lớp mã mới. Một trong những hướng nghiên cứu mở rộng trong lý thuyết mã là sử dụng các yếu tố điều khiển để đề xuất tích mới của các từ mã, nhằm xây dựng các lớp mã mới. Những hình thức mã mới như mã zigzag, mã điều khiển theo tích trộn đã được nhiều tác giả trên thế giới nghiên cứu, còn mã đàn hồi (spring product) được giới thiệu lần đầu tiên trong [16].

Ở đây ta giới hạn xem xét các ngôn ngữ xây dựng từ bảng chữ nhị phân B = {0,1} có độ dài như nhau, X  Bk = [0,1}k.

Ý tưởng xây dựng tích đàn hồi là trong quá trình mã hóa, tích của các từ không ghép như tích thông thường mà có thể “co lại” hoặc “kéo dãn”.

Ta sẽ sử dụng đồ thị để xây dựng khái niệm tích đàn hồi (được gọi là đồ thị xác định mã đàn hồi).

Mỗi phần tử b = b1b2,...,bk  Bk được mô tả bằng 1 đỉnh có tên tương ứng.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

56

Từ mỗi đỉnh b = b1b2,...,bk có 2 cung đi ra đến 2 đỉnh c, d được xác định như sau:

+ Cung từ đỉnh b = b1b2,...,bk đến đỉnh c = b2...bk1 sẽ có nhãn 1 + Cung từ đỉnh b = b1b2,...,bk đến đỉnh d = b2...bk0 sẽ có nhãn 0

Ví dụ 3.1. Với k = 3, ta có đồ thị mô tả cho B3

= {0,1}3 như sau (Hình 3.5)

Hình 3.5. Đồ thị xây dựng khái niệm tích đàn hồi

Với việc sử dụng biểu diễn bằng đồ thị như trên, có thể định nghĩa tích đàn hồi của hai từ x,y B như sau.

Định nghĩa 3.1. Cho ngôn ngữ X  Bk = {0,1}k, hai từ x, y  X, mà hai đỉnh tương ứng trong đồ thị của Bk là xB, yB. Tích đàn hôi của x, y kí hiệu x.py là một đường đi p từ xB đến yB không qua các đỉnh trung gian thuộc X: xB yB. 111 011 110 101 001 010 000 100 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

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

Chú ý rằng qua cách thể hiện bằng đồ thị ở trên, có thể có nhiều đường đi p: XB yB, tức là có thể có nhiều phương án mã hóa khác nhau (mã hóa đa trị).

Một cách quy nạp ta định nghĩa: x1.px2.p....pxn = (x1.px2.p....pxn-1).p.xn

Từ khái niệm tích đàn hồi, khái niệm mã đàn hồi được xây dựng như sau.

Ví dụ 3.2. Cho X = {000,010,110,101] và ánh xạ mã a000, b010, c 110, d 101

ab được mã bởi 00(0)10 với tính chất “co lại” thay vì như tích ghép là 000010. Có thể thấy 00010 phân tích duy nhất thành các từ trong X.

Tuy nhiên nếu mã ab bởi 000101 theo kiểu tích ghép thì giải mã theo kiểu tích đàn hồi sẽ không duy nhất, chẳng hạn.

000101 = (000)(101) = ad = (000) (010) (101) = abd.

Để tránh tình huống này, khi mã hóa ad ta sẽ “kéo dãn” thành 0001101, khi đó 0001101 được giải mã thành (000)(001)(011)(101) = 000.00001.0101110101( sự phân tích là duy nhất qua các từ a, d trong X).

Định nghĩa 3.2. Cho ngôn ngữ X Bk = {0,1}k, X là mã tích đàn hồi nếu một từ bất kỳ được phân tích theo tích đàn hồi bởi các từ trong X thì sự phân tích đó là duy nhất.

Ví dụ 3.3.Cho B3, ngôn ngữ X ={000,010, 101, 111}.Giả sử có ánh xạ mã: a  000, b 010, c 111, d 1010

Tích ab được mã hóa bởi đường đi từ đỉnh 000 đến đỉnh 010 qua đỉnh 001:

ab 00010.

Tích abd được mã hóa bởi đường đi từ đỉnh 000 qua 001, 010 đến 101: abd 000101.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

58

Việc giải mã được tiến hành bằng việc duyệt theo con đường xác định bởi các nhãn. Chẳng hạn 000101 được giải mã như sau:

+ Từ đỉnh 000 = a theo nhãn 1: đến đỉnh 001. + Tiếp tục theo nhãn 0 đến đỉnh 010 = b,

+ Cuối cùng theo nhãn 1 đến đỉnh 101 = d. Kết quả được từ abd.

Hình 3.6. Đồ thị xác định mã đàn hồi

Mệnh đề 3.1. Cho ngôn ngữ X Bk. X là mã đàn hồi khi và chỉ khi với mọi cặp đỉnh x, y X, tồn tại ít nhất một đường đi từ x tới y không qua bất kỳ đỉnh trung gian nào khác thuộc X.

3.3.3. Tìm kiếm trên văn bản mã hóa bởi mã đàn hồi

3.3.3.1. Ý tưởng chung

Giải pháp

- Xây dựng otomat đoán nhận mã của một ký tự

111 011 110 101 001 010 000 100 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

59

- Kết hợp với otomat tìm kiếm theo mẫu tiếp cận mờ xác định độ mờ xuất hiện mẫu. Khi độ mờ này bằng độ dài mẫu, báo hiệu một lần xuất hiện mẫu.

Yêu cầu:

- Thuật toán tìm chính xác sự xuất hiện mẫu, không bỏ sót. (adsbygoogle = window.adsbygoogle || []).push({});

- Không giải mã cục bộ mà vẫn thống kê được tần suất xuất hiện mẫu, mặc dù phương pháp mã hóa đàn hồi là đa trị.

3.3.3.2. Phương pháp đánh giá độ mờ xuất hiện mẫu trên văn bản mã hóa hóa

3.3.3.2.1. Bài toán

Giả sử: A là bảng chữ rõ; B là bảng chữ mã

Hàm mã E: A  Bk

Để thuận tiện cho việc trình bày, không mất tính tổng quát, có thể giả sử A = {a,b,c,d]=, b = {0,1}, k = 1, hàm mã hóa theo phương pháp mã đàn hồi xác định như sau (xem đồ thị Hình 3.4.):

A a b c d

E(A) 000 010 101 111

Xác định hàm bin: {0,...,2k} Bk, bin(i) cho xâu nhị phân của i. Bài toán đặt ra là: Cho xâu mẫu P = P1P2...Pm trên bảng chữ A. Xâu đích S được mã hóa thành Y = Y1Y2...Yn theo phương pháp mã đàn hồi. Thống kê tần suất xuất hiện mẫu P trong xâu mã hóa Y.

3.3.3.2.2. Mô tả phương pháp

- Đổi sánh các kí tự đã mã hóa của mẫu P với xâu đích Y

- Dùng otomat A0 tìm kiếm mẫu rõ để tìm vị trí đầu tiên gặp mã E(P1) của kí tự đầu của mẫu P; Otomat A1 đoán nhận mã; Otomat A2

đoán nhận độ mờ xuất hiện mẫu rõ P. Mỗi giá trị trạng thái ra của otomat A1 nếu là trạng thái kết thì sẽ là trạng thái vào của otomat A2.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

60

3.3.3.2.3. Chi tiết hóa các otomat trong thuật toán

Otomat A1 đoán nhận mã

A1(P) = (1, Q1,Q10, Q1F, 1), trong đó:

1 = {0,1}: bảng chữ vào

Q1 = {0,1, ..., 2k-1}: là tập trạng thái Q10: là tập trạng thái khởi đầu Q1F là tập trạng thái kết

Q10 = Q1F = bin-1 (E(A)) = (A), với hàm  = bin-1.E

Hàm chuyển 1 được xây dựng theo đồ thị xác định mã đàn hồi (xem Hình 3.6)

Ví dụ 3.5: Với hàm mã hóa ở Mục (a), ta có :

Q = {0,1,..,7}; Q10 = Q1F = {0,2,5,7} Hàm chuyển 1 được xây dựng là:

A Q 0 1 0 0 1 1 2 3 2 4 5 3 6 7 4 0 1 5 2 3 6 4 5 7 6 7

Otomat A2 đoán nhận độ mờ xuất hiện mẫu rõ P

Otomat A2 có quan hệ đẳng cấp với otomat mờ A(P) =

(A,Q,q0,,F) tìm kiếm mẫu rõ (xem Định nghĩa 1.4, Mục 1.6.3.1); Bảng chữ vào là 2 = (AP){#}; Hàm chuyển là 2‟.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

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

Ví dụ 3.6. Với mẫu P = ababa, hàm chuyển 2‟ như sau:

2 Q 0 2 # 0 1 0 0 1 1 2 0 2 3 0 0 3 1 4 0 4 5 0 0 5 1 4 0

3.3.3.2.4. Thuật toán tìm kiếm mẫu dựa trên otomat

Vào: Xâu mẫu rõ P, xâu mã Y = Y1Y2...Yn

Ra: counter đếm số lần xuất hiện mẫu P + Giả sử đã xây dựng ba otomat A0, A1, A2

+ Biến q ghi giá trị trạng thái của otomat A1 đoán nhận mã. Nếu q là một trạng thái kết, báo hiệu đoán nhận được mã của một ký tự trong bảng chữ A.

+ Biến f ghi giá trị độ mờ xuất hiện mẫu rõ P

+ Hàm AoSeek(P1,j) tìm vị trí (kết thúc) trên xâu mã hóa Y đọc được ký tự P1 lần đầu tiên, kể từ vị trí j trở đi.

Phương pháp

counter:= 0; j:=1; f:=0;

j: = AoSeek(P1,j); {P1 là ký tự đầu tiên trng mẫu} if j = 0 then return (0);

j:=J+1; f:=1; q = (P1); while j<=n and f> 0 do

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

62

if q Q1F then f:=2(f,q);

if f=m then counter:=counter+1; endif; endif;

j:=j+1; andwhile; until j>=n; return (counter);

Ví dụ 3.7. Với mẫu P=ababa, xâu đích S=aacdababab được mã hóa thành Y

a b b b b Y = 0000110111000100011001001100010 a c a a b a

Một phần của tài liệu Tìm kiếm mờ và ứng dụng tìm kiếm thông tin trong các văn bản nén (Trang 59)