MỤC LỤC
MỞ ĐẦU . 1
Chương 1. TÌM KIẾM MẪU TRONG VĂN BẢN THEO CÁCH
TIẾP CẬN OTOMAT MỜ . 5
1.1. Tổng quan về tìm kiếm mẫu trên văn bản . 5
1.1.1 Giới thiệu chung về vấn đề tìm kiếm văn bản . 5
1.1.2. Các dạng tìm kiếm và các kết quả nghiên cứu . 7
1.1.2.1. Tìm đơn mẫu . 7
1.1.2.2. Tìm đa mẫu . 8
1.1.2.3. Tìm mẫu mở rộng . 9
1.1.2.4. Tìm kiếm xấp xỉ . 10
1.1.2.4.1. Phát biểu bài toán . 10
1.1.2.4.2. Các tiếp cận tìm kiếm xấp xỉ . 11
1.1.2.4.3. Độ tương tự giữa hai xâu . 12
1.1.3. Tìm kiếm trong văn bản nén và mã hoá . 14
1.2. Hệ mờ . 15
1.3. Ý tưởng chung của tiếp cận otomat mờ . 15
1.4. Khái niệm otomat mờ . 17
1.5. Một số thuật toán so mẫu . 18
1.5.1. Thuật toán KMP ( Knuth- Morris- Pratt) . 18
1.5.2. Thuật toán BM ( Boyer- Moor) . 22
1.6. Kết luận chương 1 . 26
Chương 2. BÀI TOÁN SO MẪU THEO CÁCH TIẾP CẬN OTOMAT MỜ. 27
2.1. Bài toán so mẫu chính xác . 27
2.1.1. Phát biểu bài toán . 27
2.1.2. Độ mờ của mô hình . 27
2.1.3. Thuật toán KMP mờ . 28
2.1.3.1. Otomat so mẫu . 28
2.1.3.2. Tính đúng đắn của thuật toán . 29
2.1.3.3. Thuật toán . 29
2.1.3.4. So sánh KM P và thuật toán KMP mờ . 32
2.1.4. Thuật toán KMP - BM mờ . 33
2.1.4.1. Ý tưởng của thuật toán . 33
2.1.4.2. Otomat mờ so mẫu . 35
2.1.4.3. Thuật toán 2.4 . 37
2.2. Bài toán so mẫu xấp xỉ. 38
2.2.1. Đặt vấn đề. 38
2.2.2. Bài toán . 39
2.2.3. Độ tương tự dựa trên độ dài khúc con chung của hai xâu . 40
2.2.3.1. Phát biểu bài toán. 40
2.2.3.2. Otomat so mẫu . 42
2.2.4. Độ gần tựa ngữ nghĩa. 43
2.2.4.1. Ý tưởng về độ gần . 43
2.2.4.2. Thuật toán sơ bộ tính độ gần . 44
2.2.4.2.1. Ý tưởng . 44
2.2.4.2.2. Thuật toán chi tiết . 44
2.2.4.3. Giải thích độ mờ của mô hình . 45
2.3. Kết luận chương 2 . 46
Chương 3. TÌM KIẾM MẪU TRONG VĂN BẢN NÉN VÀ MÃ HOÁ . 47
3.1. Tiếp cận tìm kiếm tổng quát trên văn bản nén và mã hoá . 47
3.2. Tìm kiếm trên văn bản nén . 50
3.2.1. Các mô hình nén văn bản . 50
3.2.2. Thuật toán tìm kiếm trên dữ liệu nén dạng text . 50
3.3. Tìm kiếm trên văn bản mã hóa. 55
3.3.1. Tìm kiếm trên văn bản mã hóa dạng khối kí tự . 55
3.3.2. Mã đàn hồi . 55
3.3.3. Tìm kiếm trên văn bản mã hóa bởi mã đàn hồi . 58
3.3.3.1. Ý tưởng chung . 58
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 . 59
3.3.3.2.1. Bài toán . 59
3.3.3.2.2. Mô tả phương pháp . 59
3.3.3.2.3. Chi tiết hóa các otomat trong thuật toán . 60
3.3.3.2.4. Thuật toán tìm kiếm mẫu dựa trên otomat . 61
3.3.4. Tìm kiếm trên văn bản mã hóa hai tầng . 63
3.4. Kết luận chương 3 . 64
KẾT LUẬN . 65
TÀI LIỆU THAM KHẢO . 67
76 trang |
Chia sẻ: maiphuongdc | Lượt xem: 1849 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Luận văn 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
otomat mờ
Một số nghiên cứu về otomat mờ có thể xem trong 9, ….
Mô hình otomat mờ dạng tổng quát có mỗi trạng thái mờ là một
tập con mờ trên tập nền X = 1, …, n (X hữu hạn), có hàm thuộc mở
rộng là f: X R. Ta có thể biểu diễn f dưới dạng vector rõ (f(1),
f(2),…,f(n)). Như vậy, trạng thái mờ được xem như là một véctor n
chiều toạ độ thực. Tuỳ theo từng ứng dụng cụ thể mà có thể xem f(i)
0,1 hay f(i) N hay f(i) R,….
Định nghĩa 1.2. Một otomat mờ tổng quát là bộ A(P) = (A, Q, qo, ,
F), trong đó:
+ Bảng chữ vào A = A0
t , trong đó mỗi chữ là một xâu gồm t ký tự
trên bảng chữ cơ sở A0.
+ Q là tập hữu hạn các trạng thái mờ có dạng q = (v1, v2,….vk)
trên tập nền X = 1,…, k với giá trị mờ nguyên
+ q0 Q là trạng thái khởi đầu
+ F là tập các trạng thái kết thúc
+ Hàm chuyển : Q × A Q
Hàm chuyển có thể được mở rộng trong đó tín hiệu tác động là một
xâu thuộc A*:
(q, wa) = ((q, w),a), w A*, a A.
Số thành phần trong trạng thái mờ và tập giá trị mờ phụ thuộc vào
quan điểm về “độ mờ xuất hiện mẫu” và nhu cầu tìm kiếm trong từng
bài toán cụ thể.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
18
Để thuận lợi cho việc trình bày sau này, quy định một số ký hiệu
như sau:
Với w, w1, w2 là các xâu ký tự,
+ wi là ký tự thứ i của xâu w
+ w(f,d) là xâu con (hay khúc con) độ dài f của xâu w, kết thúc ở vị trí
d trên w.
+ w1 s w2 nếu w1 là khúc đuôi của w2
+ w1 ls w2 nếu w1 là khúc đuôi dài nhất của w2
+ Với w = w1, w2….wm, 0 t m
w(t) hoặc preft(w) là khúc đầu độ dài t của w, w(t) = w1 w2….wt
Suft(w) là khúc cuối độ dài t cuả w, Suft(w) = wm - t+1 w m-t+2....wm
Quy ước pref0(w) = suf0(w) = ( là xâu rỗng)
+ Với a là một ký tự, w = w1w2…wm, ký hiệu wa = w1w2…wma
1.5. Một số thuật toán so mẫu
1.5.1. Thuật toán KMP ( Knuth- Morris- Pratt)
Thuật toán KMP được trình bày chi tiết trong 4, 5, 14 nội dung
như sau:
Duyệt từ trái sang phải trên S và P, mỗi lần một ký tự. Gọi con trỏ
trên P là i, con trỏ trên S là j. Giả sử đã xuất hiện khúc đầu độ dài i - 1
của mẫu P và việc khớp mẫu thất bại tại vị trí j trên S, có nghĩa:
P1P2…Pi -1 Sj - i + 1Sj - i + 2…S j - 1 và Pi Sj
Khi đó cần phải bắt đầu đối sánh mẫu từ vị trí j - h +1 trên S (trường
hợp xấu nhất h = i - 1 trong thuật toán Brute - Force). Nếu tồn tại h > 0
sao cho h - 1 ký tự đầu của mẫu khớp với h - 1 ký tự cuối của đoạn S(j -
1) hay có nghĩa đã khớp với h - 1 ký tự cuối của P(i - 1) thì ta có thể bỏ
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
19
h=next[i]
S
P
P
i
j
m m +1
j
h=next[m+1]
P
S
P
qua h - 1 phép so sánh và tiếp tục so sánh 2 ký tự Ph và Sj (hình 1.1). Do
h phụ thuộc vào i nên ký hiệu h = nexti, i = 1,…,m.
?
Hình 1.1. Ý nghĩa của mảng next
Nếu Sj Ph thì phải tiếp tục lùi con trỏ trên mẫu. Để khắc phục
nhược điểm do tình huống này gây ra, cần cố gắng tìm h sao cho Ph có
nhiều khả năng bằng Sj. Vì Sj Pi nên cần tìm h thoả mãn Ph Pi .
Trong KMP, khi i > m ta được một xuất hiện của mẫu bắt đầu từ
vị trí j - m trên S. Để tìm xuất hiện tiếp theo, nếu bắt đầu đối sánh từ P1
và Sj thì có thể bỏ sót mẫu khi có mẫu xuất hiện lồng nhau. Vì vậy, khi
con trỏ trên S dừng ở vị trí j, cần trượt mẫu đi một số vị trí sao cho h - 1
ký tự đầu của mẫu khớp với h - 1 ký tự cuối của S(j - 1) hay chính là
khớp với h - 1 ký tự cuối của P(m). Do đó cần mở rộng mảng next với i
= m + 1. (Hình 1.2).
Hình 1.2. Ý nghĩa của mảng next tại vị trí m + 1
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
20
Như vậy, với mỗi vị trí i trên P, i = 1..m + 1, cần xác định next i
thoả mãn:
+ nexti là số h lớn nhất sao cho h - 1 ký tự đầu của mẫu khớp
với h - 1 ký tự cuối của P(i- 1).
+ Pi Pnext i
(để có nextm + 1, tưởng tượng như đã bổ sung thêm ký tự vào
cuối P, với là một ký tự không xuất hiện trong P).
Ví dụ 1.1. Với P = aababaab ta có bảng next như sau:
i 1 2 3 4 5 6 7 8 9
next[i] 0 0 2 0 2 0 0 2 4
Thuật toán 1.1. Xây dựng mảng next
procedure Initnext();
var i, j: Integer;
begin
i: = 1; j: = next 1: = 0;
while i< = m do
begin
while j > 0 and Pi P j do j: = next j;
i: = i + 1; j: = j + 1;
if ( i < = m) and (Pi = P j) then next i := next j
else next i : = j;
end;
end;
Thuật toán 1.2. KMP tìm nhiều lần lặp mẫu
proedure KMP();
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
21
Tìm mọi vị trí xuất hiện xâu mẫu P độ dài m trong xâu đích S độ dài n,
đồng thời thống kê tần suất xuất hiện mẫu
var i, j: Integer;
counter: Integer;
begin
Initnext ();
i:= 1; j:= 1; counter: = 0;
repeat
while i < = m and j < = n do
begin
while (i > 0) and (Sj Pi) do i: = next i;
i: = i + 1; j = j + 1;
end;
if( i > m) then
begin
Ghi nhận vị trí xuất hiện mẫu là j - m;
counter: =counter + 1;
end;
i: = next m + 1;
until j > n;
Ghi nhận counter;
end;
Độ phức tạp của thuật toán 4, 5
- Pha tiền xử lý mẫu: Độ phức tạp thời gian và không gian để xây
dựng bảng next là O(m).
- Pha tìm kiếm: Thời gian xấu nhất là O(m+n).
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
22
1.5.2. Thuật toán BM ( Boyer- Moor)
Một tiếp cận phổ biến trong các thuật toán so đơn mẫu là duyệt tuần
tự qua tất cả các ký tự trên xâu vào S, mỗi lần một ký tự. Nhưng trong
thuật toán BM, có thể có những bước nhẩy xa trên S được thực hiện, nhờ
vậy BM được đánh giá là thuật toán nhanh nhất về thực hành, đây là lựa
chọn hiệu quả cho những ứng dụng thông thường như các trình soạn thảo
văn bản.
Ý tưởng cơ bản của thuật toán là sử dụng một “Cửa sổ trượt” như
sau: “Cửa sổ” thực ra là một khúc độ dài m trên xâu vào S (m là độ dài
của mẫu P) được đối sánh với mẫu tại một thời điểm nào đó. Mỗi lần đối
sánh mẫu P với một cửa sổ trên S bằng cách so sánh từng ký tự từ phải
sang trái. Khi gặp ký tự không khớp, cửa sổ trượt sang phải qua một
đoạn trên S (tương ứng với việc dịch mẫu P sang phải). Trường hợp tốt
nhất khi sự không khớp xảy ra tại vị trí Pm và ký tự không khớp là Sk lại
không phải là một ký tự trong mẫu P, lúc đó có thể an toàn trượt cửa sổ
sang phải qua m vị trí trên S và bắt đầu quá trình tìm kiếm mới bởi việc
so sánh Pm và Sk+ m.
Giả sử tại một thời điểm đang xét cửa sổ Sk - m+ 1Sk - m + 2 .... Sk và bắt
đầu so sánh Pmvới Sk.
(1) Giả sử Pm Sk có hai khả năng:
a) Nếu vị trí xuất hiện phải nhất của ký tự Sk trong P là m - g, ta có
thể dịch mẫu P sang phải g vị trí sao cho Pm-g dóng thẳng với Sk
rồi bắt đầu lại quá trình đối sánh bởi phép so sánh Pm và S k+ g
b) Nếu ký tự Sk không có mặt trong P, ta có thể dịch mẫu P sang
phải m vị trí. Đây là bước dịch chuyển xa nhất có thể mà vẫn
không bỏ sót sự xuất hiện nào của mẫu.
(2) Giả sử m - i ký tự cuối của mẫu P đã khớp với m - i ký tự cuối của S(k).
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
23
Nếu i = 0, ta đã tìm được một xuất hiện của mẫu P.
Ngược lại, nếu i > 0 và Pi Sk -m+i, xét hai khả năng:
a) Nếu vị trí xuất hiện trái nhất của ký tự Sk -m+i trong P là i - g,
khi đó mẫu P được dịch sang phải g vị trí sao cho Pi-g dóng
thẳng với Sk-m+i và sẽ bắt đầu quá trình đối sánh mới, bắt đầu
từ Pm so với Sk+g. Nếu Pi-g nằm bên phải của Pi (khi g < 0) thì
mẫu P chỉ dịch sang phải 1 vị trí.
b) Giả sử sufi(P) là một xâu con của Pi+1-gPi+2-g....Pm-gvà Pi-g Pi
(nếu có nhiều xuất hiện như vậy của sufi(P) thì chọn vị trí phải
nhất). Khi đó sẽ dịch mẫu P sang phải một đoạn dài hơn so với
trường hợp (2a) sao cho khúc Pi+1-gPi+2-g....Pm-g dóng thẳng với
khúc Sk-m+i+1Sk-m+i+2...Sk và bắt đầu quá trình đối sánh mới từ Pm
so với Sk+g.
Như vậy, khi Pi Sj, mẫu P sẽ dịch sang phải đi một số vị trí. Thuật
toán sử dụng hai bảng d1và d2 để tính toán bước địch chuyển này.
Bảng d1 bao hàm trường hợp (1) và (2a): Với mỗi ký tự c, d1c là số i
lớn nhất sao cho c = Pi hoặc dc = m nếu c không xuất hiện trong mẫu P.
Bảng d2 bao hàm trường hợp (2b): Với mỗi i, 1 i m, d2i được
xác định là: d2i = ming + m - i| g 1 và (g i hoặc Pi-g Pi)
và ((g k hoặc Pk-g = Pk) với i k m)
Có nhiều cách tính toán bảng d2 được đưa ra. Thuật toán 1.3. tính
bảng dịch chuyển d2 là của Knuth, có sự sửa đổi của Mehlhorn.
Trong thuật toán 1.3 sử dụng hàm f có tính chất f[m] = m+1 và với 1
j < m, fj = mini j < i < m và Pi+1Pi+2....Pm = Pj+1Pj+2....Pm+j-i.
Thuật toán 1.3. Tính bảng dịch chuyển d2
procedure computed 2();
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
24
begin
for i: = 1 to m do d2i : = 2 *m- i;
j := m; k: = m+ 1;
while j > 0 do
begin
fj: = k;
while k <= m and Pj Pi do
begin
d2k:= mind2k, m- j ;
k: = fk];
end;
j := j - 1; k := k - 1;
end;
for i: = 1 to k do d2i : = mind2i, m +k - i
j: = fk;
while k < = m do
begin
while k <=j do
begin
d2k := mind2k, j-k + m
k := k + 1;
end;
j: = fj;
end;
end;
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
25
Thuật toán 1.4. Thuật toán BM tìm sự xuất hiện của mẫu P trong xâu
vào S
procedure BM();
var i, j: integer;
counter: integer;
begin
j:= m; counter: = 0;
while j <= n do
begin
i: = m;
while i >0 and Sj Pi do
begin i: = i - 1; j: = j - 1; end;
if i: = 0 then
begin Ghi nhận một lần xuất hiện mẫu tại vị trí j + 1;
counter: = counter + 1;
j := j + m + 1;
end;
else j: =j+ maxd1Sj, d2i;
end;
Ghi nhận counter;
end;
Độ phức tạp của thuật toán 4, 5
Độ phức tạp thời gian là O(m + n) và độ phức tạp không gian là
O(m).
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
26
1.6. Kết luận chương 1
Chương này đã trình bày tổng quan về vấn đề tìm kíêm văn bản,
phát biểu và tổng kết các hướng nghiên cứu cho các dạng bài toán tìm
kiếm. Nội dung của luận văn tập trung giải quyết bài toán so đơn mẫu,
chính xác, xấp xỉ theo hướng tiếp cận sử dụng một số hệ hình thức
otomat mờ. Ý nghĩa của tiếp cận này cũng như mô hình otomat mờ tổng
quát được giới thiệu ở mục 1.2. Cuối cùng là hai thuật toán kinh điển nổi
tiềng cho bài toán so đơn mẫu chính xác là KMP và BM được trình bày.
Việc tính toán bảng next trong KMP và ý tưởng về bước dịch chuyển xa
trong BM là nguồn gốc cho 2 thuật toán so đơn mẫu chính xác, xấp xỉ
theo tiếp cận mờ sẽ được đưa ra ở chương 2.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
27
Chương 2. BÀI TOÁN SO MẪU THEO CÁCH TIẾP CẬN
OTOMAT MỜ
2.1. Bài toán so mẫu chính xác
2.1.1. Phát biểu bài toán
Cho xâu mẫu P độ dài m (P = P1P2 ... Pm) và xâu đích S độ dài n (S
= S1S2 ... Sn) trên cùng bảng chữ A. Tìm tất cả các vị trí xuất hiện của
mẫu P trong xâu S.
Từ việc giải bài toán trên dễ dàng thống kê được tần suất xuất hiện
mẫu P trong một văn bản.
2.1.2. Độ mờ của mô hình
Bài toán đặt ra ở đây là tìm kiếm chính xác mẫu, nhiều lần lặp
mẫu. Độ mờ là một giá trị nguyên thuộc khoảng [0,...,m] cho biết độ dài
của khúc đầu dài nhất của mẫu P đã xuất hiện trên S. Đây cũng có thể
xem như một mô hình “lỗi”, rất phù hợp với tìm kiếm xấp xỉ khúc đầu
trong các từ điển lớn.
Định nghĩa 2.1. Cho xâu mẫu P độ dài m và xâu đích S độ dài n. Độ mờ
xuất hiện mẫu P trên S tại vị trí j là giá trị nguyên 0 thoả mãn:
- = 0 nếu Sj P1
- là số lớn nhất sao cho P1P2 ...P = Sj-+1Sj-+2..... Sj
Trong các thuật toán so mẫu theo tiếp cận mờ ở đây, mỗi khi đọc
được một kí tự Sj sẽ cho biết ngay độ mờ xuất hiện mẫu. Giả sử đã biết
độ mờ tại vị trí j là , khi đọc được ký tự Sj+1 = a, độ mờ mới sẽ được
xác định như một hàm kiến thiết của cặp (,a).
Gọi AP là tập các kí tự có trong mẫu P, # là một kí tự đại diện cho
các kí tự thuộc A nhưng không xuất hiện trong P. Khi đó độ mờ được
xác định thông qua hàm TFuzz:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
28
TFuzz: {0,1, ...,m} × (AP #) {0,1, ...,m}
(,a) ‟ = TFuzz (,a)
gọi là độ mờ cũ, ‟ gọi là độ mờ mới khi gặp kí tự a.
Hàm TFuzz được xây dựng dựa vào bảng next như trong thuật toán
KMP tìm nhiều lần lặp mẫu đã trình bày ở Mục 1.5.1. Dựa vào Định nghĩa
1.3, bằng phương pháp quy nạp, ta nhận được ngay kết quả sau:
Bổ đề 2.1. Giả sử độ mờ xuất hiện mẫu P tại vị trí Sj là , khi đó
độ mờ mới ’ tại Sj+1 được xác định bởi một hàm ’ = TFuzz (, Sj+1),
với TFuzz được xác định như sau:
+ TFuzz (0, ) =
1
1
,1
,0
Px
Px
+ TFuzz (i, #) = 0, i = 0..m
i+1, nếu = Pi+1
mi
xiTFuzz
..1
,
j, j i và j là số lớn nhất sao cho
P1P2...Pj-1 = Pi-j+2Pi-j+3...Pi và Pj = , nếu {Pi+1, #}
Việc xác định j dựa vào bảng next và một vòng lặp.
2.1.3. Thuật toán KMP mờ
2.1.3.1. Otomat so mẫu
Do ý nghĩa của độ mờ là độ dài khúc đầu dài nhất của mẫu P đã
xuất hiện trên S nên otomat sẽ có tập trạng thái là tập số nguyên {0, 1,...,
m}. Hoạt động của otomat mờ so mẫu sẽ như sau:
- Khởi đầu con trỏ trên S là j = 0. Tại đó chưa xuất hiện khúc đầu
nào của mẫu nên trạng thái khởi đầu của otomat là q0 = 0.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
29
- Duyệt S, mỗi lần một kí tự, bắt đầu từ S1. Giả sử trạng thái của
otomat là q thì khi đọc được kí tự Sj, trạng thái mới (ứng với vị trí j trên
S) sẽ là q‟ = (q,Sj) ( là hàm chuyển của otomat).
- Tại vị trí j trên S, nếu trạng thái của otomat là q, có nghĩa khúc
đầu dài nhất xuất hiện trên S của P có độ dài q. Nếu q = m, báo hiệu một
lần xuất hiện mẫu, bắt đầu từ vị trí j -m+1.
Mô hình otomat mờ cần được xây dựng một cách thích hợp để đáp
ứng được yêu cầu sánh mẫu như trên.
Định nghĩa 2.2. Otomat mờ so mẫu là bộ A(P) = (A, Q, q0, , F) trong đó:
+ Bảng chữ vào A = AP {#}
+ Tập trạng thái Q = {0,1,...,m}
+ Trạng thái khởi đầu q0 = 0
+ Trạng thái kết thúc F = m.
+ Hàm chuyển : Q A Q
(q,a) = TFuzz (q,a), với hàm TFuzz được xác định như trong Bổ đề 2.1.
2.1.3.2. Tính đúng đắn của thuật toán
Định lý 1.1. Cho xâu mẫu P độ dài m. A(P) là otomat mờ được xác định
theo định nghĩa 2.2. Giả sử q = (q0, w), w A
*
. Nếu q = F thì P là khúc
cuối của w.
Chứng minh. Dựa vào Bổ đề 2.1. và định nghĩa 2.2., tiến hành quy
nạp theo độ dài của từ w, dễ dàng nhận được điều phải chứng minh.
2.1.3.3. Thuật toán
Khi cài đặt thuật toán cần lưu ý lựa chọn cấu trúc dữ liệu phù hợp
để có thể truy nhập nhanh chóng trong bảng TFuzz.
Gọi A[0..k] là mảng lưu giữ bảng chữ A của otomat, trong đó k là
số kí tự phân biệt trong mẫu P. Màng được sắp theo chiều tăng của các kí
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
30
tự và A[k] = „#‟. Để thuận tiện khi truy nhập đến các chữ cái trong A, có
thể sử dụng mảng index xác định vị trí của chữ trong bảng.
i, nếu c = A [i]
index [c] =
k, nếu c {A[0], A[1], ...A[k-1]}
TFuzz là mảng [0..m, 0..k], trong đó TFuzz [i, j] là độ mờ mới khi
độ mờ i gặp kí tự x có index [] = j.
Khi đó chi tiết thuật toán tạo lập bảng TFuzz và tìm kiếm dựa vào
bảng TFuzz sẽ như sau:
Thuật toán 2.1. Tạo lập TFuzz
procedure initTFuzz()
var i, j, t: integer;
begin
for i: = 0 to m do
TFuzz [i,m]:=0;
for j: = 0 to k do TFuzz [0, j] := 0;
TFuzz [0, index [P1]]:=1;
for i: = 0 to m do
for t: = 0 to k-1 do
begin if i = m then j:= next [i+1]
elsse j:=i+1;
while (j > 0) and (Pj A([t]) do j:=next [j];
TFuzz [i, index [A[t]]:= j;
end;
end;
Thuật toán 2.2. Tìm kiếm mẫu dựa vào bảng TFuzz
procedure FPM();
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
31
var j, counter: integer; fuz: array [1..50] of integer; {* độ mờ*}
begin
j :=1; counter :=0; fuz[0] = 0;
while (còn đọc được Sj) do
begin fuz [j] = TFuzz [fuz[j-1], index [Sj]];
if fuz [j] = m then
begin counter :=counter+1;
Ghi nhận vị trí j-m+1;
end;
end; {while}
Ghi nhận counter;
if counter = 0 then Ghi nhận vị trí 0;
end;
Ví dụ 2.1. Với mẫu P = aababaab, A = {a, b, #}, AP = {a,b}.
Bảng TFuzz được tính toán dựa trên mảng next (ví dụ 1.1, Mục
1.5.1) cho kết quả như sau:
A
Q
a b #
0 1 0 0
1 2 0 0
2 0 3 0
3 4 0 0
4 2 5 0
5 6 0 0
6 7 0 0
7 2 8 0
8 4 0 0
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
32
Quá trình so mẫu trên dòng dữ liệu S = aabaababaababaababaab sẽ
như sau:
j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
S a a b a a b a b a a b a b a a b a b a a b
j 1 2 3 4 2 3 4 5 6 7 8 4 5 6 7 8 4 5 6 7 8
ghi nhận ghi nhận ghi nhận
11-8+1=4 168+1=9 21-8+1=14
2.1.3.4. So sánh KM P và thuật toán KMP mờ
Hình 2.1. Dịch chuyển con trỏ trên mẫu
Giả sử đã xuất hiện khúc đầu độ dài i-1 của P trên S, tính tới vị
trí j, có nghĩa đã có P(i - 1) = sufi - 1(S(j - 1)) hay độ mờ tại vị trí j - 1
là j-i = i - 1. Xét ký tự Sj, có thể xảy ra hai khả năng:
+ Trường hợp 1: Sj = Pi (hay độ mờ tại vị trí j là j = i)
Tăng i, j lên 1. Với trường hợp này tốc độ thao tác của thuật toán
KMP như trong tiếp cận mờ.
+ Trường hợp 2: Sj Pi (hay độ mờ tại vị trí j là j i)
Trong KMP, con trỏ j trên S giữ nguyên, chỉ dịch chuyển con trỏ
trên mẫu (dùng lệnh i:= next[i] (Hình 2.1). Vì vậy phải mất thời gian
dịch chuyển theo bảng next, thậm chí nhiều lần. Ví dụ như:
?
next [i]
P
P
S
i
i
j-i = i - 1
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
33
Với P = aababaab, sử dụng bảng next (ví dụ 1.1, mục 1.5) để tìm
sự xuất hiện của mẫu trong dòng ký tự S như sau:
S = a a c ... j = 3
P = a a b a b a a b i = 3
dịch lần thứ nhất a a b a b a a b i = next[i] = 2
dịch lần thứ 2 a a b a b a a b i = next[i] = 0
Ta thấy có 2 lần dùng i:= next[i] và 2 lần so sánh Sj và Pi (i khác
nhau). Nói chung có thể xảy ra nhiều lần dùng next trong khi con trỏ trên
S vẫn giữ nguyên. Điều này làm chậm đáng kể so với tiếp cận mờ: mỗi
lần nhận một ký tự Sj là một lần điều chỉnh giá trị mờ theo otomat: j =
TFuzz (j-1, Sj). Lệnh này thực hiện rất nhanh nếu TFuzz được biểu diễn
dưới dạng một mảng và được tính toán cẩn thận trước theo thông tin trên
mẫu P.
Kết quả sau so sánh tốc độ thực hiện việc tìm sự xuất hiện mẫu P
trong tệp dữ liệu lớn S theo hai thuật toán KMP và tiếp cận mờ trên máy
PC IBM tốc độ 233MHz.
Mẫu P Kích thước tệp S TKMP TFuzzy-KMP
1) aababcab 1400 KB 17% s 11% s
2) MDSVF6V 140.000 KB 35 s 30 s
3) bacabccaa 1200 KB 16% s 10% s
4) S068FAB50 140.000 KB 37 s 30 s
2.1.4. Thuật toán KMP - BM mờ
2.1.4.1. Ý tưởng của thuật toán
Trong thuật toán Boyer - Moore (BM), các ký tự trên mẫu P được
duyệt từ phải sang trái, bắt đầu từ Pm. Tại thời điểm gặp ký tự không
trùng khớp, chẳng hạn Pi = a còn Sj = b, khi đó sẽ quyết định dịch con trỏ
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
34
trên mẫu. Phép dịch chuyển ứng với mỗi ký tự trên P, nếu sự không
trùng khớp xảy ra ở đó, được xác định trong bước tiền xử lý mẫu P.
Trong thuật toán “ký tự không khớp” này của BM, có một trường hợp
cho phép dịch chuyển tốt nhất (xa nhất) là khi ký tự b không xuất hiện
trong mẫu P. Từ chi tiết này, kết hợp với kiểu sánh mẫu như trong KMP,
ta sẽ có một “thuật toán theo tiếp cận mờ tổng quát kiểu KMP và BM”,
trong đó độ mờ vẫn được tính toán dựa trên hàm TFuzz, đồng thời sẽ có
những bước nhảy dài trên xâu đích, đem lại hiệu quả tìm kiếm cao.
Ý tưởng của thuật toán này là [11]: gọi ptr là con trỏ trên xâu đích
S (khởi đầu ptr = 0 và độ mờ tại đó bằng 0 báo hiệu chưa tìm thấy mẫu).
Mỗi lần xét một khối w gồm m + 1 ký tự liên tục trên S, bắt đầu từ vị trí
ptr, ta gọi khối này là “khối ký tự quan sát” và ký hiệu wi là ký tự thứ i
trong w (với w1 = Sptr). Dựa trên bảng TFuzz, tính độ mờ xuất hiện mẫu
khi gặp ký tự w1 (hay chính là Sptr), ký hiệu độ mờ này là n1, đồng thời
xác định bước nhảy tiếp theo để từ đó sẽ xét khối ký tự w mới, ký hiệu
bước nhảy là n2. Nếu n1 là độ mờ tại Sptr thì có nghĩa sufn1(S(ptr)) =
P(n1) (Hình 2.2). Xảy ra các khả năng sau:
+ Nếu n1 = m, chứng tỏ đã xuất hiện mẫu bắt đầu từ vị trí ptr - m + 1
trên S. Để không bỏ sót sự xuất hiện lồng nhau của mẫu, đặt n2 = 1.
+ Nếu n1 lớn hơn độ mờ tại vị trí được xét trước vị trí ptr, có
nghĩa đang có hy vọng tìm thấy mẫu nên n2 = 1.
+ Trong các trường hợp còn lại của n1, chỉ mới xuất hiện khúc đầu
P(n1) khớp với khúc cuối độ dài n1 của S(ptr). Nếu việc khớp mẫu thành
công với khối ký tự quan sát w, thì ký tự Pm sẽ khớp với ký tự Sptr+m-n1
(hay w1+m-n1). Do đó, nếu Sptr+m-n1 không phải là một ký tự xuất hiện trong
P thì có thể thực hiện bước nhảy xa để đọc w mới bắt đầu từ vị trí ptr+m-
n1+1 trên S mà vẫn đảm bảo không bỏ sót sự xuất hiện nào của mẫu.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
35
Hình 2.2. Ý tưởng chung của thuật toán KMP-BM mờ
2.1.4.2. Otomat mờ so mẫu
Định nghĩa 2.3. Cho P là xâu mẫu độ dài m trên bảng chữ A. Ap là
bảng các ký tự xuất hiện trong P. Otomat mờ so mẫu là A(P) = (Ak, Q, q0,
F, ), trong đó:
+ A
k
là bảng chữ vào, mỗi chữ là một xâu ký tự độ dài k trên A,
k=m+1
+ Q là tập hữu hạn các trạng thái,
Q = {q=(n1,n2)| n1, n2 N, 0 n1 m, 1 n2 k}
n1 gọi là độ mờ tại vị trí đang xét
n2 gọi là bước nhảy tiếp theo vị trí đang xét
+ q0 là trạng thái khởi đầu, q0 = (0,1)
+ F là trạng thái kết thúc, F = (m,1)
+ Hàm chuyển : Q × Ak Qs
(q, w) q‟ = (q, w)
Với q = (n1, n2) thì q‟ = (n1‟, n2‟) được xác định như sau:
Nếu n2 > 1 thì đặt n1 = 0
Tính n1‟ = TFuzz (n1, w1)
Nếu n1‟ = m hoặc n1‟ > n1 thì n2‟ = 1,
ngược lại (n1‟ < m và n1‟ n1) thì xét:
Nếu w1+m-n1‟ Ap thì n2‟ = 1, ngược lại n2‟=1+m-n1‟
ptr
P(n1) ptr+m-n1
1+m-n1 m+1
S
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
36
Hoạt động của otomat mờ so mẫu như sau:
Cho mẫu P độ dài m và xâu đích S độ dài n trên bảng chữ A. A(P)
là otomat được xác định theo định nghĩa 2.3. Ta sẽ dùng otomat A(P) để
đoán nhận tất cả các vị trí xuất hiện mẫu P trong xâu S và tổng số lần
xuất hiện mẫu. Thuật toán cơ bản dựa trên otomat được mô tả như sau:
Thuật toán 2.3.
Ta dùng các ký hiệu:
+ j là con trỏ quan sát trên S
+ q.n1, q.n2 là hai thành phần của trạng thái q
+ w là khối ký tự quan sát bắt đầu từ vị trí j trên xâu đích S, giả sử
đã bổ sung thêm m ký tự # vào cuối S.
+ qold là trạng thái của otomat tại vị trí trước khi đọc w
+ q là trạng thái otomat sau khi tác động w, q = (qold, w)
+ Counter là biến đếm số lần xuất hiện mẫu.
Bước 1: Khởi tạo
j: = 0; counter := 0; qold.n1 :=0; qold.n2 :=1;
Bước 2: While j n do
j: = j + qold.n2
Đọc khối ký tự quan sát w; {w1 Sj}
{Tính q = (qold, w)}
if qold.n2 > 1 then qold.n1:= 0; endif;
q.n1: = TFuzz (qold.n1, w1);
q.n2: = 1;
if q.n1= m then
Ghi nhận vị trí xuất hiện mẫu là j - m + 1;
Counter: = counter + 1;
else if q.n1 < m and q.n1 < qold.n1 then
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
37
if w1+m-q.n1 Ap then q.n2: = 1+m-q.n1; endif;
endif;
endif;
qold := q;
endwhile;
2.1.4.3. Thuật toán 2.4
procedure GFSearching (); {tìm kiếm mẫu dựa trên định nghĩa 2.3}
var apr: array [1..N] of integer;
counter, j, n1, n2, n1’, n2’: integer;
begin
j:= 0; n1:= 0; n2 := 1;
while j <= n do
begin j := j + n2;
if n2 > 1 then n1:= 0;
n1’ := TFuzz [n1, index [S[j]]];
n2’: = 1;
if n1’ = m then
begin counter := counter + 1;
apr[counter]:= j - m + 1;
end
else if n1’ < m and n1’ <= n1 then
begin if j + m - n1’ > n then return;
if index [S[j + m - n1’]] = k then n2’ : = 1 + m - n1’;
end;
n1:=n1’; n2: = n2’;
end;
end;
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên
38
2.2. Bài toán so mẫu xấp xỉ
2.2.1. Đặt vấn đề
Để tìm kiếm xấp xỉ, cần sử dụng một hàm khoảng cách (distance
function) đo độ tương tự giữa hai xâu. Tương tự ở đây được hiểu là giữa
hai xâu kí tự có một vài sai khác ở những lỗi có thể nhận ra bằng mắt
thường, không xét về khía cạnh ngữ nghĩa (OCR - optical character
recognition errors), chẳng hạn “Việt Nam” và “Việt Nan” hay “Việtt
Nan”,... Có thể kể ra một số kỹ thuật phổ biến đo độ tương tự giữa hai
xâu: xâu con chung dài nhất, dãy con chung dài nhất, khoảng cách soạn
thảo (Edit Distance).
Các kỹ thuật trên chủ yếu chỉ hiệu quả khi có những sai khác về
mặt chính tả: có sự bổ sung, xoá hay thay thế một số kí tự. Trong nhiều
tình huống, những kỹ thuật này chưa đáp ứng đầy đủ yêu cầu thực tế,
như khi cần tìm kiếm theo tên người nước ngoài (chẳng hạn “christian
Charras” và “Charas C”), khi có sự sai khác do biến đổi hình thái từ, cấu
trúc câu (“approximate searching” và “search approximately”), một số
trường hợp thứ tự ghép từ khác nhau nhưng mang ngữ nghĩa giống nhau
(“toán logic” và “logic toán”) hoặc do thứ tự sai song vẫn hiểu được
đúng nghĩa (“toán giải tích” và “giải tích toán”,...). Phương pháp xác
định độ tương tự giữa hai xâu kí tự theo “độ gần tựa ng
Các file đính kèm theo tài liệu này:
- 20LV09_CNTT_KHMTDoThiHanh.pdf