1. Trang chủ
  2. » Giáo án - Bài giảng

Tiểu luận môn phân tích và đánh giá thuật toán thuật toán đối sánh mẫu thuật toán aho corasick

23 189 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 2,67 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Việc số hóa dữ liệu, lưu trữ và xử lý các văn bản trên máy tính là một việc làm hết sức quan trọng.Trong một hệ xử lý văn bản, các thuật toán xử lý xâu ký tự được coi là yếu tố quantrọng

Trang 1

LỜI MỞ ĐẦU 1

PHẦN 1: KHÁI NIỆM CƠ BẢN VỀ ĐỐI SÁNH XÂU KÝ TỰ 2

(STRING MATCHING) 2

1.1 Giới thiệu chung 2

1.2 Bài toán đối sánh chuỗi ký tự 2

1.3 Thuật toán đối sánh chuỗi ký tự đơn giản 3

1.3.1 Thuật toán đối sánh chuỗi Match(P,T) 3

1.3.2 Mô tả thuật toán 4

1.3.3 Ví dụ minh họa cho thuật toán 4

1.3.4 Phân tích thuật toán 6

PHẦN 2: THUẬT TOÁN TÌM KIẾM AHO - CORASICK 7

2.1 Ý tưởng thuật toán AHO - CORASICK 7

2.2 Phân tích thuật toán 7

2.2.1 Máy tìm kiếm mẫu 7

2.2.2 Xây dựng hàm goto, failure và output 10

2.3 Đánh giá độ phức tạp thuật toán tìm kiếm AHO – CORASICK 15

2.4 Ứng dụng của thuật toán tìm kiếm Aho- Corasick 15

KẾT LUẬN 17

TÀI LIỆU THAM KHẢO 18

Trang 2

LỜI MỞ ĐẦU

Cùng với sự phát triển vượt bậc của các ngành khoa học kỹ thuật nói chung.Ngành khoa học máy tính đã có những bước phát triển mạnh mẽ trong những năm gầnđây, góp phần quan trọng vào sự phát triển của đời sống kinh tế xã hội, an ninh, quốcphòng…đồng thời quay trở lại phục vụ chính các ngành khoa học

Xã hội càng phát triển thì cũng đồng nghĩa với việc số lượng thông tin được lưutrữ càng lớn và vấn đề tìm kiếm, nhận dạng thông tin trở thành một bài toán khá phứctạp Khi đó, việc thực hiện thủ công sẽ rất khó khăn, tốn nhiều thời gian, độ chính xáckhông cao…thậm chí không thể giải quyết được vấn đề Bên cạnh đó, máy tính có thểgiải quyết các bài toán với khối lượng tính toán lớn, xử lý các thuật toán tìm kiếm, xử lývăn bản chính xác… Những kiến thức về ngành khoa học máy tính trong đó kiến thức

về phân tích và thiết kế thuật toán chiếm vai trò quan trọng nhằm giải quyết bài toánmột cách tối ưu nhất

Thuật toán là một thủ tục tính toán được định nghĩa, sử dụng các giá trị hoặc mộttập các giá trị nào đó, thuật toán là một trình tự các bước tính toán biến đổi dầu vàothành đầu ra

Phân tích thuật toán để qua đó có thể tiên liệu được các tài nguyên mà thuật toányêu cầu như: tài nguyên bộ nhớ, băng thông, các tài nguyên ngoại vi…Song phần chínhthời gian tính toán mới là yếu tố quan trọng mà ta cần quan tâm và đánh giá khi thuậttoán thực hiện

Sau quá trình học tập môn “Phân tích và đánh giá thuật toán” bản thân em đã

học được nhiều kiến thức bổ ích phục vụ cho quá trình học tập các môn học khác cũngnhư công tác sau này Theo sự phân công của thầy em xin trình bày việc giải quyết bài

toán “Thuật toán đối sánh mẫu Thuật toán Aho - Corasick”.

Do kiến thức còn hạn chế, trong quá trình trình bày không tránh khỏi nhữngkhiếm khuyết, rất mong nhận được sự đóng góp ý kiến quý báu của thầy giáo và cácbạn

