Chương 1 là tổng quan kỹ thuật đối sánh mẫu, Chương 2 trình bày một số bài toán tìm kiếm xấp xỉ và ứng dụng kỹ thuật đối sánh mẫu cho từng bài toán: Hệ thống lựa chọn phản biện cho Hội nghị, tạp chí và thuật toán lựa chọn phản biện dựa trên các phương pháp tìm kiếm xấp xỉ; Bài toán phát hiện trang web giả mạo dựa trên đối sánh đồ thị. Chương 3 là xây dựng ứng dụng hỗ trợ lựa chọn phản biện bài báo cho Tạp chí Khoa học và Công nghệ Đại học Thái Nguyên. TỔNG QUAN KỸ THUẬT ĐỐI SÁNH MẪU Đối sánh mẫu hay còn gọi là so khớp mẫu và tìm kiếm mẫu là bài toán quan trọng trong lĩnh vực tìm kiếm trong cơ sở dữ liệu, xử lý văn bản nói riêng và ứng dụng trong CNTT truyền thông nói chung. Bài toán được ứng dụng trong nhiều lĩnh vực khác nhau.
Chương này này tập trung vào một số kỹ thuật đối sánh mẫu được dùng cho hai bài toán, bao gồm bài toán tìm kiếm phản biện và bài toán phát hiện trang web giả mạo. Đối sánh chuỗi 1. Bài toán đối sánh chuỗi Đối sánh chuỗi là việc so sánh một chuỗi hoặc nhiều chuỗi với văn bản để tìm vị trí và số lần xuất hiện của chuỗi đó trong văn bản. Bài toán đối sánh chuỗi được mô tả như sau [11]: Cho một bảng chữ cái Σ là một tập hữu hạn các ký tự, một mẫu P (P [1.m]) độ dài m và một chuỗi ký tự T (T [1.
Bài toán đặt ra là cần tìm các vị trí xuất hiện của P trong T hoặc P có khớp với một chuỗi con của T hay không? Gọi Σ là một tập hữu hạn các ký tự. Thông thường, các ký tự của cả mẫu tìm kiếm và đoạn văn bản gốc đều nằm trong Σ. Tập Σ tùy từng ứng dụng cụ thể có thể là bảng chữ cái tiếng Anh từ A đến Z thông thường, cũng có thể là một tập nhị phân chỉ gồm hai phần tử 0 và 1 (Σ = {0,1}) hay có thể là tập các ký tự DNA trong sinh học (Σ = {A,C,G,T}). Phương pháp đầu tiên và đơn giản nhất có thể nghĩ đến ngay là lần lượt xét từng vị trí i trong xâu ký tự gốc từ 1 đến n-m+1, so sánh T[i…(i+m-1)] với P[1.m] bằng cách xét từng cặp ký tự một và đưa ra kết quả tìm kiếm.
Dễ thấy độ phức tạp của thuật toán là O(n*m). Các thuật toán đối sánh thường sử dụng cơ chế cửa sổ trượt (một khung có kích thước bằng với kích thước của mẫu cần tìm) để so sánh các ký tự của mẫu trong cửa sổ với các ký tự trong văn bản. Tất cả các thuật toán đối sánh chuỗi đều có hai giai đoạn là: tiền xử lý và tìm kiếm. Việc đánh giá các thuật toán được thực hiện dựa trên dung lượng bộ nhớ sử dụng và tốc độ đối sánh.
Các thuật toán đối sánh được phân loại theo cách tiếp cận xây dựng thuật toán và số lượng mẫu. Các thuật toán đối sánh chuỗi có thể phân loại theo nhiều tiêu chí: Dựa trên số lượng mẫu, chúng ta có hai loại: Đối sánh đơn mẫu (single pattern) và đối sánh đa mẫu (multiple patterns). Các thuật toán đối sánh đơn mẫu chỉ tiến hành 9 so sánh lần lượt từng mẫu P trên văn bản T, còn đối sánh đa mẫu cho phép so sánh cùng lúc nhiều mẫu Pi (i=1. Các thuật toán Đối sánh đa mẫu thường là những cải tiến của đối sánh đơn mẫu nhằm nâng cao hiệu quả đối sánh.
Dựa trên cơ sở thứ tự so sánh: thuật toán đối sánh chuỗi có thể được thực hiện theo các thứ tự sau: từ trái sang phải, từ phải sang trái, so sánh tại vị trí cụ thể và so sánh không theo thứ tự nhất định. Dựa trên độ chính xác của kết quả so khớp: các thuật toán đối sánh được chia thành hai loại: Đối sánh chính xác (Extract String Matching) và đối sánh gần đúng (Approximate String Matching). Đối sánh chính xác là khẳng định mẫu P có xuất hiện ở trong chuỗi T hay không? Còn thuật toán đối sánh xấp xỉ chỉ đánh giá sự tương đồng của mẫu P so với mẫu T dựa trên một hàm đo khoảng cách nào đó. Đa số các thuật toán đối sánh không chính xác sử dụng khoảng cách Hamming hay khoảng cách Levenshtein với k vị trí khác biệt được thiết lập trước [2].
Dựa trên cơ sở thiết kế thuật toán: Các thuật toán đối sánh được chia thành ba loại: Đối sánh dựa trên tiền tố (prefix), đối sánh dựa trên hậu tố (suffix) và đối sánh dựa trên các nhân tố (factor). Đối sánh dựa trên tiền tố Quá trình đối sánh của thuật toán dựa trên tiền tố được thực hiện bằng cách tìm kiếm từ đầu cửa sổ trượt, tất cả các ký tự trong văn bản T đều được đọc và kiểm tra, nếu không khớp thì dịch chuyển sang ký tự tiếp theo. Đây là chiến lược đơn giản nhất nhưng số lượng phép so sánh lớn nên tốc độ thực hiện chậm (xem Hình 1. Thuật toán đối sánh dựa trên hậu tố thực hiện bằng cách tìm kiếm từ cuối cửa sổ trượt, chúng ta không đọc tất cả các ký tự liên tiếp trong văn bản T mà dịch hay bỏ qua các ký tự dựa vào kết quả so sánh các ký tự ở cuối cửa sổ (xem Hình 1.
Đây là cơ sở để giảm số lượng phép so sánh và giảm độ phức tạp của thuật toán. Đối sánh hậu tố Thuật toán đối sánh dựa trên thừa số thực hiện bằng cách tìm kiếm từ cuối cửa sổ trượt, chúng ta không đọc tất cả các ký tự liên tiếp trong văn bản T mà so sánh từng ký tự đặc biệt để đoán nhận tập nhân tố (các mẫu con) của mẫu P ban đầu (Hình 1. Đối sánh dựa trên các nhân tố Để đánh giá hiệu năng của thuật toán đối sánh chuỗi, chúng ta có thể dựa trên những tiêu chí sau: Số lần tìm kiếm, duyệt trên mẫu và văn bản; Độ phức tạp thời gian; Tiêu chuẩn được lựa chọn để đối sánh; Số mẫu được đối sánh; Kỹ thuật biểu diễn mẫu. Các thuật toán đối sánh chính xác cổ điển Các kỹ thuật đối sánh chính xác cổ điển được xây dựng dựa trên số ký tự được so sánh.
Sự khác biệt của các thuật toán là quá trình tính toán xác định số ký tự được dịch chuyển sau mỗi lần so sánh. Việc so sánh có thể được tiến hành từ trái qua phải hay từ phải qua trái, vị trí ký tự so sánh có thể là dựa trên tiền tố, hậu tố,. Các thuật toán đối sánh điển hình có thể kể đến gồm: Thuật toán Brute Force Đối sánh mẫu là một chủ đề quan trọng của lĩnh vực xử lý văn bản. Bài toán so mẫu chính xác tổng quát được phát biểu là: Cho xâu mẫu P và xâu đích (văn bản) T trên cùng bảng chữ cái A.
Tìm một sự xuất hiện của P trong T. Thuật toán cơ bản nhất tìm lời giải cho bài toán là thuật toán Brute Force [1] với độ phức tạp của thuật toán là 11 O(mn), tư tưởng của thuật toán là kiểm tra tất cả các vị trí trong T từ vị trí đầu tiên đến vị trí thứ n-m, mỗi vị trí thứ i thuật toán thực hiện so sánh T[i,i+1,…,i+m-1] với xâu mẫu P, nếu thấy thì trả về vị trí i, nếu không thấy thì tiếp tục dịch sang vị trí thứ i+1. Nhược điểm của thuật toán này là kiểm tra tất cả các vị trí i (i=0,1,…,n-m) mà không quan tâm tới khả năng xuất hiện xâu mẫu hay không ở mỗi vị trí. Giả mã của thuật toán như sau: int BFmatcher(int n, int m){ int i = 0, s = 0; int matched = 1; for(i = 0; i <= n-m+1; i++){ s = 0; matched = 1; while((matched) && (s <= m-1)){ if (T[i+s] != P[s+1]){ matched = 0; }else { s++; } } if(matched){ return i; } } return -1; // -1 is NONE } Có thể thấy với mỗi vòng lặp, chúng ta mất tối đa mm phép so sánh để kiểm tra xâu P có xuất hiện trong văn bản hay không.
Do đó: Thời gian tìm xâu mẫu P trong văn bản T của giải thuật là O(mn). Thuật toán Knuth-Morris-Pratt Khắc phục hạn chế của thuật toán Brute Force, Knuth, Donald E. Morris, Jr và Vaughan R. Pratt [1] đã đề xuất thuật toán tìm kiếm KMP có độ phức tạp tuyến tính O(n+m), ý tưởng chính của thuật toán là tìm kiếm vị trí của xâu mẫu P trong T, nếu tìm thấy vị trí sai thì chuyển sang vị trí tìm kiếm tiếp theo và quá trình tìm kiếm sau này sẽ được tận dụng thông tin từ quá trình tìm kiếm trước để không phải kiểm tra những vị trí mà chắc chắn là vị trí không xuất hiện xâu mẫu P.
Thuật toán KMP được mô tả như sau: Input: P, T Output: Vị trí của mẫu P xuất hiện trong T Thuật toán 1 i=0; l=0; pos=l; matched=0 ; 12 while(l + i<= n){ if(P[i] ==T[l + i]){ i:= i + 1; if(i==m){ matched=1;returnpos; } } else if(KMP[i] > -1){ i=KMP[i];l=l + i - KMP[i];pos=l; } else{ i= 0;l=l + 1;pos=l; } } Return {pos, matched} Trong đó, matched là biến cho giá trị là 0 nếu không tìm thấy và giá trị là 1 nếu tìm thấy P xuất hiện trong T; pos là vị trí xuất hiện của P trong T;KMPlà bảng đối sánh một phần, với sự xuất hiện của KMP cho thấy thuật toán thực hiện với độ phức tạp là O(n), mục đích của bảng là cho phép thuật toán so sánh mỗi ký tự của T không quá một lần. Thuật toán xác định bảng KMP được mô tả như sau: Input:P Output: Bảng KMP Thuật toán tạo bảng KMP KMP[0]=-1; KMP[3]= 0; i=2; j=0; while(i<m){ if(P[i-1]==P[j]){ KMP[i]=j + 1; i=i + 1; j=j + 1; } else if (j> 0) j=KMP[j]; else{ KMP[i]= 0; i=i + 1; } } Độ phức tạp của thuật toán xây dựng bảng KMP là O(m). Thuật toán Boyer-Moore (1977) [21] được xây dựng để kiểm tra các ký tự của mẫu từ phải sang trái. Khi phát hiện sự khác nhau sẽ tiến hành dịch mẫu sang phải văn bản một số vị trí với hai cách dịch chuyển mẫu là Good-suffix và Bad-character.
Khoảng cách dịch chuyển Good-suffix gần giống trong thuật toán KMP, chúng ta dịch mẫu sang phải văn bản sao cho tại vị trí mới có đoạn u trên mẫu P khớp với đoạn u 13 trên văn bản T và ký tự c trên mẫu P ngay trước u phải khác a. Ta chọn đoạn dịch ngắn nhất. Nếu không có cả đoạn u trong P, ta chọn sao cho phần đuôi dài nhất của u xuất hiện ở đầu mẫu P.