Điều này gây ra sự phức tạp vì tính không mềm dẻo khi có các phát sinh số yêu cầu tìm kiếm v à trong cách xây dựng phát triển chương trình đòi hỏi phải viết lại chương trình.Vì vậy, cần
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Nguyễn Thị Hà Thu
-TÌM HIỂU ỨNG DỤNG CỦA ÔTÔMÁT NÂNG CAO
TRONG BÀI TOÁN SÁNH MẪU
Chuyên ngành : Toán - tin
LUẬN VĂN THẠC SĨ KỸ THUẬT TOÁN – TIN ỨNG DỤNG
NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TS PHAN TRUNG HUY
Trang 2Hà Nội - 2012
MỤC LỤC
LỜI CAM ĐOAN
Trước khi đi vào nội dung bản luận văn thạc sĩ của mình, em xin cam đoan
luận văn này do chính em viết, dựa trên những kiến thức, kinh nghiệm của bản thân,
sự hướng dẫn của thầy hướng dẫn, và những thông tin mà em tìm hiểu, tham khảo được qua các tài liệu liên quan
Em xin gửi lời cảm ơn chân thành đến các thầy cô Viện Toán ứng dụng và Tin học, trường Đại học Bách Khoa Hà Nội đã tạo điều kiện và truyền đạt cho em những kiến thức vô cùng hữu ích
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc đến PGS.TS Phan Trung Huy Ngoài việc truyền đạt cho em những kiến thức và giúp em tìm kiếm tài liệu tham khảo, Thầy đã hướng dẫn em rất tận tình Trong quá trình viết luận văn, khi em gặp một số khó khăn, Thầy đã động viên, giúp đỡ em rất nhiều
Do trình độ có hạn, luận văn của em có thể còn nhiều nhược điểm và sơ suất, kính mong được các thầy cô góp ý Em xin chân thành cảm ơn!
Hà Nội, ngày 15 tháng 09 năm 2012 Học viên
Nguyễn Thị Hà Thu
2
Trang 3DANH MỤC CÁC HÌNH VẼ
Hình 1.1 Tìm kiếm thông dụng theo các box cứng……….……… 8 Hình 1.2 Tìm kiếm nâng cao trong Yahoo!Việt Nam……….……… 9 Hình 1.3 Tìm kiếm nâng cao trong Ask……… ……… 9
Google……… 10
Hình 2.1 Sánh mẫu trong thuật toán cài đặt thô………12 Hình 2.2 Độ mờ trong thuật toán sánh mẫu theo tiếp cận ôtômát mờ……… 15
Hình 2.3 Giá trị của next[i] trong thuật toán sánh mẫu theo tiếp cận ôtômát mờ 17
Hình 2.4 Mô hình cấu trúc cây của ô tô mát nâng cao trong thuật toán
Corasick……… 23
Aho-Hình 2.5 Trạng thái các hàm goto trong thuật toán Aho-Corasick……… 28
Hình 2.6 Goto function trong thuật toán sánh đa mẫu Aho-Corasick………31 Hình 3.1 Cây biểu thức logic……… 34 Hình 4.1 Kết quả minh họa cho modun sánh mẫu theo thuật toán cài đặt thô… 47 Hình 4.2 Kết quả minh họa cho modun sánh mẫu theo tiếp cận ôtômát mờ…… 50 Hình 4.3 Kết quả minh hoạ cho modun tìm kiếm đa mẫu theo thuật toán
Aho-Corasick……… 52
Hình 4.4 Kết quả minh họa cho modun chuyển đổi biểu thức logic dạng
3
Trang 4trung tố về dạng hậu tố……… 54
Hình 4.5 Kết quả minh họa cho modun tính giá trị biểu thức logic dạng hậu tố…56 Hình 4.6 Kết quả minh họa cho modun tìm kiếm theo biểu thức logic áp dụng
thuật toán sánh mẫu cài đặt thô……… 58 Hình 4.7 Kết quả minh họa cho mudun tìm kiếm theo biểu thức logic áp dụng
ôtômát mờ……… 59 Hình 4.8 Kết quả minh họa cho mudun tìm kiếm theo biểu thức logic áp dụng
thuật toán Aho-Corasick………61
MỞ ĐẦU
1 Lý do chọn đề tài
Trong xu thế phát triển của khoa học công nghệ, máy tính và Internet được
sử dụng trong hầu hết các lĩnh vực và góp phần vào việc thúc đẩy sự phát triển nhiều lĩnh vực trong cuộc sống Hiện nay, ngoài máy tính, còn có rất nhiều sản phẩm công nghệ khác như Ipad, Iphone, hay những chiếc điện thoại cũng có thể thay thế cho một chiếc máy tính trong nhằm phục vụ cho những mục đích nhất định của con người, như học tập, công việc, giải trí và tìm kiếm thông tin Trong thời kì có sự phát triển của Internet rất mạnh mẽ ngày nay, bài toán tìm kiếm có vai trò rất quan trọng Một vấn đề cốt lõi để hệ thống tìm kiếm thông tin hoạt động nhanh và chính xác đó là hệ thống phải được áp dụng những thuật toán hiệu quả để tìm kiếm dữ liệu Dữ liệu trong máy tính được lưu trữ dưới rất nhiều dạng khác nhau như hình ảnh, âm thanh,… nhưng phổ biến nhất vẫn
là lưu trữ sử dụng chuỗi Ta có thể thấy các dạng khác nhau của chuỗi như ở các file
dữ liệu, trên biểu diễn của các gen, hay chính văn bản chúng ta đang đọc
Ba vấn đề chính trong bài toán tìm kiếm: một là tính hiệu quả về kết quả tìm kiếm, hai là tốc độ tìm kiếm nhanh, và thứ ba là giao diện hướng người
4
Trang 5dùng Hiện nay, trên thị trường đang ứng dụng phổ biến nhất là các modun tìm kiếm cứng nhắc Ví dụ như các box tìm kiếm cứng trong các thư viện, các trang tìm kiếm trên internet Người sử dụng phải nhập từng nội dung cần tìm kiếm vào các box với số lượng hạn chế và nội dung phù hợp với tính năng của các box Bởi với các modun tìm kiếm cứng như vậy, việc tìm kiếm thông tin theo nhiều yêu cầu khác nhau với các liên kết logic cứng nhắc cần nhiều box Điều này gây ra sự phức tạp vì tính không mềm dẻo khi có các phát sinh số yêu cầu tìm kiếm v à trong cách xây dựng phát triển chương trình đòi hỏi phải viết lại chương trình.
Vì vậy, cần phải xây dựng một phương thức tìm kiếm nâng cao, đáp ứng cả
ba vấn đề của bài toán tìm kiếm Một vấn đề cốt lõi để hệ thống tìm kiếm thông tin hoạt động nhanh và chính xác đó là hệ thống phải được áp dụng những thuật toán hiệu quả để tìm kiếm dữ liệu, cụ thể là những thuật toán sánh mẫu có tính mềm dẻo
để có thể kết hợp với tổ chức cấu trúc dữ liệu để xây dựng một phương thức tìm kiếm mềm dẻo Từ đó, cho phép người sử dụng chương trình có thể tìm kiếm thông tin theo một tổ hợp logic tùy ý của các xâu mẫu, nâng cao tính mềm dẻo của dạng thức nhập dữ liệu đầu vào, không cứng nhắc như nhiều ứng dụng sẵn có trên thị trường đang sử dụng Phương pháp này khắc phục hai vấn đề: giao diện đã thân thiện, mềm dẻo hơn với người sử dụng; và không phải xây dựng lại chương trình khi có các yêu cầu mới phát sinh, tiết kiệm được chi phí khi xây dựng chương trình
Trên thế giới, cũng đã có những phần mềm tìm kiếm theo biểu thức logic, tuy nhiên do tính bảo mật và những vẫn đề về bản quyền nên chúng ta không biết được những phần mềm đó được xây dựng như thế nào Nhu cầu tìm hiểu về phương thức tìm kiếm này để chủ động nắm bắt được công nghệ, có thể phát triển nâng cấp thuật toán, sử dụng để tìm kiếm những vùng dữ liệu có tính chất bảo mật và nhạy cảm, được nảy sinh một cách tự nhiên Giải pháp cho vấn đề này nhờ sử dụng phương pháp ôtômát nâng cao là hợp lý
Vì những lý do đó, đề tài được lựa chọn cho luận văn tốt nghiệp này là đi
vào tìm hiểu ứng dụng của ôtômát nâng cao trong bài toán sánh mẫu.
5
Trang 62 Mục đích nghiên cứu
Luận văn đi vào nghiên cứu các thuật toán sánh mẫu ứng dụng ôtômát nâng
cao, cách thức liên kết các thuật toán này với các biểu thức logic để giải quyết bài toán tìm kiếm trên cơ sở áp dụng kỹ thuật của ôtômát nâng cao trong những tình huống tìm kiếm chính xác đơn, đa mẫu và tìm kiếm mềm dẻo theo biểu thức logic
3 Nội dung nghiên cứu
- Tìm hiểu về các thuật toán sánh đơn mẫu và đa mẫu sử dụng ôtômát nâng cao,
so sánh các thuật toán để thấy được sức mạnh của ôtômát nâng cao trong bài toán sánh mẫu
- Tìm hiểu cây biểu thức logic, cách tổ chức cấu trúc dữ liệu để tính “giá trị” một câu lệnh tìm kiếm được biểu diễn dưới dạng một biểu thức logic
- Tìm cách liên kết các thuật toán sánh mẫu và cây biểu thức logic để xây dựng một phương thức tìm kiếm mềm dẻo
4 Các kết quả đã làm được
- Trình bày các thuật toán tìm kiếm đơn mẫu và đa mẫu, so sánh các thuật toán
để thấy được sức mạnh của ôtômát nâng cao trong bài toán sánh mẫu
- Trình bày về cách tổ chức cấu trúc dữ liệu, cây biểu thức logic, tính toán giá trị biểu thức logic
- Đóng góp mới của tác giả: Xây dựng được phương thức tìm kiếm mềm dẻo theo biểu thức logic dựa trên sự kết hợp giữa các thuật toán sánh mẫu ứng dụng ôtômát nâng cao và cây biểu thức logic cho đơn mẫu và đa mẫu
• Chương 2: Các thuật toán sánh mẫu
Chương này phân tích quá trình tiền xử lý thông tin đầu vào, trình bày các thuật toán tìm kiếm đơn mẫu theo phương thức cài đặt thô, theo tiếp cận ôtômát mờ,
6
Trang 7tìm kiếm đa mẫu theo thuật toán Aho-Corasick.
• Chương 3: Tổ chức cấu trúc dữ liệu
Chương này đưa ra cách xây dựng cây biểu thức logic, và trình bày cách thức tính giá trị của một biểu thức logic theo phương pháp hậu tố
• Chương 4: Xây dựng phương thức tìm kiếm mềm dẻo theo biểu thức logic
Nội dung chương 4 là kết hợp các thuật toán sánh mẫu đã trình bày ở chương
2 và cây biểu thức logic ở chương 3 để xây dựng phương thức tìm kiếm mềm dẻo Chương này cũng giới thiệu công cụ và môi trường lập trình để xây dựng chương trình tìm kiếm mềm dẻo thử nghiệm dựa trên các modun cài đặt các thuật toán sánh mẫu
• Kết luận
• Tài liệu tham khảo
7
Trang 8CHƯƠNG 1 TỔNG QUAN
1.1 Khảo sát thực trạng tìm kiếm thông tin hiện nay
Trong thời kì có sự phát triển của Internet rất mạnh mẽ ngày nay, bài toán tìm kiếm có vai trò rất quan trọng
Dữ liệu trong máy tính được lưu trữ dưới rất nhiều dạng khác nhau như hình ảnh, âm thanh,… nhưng phổ biến nhất vẫn là lưu trữ sử dụng chuỗi Ta có thể thấy các dạng khác nhau của chuỗi như ở các file dữ liệu, trên biểu diễn của các gen, hay chính văn bản chúng ta đang đọc
Ba vấn đề chính trong bài toán tìm kiếm: một là tính hiệu quả về kết quả tìm kiếm, hai là tốc độ tìm kiếm nhanh, và thứ ba là giao diện hướng người dùng Hiện nay, trên thị trường đang ứng dụng phổ biến nhất là các modun tìm kiếm cứng nhắc dựa trên các box tìm kiếm Người sử dụng phải nhập từng nội dung cần tìm kiếm vào các box với số lượng hạn chế và nội dung phù hợp với tính năng của các box Bởi với các modun tìm kiếm cứng như vậy, việc tìm kiếm thông tin theo nhiều yêu cầu khác nhau với các liên kết logic cứng nhắc cần nhiều box Điều này gây ra sự phức tạp đối với người sử dụng và trong cách xây dựng phát triển chương trình cũng như ảnh hưởng đến tốc độc tìm kiếm
Hình 1.1 Tìm kiếm thông dụng theo các box cứng
8
Trang 9Hình 1.2 Tìm kiếm nâng cao trong Yahoo! Việt Nam http://vn.search.yahoo.com/web/advanced
Hình 1.3 Tìm kiếm nâng cao trong Ask
http://www.ask.com/advancedsearch?o=0&l=dir
9
Trang 10Hình 1.4 Tìm kiếm nâng cao trong Google
http://www.google.com.vn/advanced_search
Trên thế giới, cũng đã có những chương trình tìm kiếm xây dựng dựa trên các modun tìm kiếm mềm dẻo, ví dụ điển hình nhất là Tìm kiếm nâng cao trong Google Tuy nhiên, đó là phạm trù quốc tế, và do những vấn đề về công nghệ, sự cạnh tranh, tính bảo mật nên chúng ta không biết những modun tìm kiếm mềm dẻo ấy được xây dựng như thế nào
Vì vậy, cần phải xây dựng một phương thức tìm kiếm nâng cao, đáp ứng cả
ba vấn đề của bài toán tìm kiếm Từ đó, cho phép người sử dụng chương trình có thể tìm kiếm thông tin theo một tổ hợp logic tùy ý của các xâu mẫu, nâng cao tính mềm dẻo của dạng thức nhập dữ liệu đầu vào, không cứng nhắc như nhiều ứng dụng sẵn có trên thị trường đang sử dụng Phương pháp này khắc phục hai vấn đề: giao diện đã thân thiện, mềm dẻo hơn; và tốc độ tìm kiếm cũng sẽ được cải thiện rất nhiều so với những modun tìm kiếm cứng nhắc, không phải xây dựng lại chương trình khi có nhiều yêu cầu mới phát sinh
Một vấn đề cốt lõi để hệ thống tìm kiếm thông tin hoạt động nhanh và chính xác đó là hệ thống phải được áp dụng những thuật toán hiệu quả để tìm kiếm dữ liệu,
cụ thể là những thuật toán sánh mẫu có tính mềm dẻo để có thể kết hợp với tổ chức cấu trúc dữ liệu để xây dựng một phương thức tìm kiếm thông minh Các thuật toán sánh mẫu ứng dụng ôtômát nâng cao là những thuật toán đáp ứng được tính chất mềm dẻo đó
10
Trang 111.2 Giới thiệu bài toán sánh mẫu.
Sánh mẫu hay còn gọi là so mẫu (pattern – matching), là một trong những bài toán cơ bản và quan trọng trong các thuật toán xử lý về xâu ký tự hay xử lý văn bản (text processing) Bài toán đặt ra là tìm ra sự xuất hiện của một hoặc nhiều xâu mẫu (pattern) trong chuỗi các ký tự cho trước được gọi là xâu đích Đây là một bài toán kinh điển và phổ biến trong khoa học kỹ thuật bởi hầu hết mọi ứng dụng tìm kiếm đều có sự so khớp dữ liệu ở một dạng nào đó Ứng dụng của sánh mẫu được áp dụng phổ biến trong các trình soạn thảo văn bản hay các chương trình tìm kiếm văn bản trên internet dựa vào các từ khóa, tất nhiên để thực thi các bài toán phức tạp này cần rất nhiều kỹ thuật và cách xử lý khác đi kèm
Ta đã có rất nhiều thuật toán sánh mẫu, phương pháp tìm kiếm đơn mẫu cổ điển và đơn giản nhất là thuật toán Brute-Force còn gọi là thuật toán duyệt lần lượt hay thuật toán cài đặt thô Tiếp đến là các thuật toán Karp-Rapin, Knuth-Morris-Pratt (viết tắt là thuật toán KMP), Boyer-Moore…
Trong luận văn này, tác giả tập trung trình bày ứng dụng của ôtômát nâng cao trong hai thuật toán sánh mẫu sau: thuật toán tìm kiếm đơn mẫu theo tiếp cận ôtômát mờ và thuật toán tìm kiếm đa mẫu Aho-Corasick Sau đó là sự kết hợp của hai thuật toán này với cây biểu thức logic để xây dựng phương thức tìm kiếm mềm dẻo
11
Trang 12CHƯƠNG 2 CÁC THUẬT TOÁN SÁNH MẪU
2.1 Thuật toán cài đặt thô Brute-Force
Sánh mẫu (đơn mẫu) là bài toán tìm sự xuất hiện của một xâu mẫu w
trong một xâu đích S ( một dòng text hoặc một văn bản) Xâu mẫu và xâu đích là tất cả những xâu gồm các kí tự trong bảng chữ cái
Xâu mẫu w được kí hiệu là w = w[1 m] ; độ dài là m
Xâu đích S được kí hiệu là s = s [1 n] ; độ dài là n
• Thuật toán sánh mẫu được thực hiện như sau :
- Đầu tiên chúng sắp thẳng hàng các vị trí biên trái của xâu mẫu và xâu đích, sau
đó so sánh các ký tự đã được sắp thẳng hàng của xâu mẫu và xâu đích – bước này gọi là một phép thử hoặc một phép lấy mẫu
- Sau khi so khớp được toàn bộ xâu mẫu hoặc sau một lần không khớp, chúng dịch chuyển xâu mẫu về bên phải
- Gán mỗi lần thử với vị trí thứ j trong xâu đích, khi xâu mẫu được sắp thẳng với đoạn s[ j j+m-1]
- Các thủ tục duyệt được lặp đi lặp lại cho đến khi các vị trí biên phải của xâu mẫu vượt quá vị trí biên phải của xâu đích Đây gọi là phép duyệt và bước dịch chuyển
Hình 2.1 Sánh mẫu trong thuật toán cài đặt thô
Thuật toán duyệt lần lượt bao gồm các bước duyệt, tại tất cả các vị trí từ 1
đến vị trí thứ n – m + 1 trong xâu đích, duyệt xem có một sự xuất hiện nào của xâu mẫu hay không Sau đó, qua mỗi lần thử, nó dịch xâu mẫu sang vị trí kế tiếp
bên tay phải Độ phức tạp của thuật toán duyệt lần lượt này là O(mn) trong trường
hợp xấu nhất nhưng tiến trình của nó trong thực hành thường được thực hiện rất
12
Trang 13nhanh trên kiểu dữ liệu đặc thù.
Đây là thuật toán đơn giản nhất, được mô tả như sau : BF( w, m, s, n )
Ở mục sau, chúng ta sẽ tìm hiểu một thuật toán sánh mẫu (đơn mẫu) áp dụng ôtômát mờ, khắc phục được nhược điểm về tốc độ của thuật toán duyệt lần lượt này
13
Trang 142.2 Thuật toán áp dụng ôtômát mờ.
Thuật toán này cùng một mục đích với thuật toán duyệt lần lượt ở mục trước
là giải quyết bài toán sánh mẫu (đơn mẫu)
2.2.1 Phát biểu bài toán.
Có một dòng S gồm các kí tự trên bảng chữ cái mà ta cần phải tìm kiếm sự xuất hiện của mẫu w với độ dài m Bản chất của vấn đề tìm kiếm là duyệt từ trái sang phải và xét từng kí tự xuất hiện trên S
2.2.2 Mô hình của ôtômát mờ.
Giả sử : xâu mẫu w được kí hiệu là w = w[1 m] ; độ dài là m
xâu đích S được kí hiệu là s = s [1 n] ; độ dài là n
A là bảng chữ cái biểu diễn w và S
AW là tập các kí tự xuất hiện trong w
Các kí tự không xuất hiện trong w để đơn giản kí hiệu là #
Ta xét ôtômát mờ A = ( Q, A, δ , q0 , F ), trong đó:
- Q : tập hữu hạn các trạng thái mờ Mỗi trạng thái mờ là một tập mờ với các giá
trị mờ nguyên thuộc đoạn [0,…, m], ta biểu diễn:
Trang 15q f = ( v1 , , v k ) mà
∃i : vi = độ dài mẫu i
15
Trang 162.2.3 Thuật toán sánh mẫu theo tiếp cận ôtômát mờ.
Khi duyệt S từ trái sang phải, bắt đầu từ kí tự thứ t = 1,…, n ta sẽ kí hiệu là s[1], s[2], , s[n] Ta gọi fuz[t] là độ mờ xuất hiện của mẫu cho tới thời điểm thứ t trên S tức là tại kí tự được đọc là s[t] Ở đây, độ mờ được hiểu là độ
dài của khúc đầu ( prefix ) dài nhất trên w khớp với S sau khi đọc đến kí tự s[t]
Hình 2.2 Độ mờ trong thuật toán sánh mẫu theo tiếp cận ôtômát mờ
(Độ mờ là độ dài khúc đầu dài nhất trên w khớp với S tại thời điểm t)
Khi nhận được giá trị của độ mờ fuz[t] = m thì chứng tỏ có thêm một lần xuất hiện mẫu tại vị trí t – m + 1 ứng với kí tự s[t – m+1]
Ban đầu, ôtômát ở trạng thái q0 Mỗi khi gặp được một kí tự s[t] và ôtômát đang
ở trạng thái q thì ta nhận được trạng thái mới q’ = δ (q, s[t])
Nếu q’∈ F thì báo có một lần xuất hiện mẫu Do đó, hàm TFuzz sẽ phải được xây dựng một cách thích hợp để phản ánh được bản chất của thuật toán trên
Xét một ví dụ minh họa để dễ dàng hiểu được cách xây dựng bảng TFuzz:
Nếu q’∈ F thì báo có một lần xuất hiện mẫu Do đó, hàm TFuzz sẽ phải được xây dựng một cách thích hợp để phản ánh được bản chất của thuật toán trên
Xét một ví dụ minh họa để dễ dàng hiểu được cách xây dựng bảng TFuzz:
Trang 17Ví dụ 1:
Xâu w = acaac có độ dài m = 5
Xâu S = abcdcdefaa c a a c gh có độ dài n = 13
Bảng TFuzz:
i # a c 0
1 2 3 4 5
0 1 0
0 1 2
0 3 0
0 4 2
0 1 5
0 3 0
Từ trạng thái 0, khi đọc được s[t] =a thì nhận được q’ = 1, có nghĩa là fuz[t]=1, Chẳng hạn với q = 2, nếu đọc được s[t] =a thì q’ = 3, còn nếu đọc được s[t] = c thì q’ = 0 Như vậy, bản chất của q tại từng thời điểm là phản ánh độ mờ của mẫu trên S tại thời điểm tương ứng Có thể thấy fuz[t] = δ ( fuz[t – 1], s[t] ) Trường hợp k = 1 thì fuz[t] = TFuzz( fuz[t – 1], s[t] ) Với ví dụ trên, từ bảng TFuzz, ta có cách tìm mẫu như sau : S = a b a c b a a c a a c g h t = 1 2 3 4 5 6 7 8 9 10 11 12 13 fuz[t]=0 0 1
0 1 2 0 1 1 2 3 4 5 0 0
Tại vị trí thứ 11 trên S, ứng với s[11] ta có độ mờ fuz[11] = 5, từ đó ghi nhận mẫu xuất hiện ở vị trí thứ 11 – 5 + 1 = 7 ứng với kí tự s[7]
Tư tưởng của phương pháp là mảng hai chiều TFuzz (một chiều i = 0 m,
một chiều là chỉ số các ký tự trong AW ) sẽ được tính thông qua một mảng 1
Trang 18chiều ( i = 0 m) được đặt tên là next Chúng ta sẽ tìm hiểu hàm next, TFuzz là gì?
Và chúng được tính như thế nào?
Khi đoạn đầu của mẫu w đã được khớp với một đoạn trên S, giả sử kí tự cuối của đoạn khớp đó là w[i] cũng chính bằng s[t], khi đó ta có độ mờ là i Vậy thì sau khi đọc kí tự tiếp theo là s[t+1], độ mờ fuz[t+1] sẽ là bao nhiêu? Nếu i là độ mờ trước khi đọc kí tự x thì TFuzz(i,x) chính là độ mờ sau khi đọc kí
tự x Để tính được TFuzz(i,x), cần tính thông qua mảng next[i] với i = 0 m Ở đây, next[i] chính là độ dài đoạn dài nhất của khúc đầu w khớp với khúc cuối của đoạn w’ = w[1] w[i] ( đoạn chung này phải khác w’ tức là next[i] < i )
Hình 2.3 Giá trị của next[i] trong thuật toán sánh mẫu theo tiếp cận ôtômát mờ
(Độ dài đoạn khớp nhau in đậm được gọi là next[i])
Như trên hình 2.3, đoạn w[i-h+1] w[i] khớp với đoạn w[1] w[h] thì next[i] = h Khi có được bảng next[i], ta sẽ tính được bảng TFuzz, và từ bảng TFuzz, sẽ cho thấy độ mờ tại cái vị trí trên xâu S Khi độ mờ bằng m thì ghi nhận thêm một sự xuất hiện của w trên S
Phương pháp sánh mẫu dựa trên mô hình ôtômát mờ được thực hiện thông qua 3 bước sau đây :
•Bước 1: Xây dựng bảng next[i] với i = 0 m
• Bước 2: Xây dựng bảng TFuzz(i, x) trong đó i = 0 m và x là ký tự được đọc
•Bước 3: Duyệt từng kí tự trên S từ trái qua phải, tính độ mờ tại mỗi vị trí trên S Khi độ mờ bằng m thì ghi nhận một lần xuất hiện mẫu trên S
Trang 19Sau đây là giải thuật chi tiết các bước:
Trang 20Bước 1 : Xây dựng bảng next.
Trang 2221
Trang 23n h g i á v ề t ốc đ ộ tì m k i ế m .
Các bước tính mảng next[i] và TFuzz(i,x) là các bước tiền xử lý, bản chất thuật toán này chỉ là duyệt lần lượt từng kí tự trên xâu đích S từ trái qua phải, tính toán độ mờ tại mỗi kí tự đọc được Vì thế độ phức tạp của thuật toán này chỉ
là O(n) Như vậy, so với thời gian chạy của thuật toán cài đặt thô là O(mn) thì thuật toán tìm kiếm xâu theo tiếp cận ôtômát mờ cải thiện về tốc độ hơn hẳn
Tuy nhiên thuật toán cải thiện về tốc độ thì kèm theo là sự chiếm dụng bộ nhớ nhiều hơn do sử dụng mảng 2 chiều TFuzz
22
Trang 242.3 Thuật toán Aho-Corasick
Không như hai thuật toán sánh đơn mẫu đã trình bày ở trên, Aho-Corasick là
thuật toán sánh đa mẫu
2.3.1 Phát biểu bài toán.
Có một dòng S gồm các kí tự trên bảng chữ cái mà ta cần phải tìm kiếm sự xuất hiện của n mẫu x1 , x2 , , xn Kết quả bài toán là đưa ra những xâu mẫu có xuất hiện trong S
2.3.2 Mô hình ôtômát của thuật toán
Tập hợp các xâu mẫu x1 , x2 , , xn sẽ được xây dựng thành cấu trúc cây
Ví dụ hình dưới đây là cây được tạo cho tập hợp các xâu mẫu: {he, she, hers, his}
Hình 2.4 Cấu trúc cây của ôtômát nâng cao trong thuật toán Aho-Corasick
Cấu trúc cây như sau: Mỗi nhánh đi sẽ tạo ra 1 xâu mẫu
Mỗi cạnh là 1 kí tự của xâu mẫu
Mỗi node được gọi là 1 trạng thái
Trong thuật toán này ta định nghĩa 3 hàm xử lý quan trọng
23
Trang 251 Hàm goto g(q, a): từ trạng thái q, nếu gặp kí tự a thì sẽ đi đến trạng thái nào Hàm này sẽ cho biết trạng thái đó.
2 Hàm failure link: hàm failure f() được định nghĩa như sau: giả sử node hiện tại là
q, f (q) = u trong đó u là hậu tố dài nhất của q mà u cũng là tiền tố của các xâu mẫu xi trong cây T(X) Như vậy, failure link sẽ không được tìm thấy trong cây
3 Output funtion: out(q) sẽ trả về tất cả các xâu được xác định với node q
2.3.3 Thuật toán sánh mẫu
Thuật toán này gồm 2 phase:
Phase tiền xử lý (Preprocessing): xây dựng cây và xử lý dữ liệu
Phase tìm kiếm (Searching): tìm sự tồn tại các xâu mẫu x1 , x2 , , xn trong chuỗi text (xâu đích)
Phase tiền xử lý: Dùng để tạo cây với các thông tin sau
Phase tiền xử lý sẽ gọi 2 function con là ENTER() và COMPLETE() để tạo 3 bộ dữ liệu ở trên
Phase tiền xử lý được định nghĩa như sau:
Tên hàm: PREAC
Input: X là tập hợp các xâu mẫu, k là số lượng xâu mẫu
Ký hiệu: X[i] = xi và x[j] là ký tự thứ j trong một xâu mẫu x
Ouput: cây tìm kiếm với các bộ dữ liệu cần thiết để tìm kiếm
Funtion PREAC(X, k)
Tạo node gốc
24
Trang 26//Tạo vòng lặp, xây dựng hàm goto cho node gốc
Trong đó, hàm ENTER được định nghĩa như sau:
Input: x là xâu mẫu, root là node gốc
Output: bộ dữ liệu goto function và 1 phần của bộ dữ liệu ouput function
ENTER(x, root)
Gán node r = root
i = 0
//Duyệt theo các cạnh đã được xây dựng
While i < |x| and g(r, x[i]) ≠ FAIL and g(r, x[i]) ≠ root
Trang 27Hàm COMPLETE được định nghĩa như sau:
Input: root là node gốc
Ouput: xây dựng bộ dữ liệu failure link và phần còn lại của dữ liệu ouput function
While queue ≠ empty
Lấy node r ra từ queue
For: với mỗi kí tự a mà g(r, a) = s ≠ 0
State = f(r)While g(state, a) = fail do state = f(state)F(s) = g(state, a)
Output(s) = output(s) output(f(s))
Phase tìm kiếm
Bắt đầu từ trạng thái state = 0
Duyệt các kí tự a của chuỗi text tìm kiếm
While g(state, ai) = fail do state = f(state)
State = g(state, ai)
Nếu output(state) != empty return True
Return False
26
Trang 28Sau đó sẽ gọi hàm COMPLETE(root)
Chi tiết hàm ENTER(he, root) sẽ chạy như sau:
Node r = root
Int i = 0
While i < |x| and g(r, h) ≠ FAIL and g(r, h) ≠ root
// Vòng while đầu tiên không thỏa mãn
//Tạo node mới
While i = 0 < |he| = 2: thỏa mãn nên
Trang 29node1 = node2
i = i+1 = 2
While i = 2 < |he| = 2: không thỏa mãn nên thoát ra ngoài
Như vậy, sau khi thực thi hàm này ta sẽ có hàm goto và ouput như sau:G(0,h) = node1
Trang 30Hình 2.5 Trạng thái các hàm goto trong thuật toán Aho-Corasick
Các ouput như sau:
Trang 31F(node3) = 0
While queue ≠ empty
Node r = node3 // lấy ra từ queue, khi đó queue = {node1}G(node3, h) = node4 ≠ fail
State = f(node3) = 0G(0, h) = node1 ≠ fail nên không thực thi doF(node4) = g(0, h) = node1
Node r = node4// lấy ra từ queue, khi đó queue = {node1}G(node4, e) = node5 ≠ fail
State = f(node4) =node1
G(node1, e) = node2 ≠ fail nên không thực thi do
F(node5) = g(node1, e) = node2
Node r = node5// lấy ra từ queue, khi đó queue = {node1}G(node5, a) = fail nên lặp bước kế tiếp
Node r = node1// lấy ra từ queue, khi đó queue = { }
G(node1, e) = node2 ≠ fail
State = f(node1) =node0
G(node0, h) = node1 ≠ fail nên không thực thi do
F(node2) = g(node0, e) = 0
G(node1, i) = node6 ≠ fail
State = f(node1) =node0
30
Trang 32G(node0, i) = node1 ≠ fail nên không thực thi do
F(node2) = g(node0, e) = 0
Node r = node2// lấy ra từ queue, khi đó queue = {node6}G(node2, r) = node8 ≠ fail
State = f(node2) =node0
G(node0, r) = fail nên state = f(state) = 0
F(node8) = g(node0, r) = 0
Node r = node6// lấy ra từ queue, khi đó queue = {node8}
G(node6, s) = node7 ≠ fail
State = f(node6) = node0
G(node0, s) = node3 ≠ fail nên không thực thi do
F(node7) = g(node0, s) = node3
Node r = node8// lấy ra từ queue, khi đó queue = {node7}
G(node8, s) = node9 ≠ fail
State = f(node8) =node0
G(node0, s) = node3 ≠ fail nên không thực thi do
F(node9) = g(node0, s) = node3
Node r = node7// lấy ra từ queue, khi đó queue = {node9}
G(node7, a) = fail
Node r = node9// lấy ra từ queue, khi đó queue = { }
G(node9, a) = fail
31
Trang 33queue = { } Dừng thuật toán.
Vậy, sau khi thực thi xong hàm COMPLETE(), ta sẽ đầy đủ bộ dữ liệu goto, out, failure như sau:
Goto function được mô tả như hình bên dưới:
Trang 34Out(node3) = {} qua vòng lặp tiếp theo
G(node3, h) = node4 ≠ fail
State = g(node3,h)=node4
Out(node4) = {} qua vòng lặp tiếp theo
G(node4, e) = node5 ≠ fail
State = g(node4,e)=node5
Out(node5) = {he, she} ≠ {}
//Đã tìm thấy được 2 từ, đưa 2 từ này vào danh sách kết quả trả về
Result = {he, she}
G(node5, e) = fail
state = f(state) = f(node5) = node2
State = g(node2, r) = node8
G(node8, s) = node9 ≠ fail
Out(node9) = {hers}
33