Em xin bày tỏ sự kính trọng và biết ơn chân thành đến thầy giáo PGS.TS ĐàoThanh Tĩnh đã tận tình giúp đỡ em trong quá trình học tập môn học, cũng như trong quátrình thực hiện bài tập này

Đặng Việt Quang_HTTT25B 2

Trang 3

PHẦN 1: KHÁI NIỆM CƠ BẢN VỀ ĐỐI SÁNH XÂU KÝ TỰ

(STRING MATCHING)1.1 Giới thiệu chung

Hiện nay, máy tính đã thâm nhập vào tất cả các lĩnh vực của xã hội Việc số hóa

dữ liệu, lưu trữ và xử lý các văn bản trên máy tính là một việc làm hết sức quan trọng.Trong một hệ xử lý văn bản, các thuật toán xử lý xâu ký tự được coi là yếu tố quantrọng trong việc nâng cao hiệu quả về thời gian, độ chính xác khi xử lý một văn bản.Trong các phép toán cơ bản trên chuỗi ký tự, phép toán đối sánh chuỗi luôn được chútrọng phát triển, đặc biệt là trong điều kiện các dữ liệu văn bản ngày càng nhiều

Bài toán đối sánh chuỗi ký tự có thể được đặc trưng như một bài toán tìm kiếm,trong đó mẫu P được xem như khoá, tuy nhiên các thuật toán tìm kiếm thông thườngkhông áp dụng được một cách trực tiếp vì mẫu P có thể dài và nó trải trên văn bản theomột cách không biết trước được Đây là một bài toán thú vị có nhiều thuật toán khácnhau như Brute-Force (BF), Knuth-Morris-Pratt (KMP), Aho- Corasick, Boyer-Moore(BM), Karp- Rabin (KR), Franek-Jennings-Smyth (FJS) …

1.2 Bài toán đối sánh chuỗi ký tự

Giả sử có một văn bản T là một mảng có độ dài là n (T[1 n]) và một chuỗi mẫu

P có độ dài là m (P[1 m]) Các phần tử của T và P là các ký tự trong tập hữu hạnalphabet  VD:  = {0,9} hoặc  = {a,b,c ,z,A,B,C,…,Z} Mảng ký tự S và T được} Mảng ký tự S và T đượcgọi là chuỗi ký tự

Khi đó bài toán đối sánh chuỗi được phát biểu như sau: Cho một chuỗi ban

đầu T và một chuỗi mẫu P Đối sánh chuỗi ký tự chính là việc tìm chuỗi mẫu P trongchuỗi ban đầu T Nếu chuỗi mẫu P được tìm thấy trong chuỗi ban đầu T hãy chỉ ra vị trítrong T mà tại đó chuỗi mẫu P được tìm thấy

Cụ thể hơn, chuỗi mẫu P được tìm thấy với s lần dịch chuyển trong chuỗi ban đầu T Điều này tương đương với việc chuỗi mẫu P được tìm thấy bắt đầu từ vị trí s +1

trong chuỗi ban đầu T nếu thỏa mãn điều kiện 0  s  n-m và T(s+1, ,s+m) = P(1 m)tức là T(s + j) = P(j) với 1 j  m

Nếu P được tìm thấy trong T thì s được gọi là giá trị dịch chuyển Còn trong trường hợp ngược lại (tức là không tìm thấy mẫu P trong T), s được gọi là giá trị dịch chuyển không

Trang 4

Tóm lại: Bài toán đối sánh chuỗi ký tự là bài toán tìm giá trị dịch chuyển s sao cho sau

số lần dịch chuyển đó tìm được chuỗi mẫu P trong chuỗi ban đầu T

1.3 Thuật toán đối sánh chuỗi ký tự đơn giản

Thuật toán đối sánh chuỗi đơn giản là thuật toán tìm tất cả các giá trị dịch

chuyển s, sử dụng một vòng lặp để kiểm tra điều kiện P[1 m] = T[s+1, ,s+m] với mọi ký tự từ 1… (n-m+1) của T.

Tìm kiếm thành công

