Sau khi kết thúc giai đoạn “Pre-processing”, lúc này mỗi câu trong đoạn văn bản đã được tách từ, đồng thời được gán nhãn từ loại và biểu diễn dưới dạng một chuỗi các từ. Mỗi câu này sẽ là đầu vào của khối xử lý tiếp theo, khối lọc ra những câu tương tự nhất với nó mà tập mẫu có được. Có thể nói đây là khối xử lý phức tạp nhất, tốn nhiều thời gian nhất và chất lượng của nó ảnh hưởng đến hiệu suất dịch của toàn bộ hệ thống.
3.1.4.1. Ý tưởng
Duyệt từng câu trong tập mẫu, sau đó sử dụng giải thuật tính khoảng cách (hoặc độ tương tự) giữa nó với câu đầu vào, để tìm ra những câu có độ khoảng cách nhỏ nhất (hay độ tương tự lớn nhất). Để có thể lấy ra được những câu có thể tin cậy được, cần phải đưa ra một giá trị ngưỡng. Nếu giá trị khoảng cách nhỏ nhất có thể được vượt quá giá trị ngưỡng thì thuật toán sẽ kết thúc mà không có một câu nào được chọn.
Kho ngữ liệu X X X X X Dist (input,example) <= (=1/3) INPUT:
We close the door
EXAMPLE:
We will close the shop I open the door We open the shop…
Hình 3. 4 Minh hoạ khối Tìm kiếm ngữ liệu tuơng tự.
3.1.4.2. Tính khoảng cách giữa hai câu dựa vào giải thuật DP- Matching
Khái niệm: Khoảng cách ngữ nghĩa (edit-distance) giữa hai câu s1 và s2 (được biểu diễn bằng các word-sequence) được định nghĩa bằng thương số giữa chi phí biến đổi
tối thiểu để thu được s2 từ s1 và tổng số từ trong hai câu đó:
d(s1,s2) = ( ) 2 1 2 1, s s L L s s C + (3.2)
Trong đó: C(s1, s2) là ký hiệu chi phí cực tiểu để thu được s2 từ s1, Ls1 và Ls2 lần lượt
là tổng số từ (hay còn được gọi là “độ dài”) của s1 và s2
Cách xác định C(s1,s2) :
Quá trình biến đổi s1 để thu được s2 thực chất là tổ hợp của các thao tác:
Thêm từ vào s2.
Xoá từ trong s2.
Thay thế một từ trong s2 bằng một từ trong s1.
Chúng ta định nghĩa:
C(“ ”, “ ”) = 0. (1) C(s, “ ”) = C(“ ”, s) = |s| (|s| là độ dài hay là tổng số từ trong s). (2) C(s1+w1, s2+w2) = (3) min ( C(s1,s2) + 2.SEMDIST(w1,w2) ,
C(s1+w1,s2) + 1,C(s1,s2+w2) + 1)
Dễ thấy (1) và (2) là hiển nhiên. Đối với (3), đó là công thức đệ quy giúp xác định
được C(s1,s2) từ các giá trị khởi tạo trong (1) hoặc (2). Trong đó, w1 và w2 là các từ
riêng biệt. Để biến đổi từ (s1+w1) sang (s2+w2) có thể áp dụng 3 khả năng sau:
i) Thay thế (Biến đổi) w1 thành w2 ,chi phí tổng thể là: C(s1,s2) + 2.SEMDIST(w1,w2)
ii) Biến đổi (s1+w1) thành s2, sau đó thêm w2 vào s2. Chi phí tổng thể là:
C(s1+w1,s2) + 1
iii) Xoá từ, sau đó biến đổi thành .Chi phí tổng thể là C(s1,s2+w2) + 1
Vì vậy, chi phí cực tiểu sẽ được xác định bằng giá trị nhỏ nhất trong 3 chi phí trên.
3.1.4.3. Giải thuật DP-matching:
Trong giải thuật này, chúng ta sử dụng 1 mảng 2 chiều m[0..|s1|, 0..|s2|] để lưu giá trị
chi phí C nói trên. Như vậy:
m[i,j] = C(s1[1..i], s2[1..j] ). m[0,0] = 0
m[i,0] = i, i=1..|s1| m[0,j] = j, j=1..|s2|
m[i,j] = min(m[i-1,j-1] + 2.SEMDIST(s1[i],s2[j]), m[i-1, j] + 1,
m[i, j-1] + 1 ), i=1..|s1|, j=1..|s2|
1) Khởi tạo m[0,0] := 0;
2) for i:= 1 to |s1| do m[i,0] := i ; 3) for j:= 1 to |s2| do m[0,j] := j ; 4) for i:= 1 to |s1| do
for j:= 1 to |s2| do
m[i,j] = min(m[i-1,j-1] + 2.SEMDIST(s1[i],s2[j]),
m[i-1, j] + 1, m[i, j-1] + 1 ) ; 5) d := m[i,j] / (l1 + l2) ;
*Đánh giá độ phức tạp của thuật giải:
Độ phức tạp của thuật toán, về mặt thời gian là O(|s1|*|s2|) , chẳng hạn O(n2) nếu cả
hai câu đều có độ dài n. Về mặt không gian, độ phức tạp vẫn là O(n2) nếu là mảng 2
chiều.