1.3.1 Thuật toán đối sánh chuỗi Match(P,T)

Input: P và T, chuỗi mẫu và chuỗi văn bản gốc T Với điều kiện P.length <= T.length Output: Tìm chỉ số s là vị trí của P trong T Nếu s = T.length + 1 thì không tìm thấy P

Trang 5

j := s;

k :=1;

end;

1.3.2 Mô tả thuật toán

Thuật toán thực hiện như sau: Tiến hành so sánh phần tử thứ nhất của chuỗi mẫu

P với phần tử thứ nhất của chuỗi ban đầu T Nếu hai phần tử này giống nhau, tiến hành

so sánh tiếp phần tử thứ 2 Cứ như vậy cho đến khi tìm được chuỗi P trong T hoặc pháthiện ra vị trí mà tại đó phần tử của T và P khác nhau

Trong trường hợp phát hiện ra vị trí mà tại đó phần tử của T và P khác nhau tatiến hành dịch phải chuỗi P đi một phần tử so với chuỗi T Lặp lại thao tác so sánh nhưtrên cho đến khi đạt được kết quả, hoặc không tìm thấy nếu duyệt hết chuỗi T

1.3.3 Ví dụ minh họa cho thuật toán

Giả sử chuỗi T = “abacabaaabcabacabaa”

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

Trang 6

Bước 2: Sau khi thấy hai phần tử T[1] = P[1], tiến hành so sánh tiếp T[2] và P[2]

s 1 2 3 4 5 6 7 8 9 1

0

1 1

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

Đặng Việt Quang_HTTT25B 6

Trang 7

Bước 3: So sánh phần tử T[3] và P[3]

s 1 2 3 4 5 6 7 8 9 1

0

1 1

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

T: a b c a b a a a b c a b a c a b a a a

Trang 8

1.3.4 Phân tích thuật toán

Việc tiến hành theo đúng các bước của thuật toán đối sánh chuỗi như trên sẽ chobiết có tìm thấy chuỗi mẫu P trong chuỗi ban đầu T hay không Nếu chuỗi mẫu P đượctìm thấy thì tìm thấy ở vị trí phần tử nào trên chuỗi T

Tuy nhiên, thuật toán đối sánh chuỗi này còn gặp nhược điểm lớn về thời gianthực hiện thuật toán như sau:

- Với n là độ dài của chuỗi ban đầu T, m là độ dài của chuỗi mẫu P thì thời gian

so khớp hai chuỗi là (mn) Đây là một thời gian lớn làm cho thuật toán có tốc độ

chậm

- Nguyên nhân của việc chậm này là do việc so sánh các phần tử của chuỗi Tđược thực hiện lặp đi lặp lại n lần trong những lần so sánh tiếp theo Và tại mỗi vị trí s

trong T ta so sánh m ký tự trong P Như vậy trong trường hợp xấu nhất sẽ có mn phép

so sánh Như vậy độ phức tạp thuật toán là O(mn).

Trong ví dụ đã nêu ở trên việc so sánh hai phần tử ở vị trí tương ứng của haichuỗi T và P phát hiện ra vị trí khác nhau đầu tiên sau 3 lần so sánh, tức là T[3] và P[3]khác nhau Theo đúng thuật toán chuỗi mẫu P sẽ dịch sang phải so với chuỗi T một vịtrí và việc so sánh lại bắt đầu lại từ đầu Mặc dù trong lần so sánh trước đã biết giá trịT[1] và biết T[1] khác P[1] Đây là việc làm lặp đi lặp lại đối với T[1] trong các lần sosánh tiếp theo, làm tăng thời gian thực hiện thuật toán

Như vậy, chúng ta thấy thuật toán đối sánh chuỗi ký tự đơn giản không phải là mộtthuật toán tối ưu Vì vậy cần xem xét đến một phương án tối ưu hơn, có thời gian thựchiện thuật toán nhỏ hơn

Đặng Việt Quang_HTTT25B 8

Trang 9

PHẦN 2: THUẬT TOÁN TÌM KIẾM AHO - CORASICK

2.1 Ý tưởng thuật toán AHO - CORASICK

Thuật toán tìm kiếm chuỗi Aho-Corasick được xây dựng bởi Alfred V Aho andMargaret J Corasick Đây là một thuật toán đơn giản và hiệu quả được dùng để xácđịnh số lần xuất hiện của một số từ khóa hữu hạn trong chuỗi văn bản Thuật toán nàyxây dựng máy trạng thái hữu hạn dựa vào các từ khóa và sau đó sử dụng máy này để xử

lý chuỗi văn bản Thời gian xây dựng máy so khớp mẫu phụ thuộc vào tổng độ dài củacác từ khóa

Thuật toán gồm 2 phần:

+ Phần 1: Xây dựng máy so khớp mẫu trạng thái hữu hạn các từ khóa

+ Phần 2: Sử dụng máy so khớp mẫu vừa xây dựng để xử lý chuỗi văn bản.Phương pháp tiếp cận ở đây là sự kết hợp ý tưởng trong thuật toán Knuth-Morris- Pratt với máy trạng thái hữu hạn

2.2 Phân tích thuật toán

Phần phân tích này chủ yếu dựa trên bài báo: “ Efficient string matching: An aid

to biblographic search – Alfray V.Aho and Margaret J.Corasick” Nội dung chính làtrình bày về máy so khớp mẫu trạng thái hữu hạn để xác định các từ khóa trong chuỗivăn bản và mô tả thuật toán để xây dựng máy này

2.2.1 Máy tìm kiếm mẫu

Giả sử K={ } là bộ hữu hạn các từ khóa và x là chuỗi văn bản tùy ý Vấn đề ở đây là phải xác định và tìm ra tất cả các chuỗi con của x là các từ khóa thuộc

K Các chuỗi con này có thể chồng chéo nhau

Trang 10

Một máy so khớp mẫu là một chương trình với đầu vào chuỗi văn bản x và đầu

ra xác định từ khóa của tập K có xuất hiện trong x hay không Máy tìm kiếm mẫu baogồm một bộ các trạng thái, mỗi trạng thái đại diện bởi một số Máy xử lý chuỗi văn bản

x bằng cách liên tục đọc các ký tự trong x, thay đổi trạng thái và liên tục đưa ra kết quả.

Máy này gồm có 3 hàm: goto(g), failure( f), và output

Hình 1 biểu diễn máy so khớp mẫu trạng thái sử dụng các hàm với một bộ từkhóa K= {he, she, his, hers}

Hình 1: Máy so khớp mẫu trạng thái hữu hạn

Đặng Việt Quang_HTTT25B 10

Trang 11

Trong hìnhHình 1 có 10 trạng thái từ 0 đến 9, trong đó trạng thái 0 luôn được

thiết kế là trạng thái bắt đầu Hàm goto(g) ánh xạ với trạng thái và ký tự của trạng thái

đó hoặc thông báo fail

Hình 1(a) mô tả về hàm goto(g)

Ví dụ, mũi tên trỏ từ trạng thái 0 đến 1 được gán nhãn h nên g(0, h) = 1 Trái lại

nếu không có mũi tên này thì kết quả là fail Do vậy với tất cả các ký tự đầu vào khác

e và i thì g(0, ) = fail Tất cả các máy so khớp mẫu đều được xây dựng thỏa mãn g(0,

) fail với tất cả các ký tự đầu vào là

Hàm failure(f) ánh xạ một trạng thái vào một trạng thái Hàm failure được truy vấn bất cứ khi nào hàm goto trả về kết quả fail Khi trạng thái đầu ra đã xác định có

nghĩa là tập từ khóa được tìm thấy Hàm output là sự kết hợp của một bộ các từ khóa(có thể rỗng) với mỗi trạng thái

Một chu kỳ hoạt động của một máy so khớp mẫu được định nghĩa như sau: Giả

sử s là trạng thái hiện tại của máy và a là ký tự hiện tại của chuỗi văn bản đầu vào x.

1 Nếu g(s, a) = s', máy sẽ thực hiện goto transition (quá trình chuyển tiếp của hàm goto) Máy sẽ nhập vào trạng thái s' và ký tự tiếp theo của x là ký tự đầu vào hiện tại Ngoài ra, nếu output(s') empty thì vị trí của ký tự đầu vào hiện tại là kết quả của hàm output(s') Một chu kỳ hoạt động kết thúc.

2 Nếu g(s, a) = fail, máy sẽ gọi hàm failure và thực hiện quá trình chuyển tiếp của hàm fail Nếu f(s) = s', máy sẽ lặp lại chu kỳ hoạt động với s' là trạng thái hiện tại

và a là ký tự đầu vào hiện tại.

Ban đầu, trạng thái hiện tại của máy là trạng thái bắt đầu và ký tự đầu tiên củachuỗi văn là ký tự đầu vào hiện tại Sau đó máy sẽ xử lý chuỗi văn bản bằng cách tạo ramột chu kỳ hoạt động cho mỗi ký tự của chuỗi văn bản

Trang 12

Ví dụ, máy M sử dụng các hàm trong hình 1 để xử lý chuỗi văn bản "ushers" Hình 2

mô tả máy M thực hiện chuyển tiếp trạng thái trong quá trình xử lý chuỗi văn bản

Hình 2: Chuỗi chuyển đổi trạng thái

Xét chu kỳ hoạt động của M tại trạng thái 4 và ký tự đầu vào hiện tại là e Vì g(4, e) = 5 nên máy sẽ nhập trạng thái 5 và chuyển tới ký tự đầu vào tiếp theo Kết quả của hàm output(5) cho biết các từ khóa "she", "he" đã được tìm thấy tại điểm kết thúc

của vị trí thứ 4 trong chuỗi văn bản

Tại trạng thái 5với ký tự đầu vào r thì máy sẽ tạo ra 2 quá trình chuyển tiếp trạng thái trong một chu kỳ hoạt động của nó Vì g(5, r) = fail nên M nhập vào trạng thái 2 = f(5) Mặt khác g(2, r) = 8 nên M nhập vào trạng thái 8 và chuyển tới ký tự đầu vào tiếp

theo Và cuối cùng không có kết quả nào được đưa ra đối với mỗi chu kỳ hoạt động củamáy

Thuật toán sau sẽ tóm tắt quá trình hoạt động của máy so khớp mẫu

Thuật toán 1: Máy so khớp mẫu.

mẫu M và các hàm goto g, failure f và output đã được giới thiệu ở trên.

Output: Vị trí của các từ khóa xuất hiện trong x

Trang 13

Với mỗi vòng lặp for là một chu kỳ hoạt động của máy

2.2.2 Xây dựng hàm goto, failure và output

Chúng ta nói rằng 3 hàm goto, failure và output hợp lệ với một bộ các từ khóa, nếu các hàm này đưa ra điểm kết thúc từ khóa y tại vị trí i của chuỗi văn bản x khi và chỉ khi x = uyv và độ dài của uy là i.

Bây giờ chúng ta sẽ xem làm thế nào để xây dựng các hàm goto, failure và output hợp lệ với một bộ các từ khóa Quá trình xây dựng gồm có 2 phần, phần 1 chúng

ta sẽ xác định trạng thái và hàm goto, phần 2 chúng ta sẽ tính toán hàm failure Việctính toán hàm output được bắt đầu trong phần một và được hoàn thành trong phần 2

Để xây dựng hàm goto, chúng ta cần xây dựng một đồ thị goto, trạng thái bắt đầu

được thiết lập là trạng thái 0 Tại trạng thái bắt đầu chúng ta nhập mỗi từ khóa y bằng

cách thêm một đường dẫn trực tiếp vào đồ thị Các đỉnh và các nhánh được thêm vào đồ

thị tại trạng thái bắt đầu, mỗi đường dẫn trong đồ thị được gán bằng từ khóa y Từ khóa

y được thêm vào hàm output tại cuối đường dẫn Chúng ta thêm các nhánh mới vào đồ

thị chỉ khi nào cần thiết

Ví dụ, xét X= {he, she, his, hers} là một bộ các từ khóa Việc thêm từ khóa đầu

tiên vào đồ thị, chúng ta được:

Trang 14

Đường dẫn từ trạng thái 0 đến trạng thái 2 sẽ gán từ khóa "he", chúng ta kết hợpđưa đầu ra "he" tại trạng thái 2 Sau khi thêm từ khóa thứ 2 "she", ta được đồ thị:

Đầu ra "she" được đưa ra tại trạng thái 5 Chúng ta thêm từ khóa "his" vào đồ thịthì có được hình sau Chú ý rằng khi thêm từ khóa "his" thì trong đồ thị đã có 1 nhánh

từ trạng thái 0 đến trạng thái 1 gãn nhãn h nên chúng ta không cần thêm một nhánhkhác gán nhãn h mà sử dụng luôn nhánh này Đầu ra "his" sẽ được đưa ra tại trạng thái7

Sau khi thêm từ khóa cuối cùng "hers" vào đồ thị ta có hình sau:

Đầu ra của từ khóa "hers" tại trạng thái 9 Ở đây, chúng ta sử dụng các nhánh cósẵn trong đồ thị đó là nhánh từ trạng thái 0 đến trạng thái 1 và được gán nhãn là h vànhánh từ trạng thái 1 đến trạng thái 2 dược gán nhãn là e

Đặng Việt Quang_HTTT25B 14

Trang 15

Khi chúng ta đã có cây đồ thị hoàn chỉnh, để hoàn thiện việc xây dựng hàm goto,chúng ta thêm một vòng lặp từ trạng thái 0 đến trạng thái 0 đối với tất cả các ký tự đầuvào khác h và s Như vậy, chúng ta đã xây dựng xong một đồ thị có hướng và được chỉ

ra trên hình 1(a) Đồ thị này đại diện cho hàm goto

Hàm failure được xây dựng từ hàm goto Định nghĩa độ sâu của trạng thái s trong đồ thị goto là độ dài đường dẫn ngắn nhất từ trạng thái bắt đầu tới s Trong hình

1(a), trạng thái bắt đầu có độ sâu là 0, trạng thái 1 và 3 là 1, trạng thái 2,4 và 6 là 2,…

Chúng ta sẽ tính toán hàm failure cho tất cả các trạng thái có độ sâu là 1, 2,… và

cứ tiếp tục như thế cho đến khi hàm failure tính toán xong cho tất cả các trạng thái(ngoại trừ trạng thái 0 thì hàm failure không định nghĩa) Thuật toán để tính toán hàm

failure (f) tại một trạng thái được trình bày khá đơn giản Chúng ta đặt f(s) = 0 cho tất

cả các trạng thái s có độ sâu là 1 Bây giờ, giả sử failure (f) đã tính toán cho tất cả các trạng thái có độ sâu nhỏ hơn d Trạng thái có độ sâu d được xác định từ giá trị fail của hàm goto tới trạng thái có độ sâu d – 1

Cụ thể, để tính toán hàm failure cho trạng thái có độ sâu d, chúng ta xem xét một trạng thái r có độ sâu d-1 và thực hiện như sau:

1 Nếu g(r, a) = fail với mọi a, không làm gì cả.

2 Nếu không, với mỗi một ký tự a sao cho g(r, a) = s chúng ta thực hiện:

a Gán state = f(r).

b Thực hiện gán state f(state) cho đến khi giá trị của state thỏa mãn

g(state, a) fail (Chú ý rằng do g(0,a) fail với mọi a nên một trạng

thái sẽ luôn luôn được tìm thấy)

c Gán f(s) = g(state, a).

Ví dụ, để tính toán hàm failure trong hình 1(a), đầu tiên chúng ta gán f(1) = f(3)

= 0 bởi vì trạng thái 1 và 3 đều có độ sâu là 1 Sau đó chúng ta tính toán hàm failure cho các trạng thái 2,4 và 6 với cùng độ sâu là 2 Để tính toán f(2) chúng ta gán state = f(1) = 0 vì g(0, e) = 0 nên f(2) = 0 Để tính toán f(6), chúng ta gán state =f(1) = 0; do

Ngày đăng: 03/10/2017, 00:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w