Ở công đoạn này, trong quá trình thực hiện, chúng tôi có thử nghiệm hai phương pháp khác nhau như đã nói ở trên. Tuy nhiên, do hiệu quả và tốc độ thực thi của thuật toán thứ nhất và thuật toán thứ hai chênh nhau khá nhiều, do đó trong chương trình thực tế và các kết quả kiểm thử, chúng tôi chỉ sử dụng giải thuật thứ hai.
Với giải thuật thứ nhất, ta giả sử tất cả các âm tiết đều sai. Khi đó, ta cần xác định được ít nhất một âm tiết được cho là đúng làm cơ sở. Ở đây, chúng tôi dựa vào tập nhầm lẫn âm tiết của 3 âm tiết đầu tiên, tính xác suất tốt nhất trong tất cả các tổ hợp 3 âm tiết có thể từ 3 tập nhầm lẫn âm tiết của chúng. Công thức tính xác suất:
P(s1s2s3) = P(s1).P(s2|s1).P(s3|s1s2)
Từ 3 âm tiết đã được lựa chọn và được cho là đúng này, ta lần lượt tính xác suất cho từng âm tiết tiếp theo: s4, s5,…
P(s2s3s4) = P(s1).P(s3|s2).P(s4|s2s3) …
Giải thuật này có ưu điểm là cài đặt đơn giản và hoàn toàn áp dụng tư tưởng của mô hình n-gram. Tuy nhiên, giải thuật này có nhược điểm là tốc độ thực hiện chậm do phải tính xác suất của tất cả các tổ hợp của âm tiết đầu. Giả sử mỗi âm tiết có 15 candidates khác nhau, ta phải tính xác suất 153 = 3375 lần, chỉ riêng cho 3 âm tiết đầu. Hơn nữa, giải thuật này sử dụng ít thông tin ngữ cảnh nên độ chính xác không cao. Do vậy chúng tôi đã sử dụng một giải thuật khác, được đánh giá tốt hơn, chính là giải thuật thứ hai chúng tôi trình bày sau đây.
Với giải thuật này, ta giả sử chỉ có một âm tiết sai, tất cả các âm tiết còn lại là đúng. Lúc này, ta cần xác định âm tiết nào có thể dùng để sửa lỗi tốt nhất. Để làm được điều này, với từng âm tiết, ta lần lượt giả sử âm tiết si đó là sai, sau đó tìm ra âm tiết sửa sai tốt nhất s’i trong tập nhầm lẫn cho âm tiết đó. Âm tiết si có xác suất là pi và
s’i có xác suất p’i. Ta có tỷ lệ mức độ sửa lỗi đối với âm tiết si là . Lần lượt xét toàn bộ các âm tiết của câu ta sẽ tìm được âm tiết có Fi lớn nhất; âm tiết
đó chính là âm tiết cần sửa. Sau khi thay thế âm tiết cần sửa bởi candidate tốt nhất của nó, ta lặp lại quá trình trên cho tới khi không tìm được âm tiết nào cần sửa.
22
P(s1s2s3) = P(s1).P(s2|s1).P(s3|s1s2)
Khác với giải thuật thứ nhất, chúng tôi áp dụng hàm tính xác suất trên cho các bộ 3 âm tiết: si-2si-1si , si-1sisi+1và sisi+1si+2 sau đó tính giá trị trung bình của chúng. Cụ thể:
Dựa vào công thức trên, có thể thấy ta cần tính toán các xác suất dựa trên trigrams. Điều này dẫn đến một vấn đề với các âm tiết nằm ở vị trí cận biên của câu: với âm tiết đầu tiên, ta không tính được các xác suất , cũng như vậy với các âm tiết cuối. Có một cách khá đơn giản là khi ta không tính được một xác suất nào đó trong số 3 xác suất trên, ta loại bỏ nó. Ví dụ với âm tiết đầu tiên, ta tính xác suất:
Và với âm tiết thứ 2, ta sử dụng xác suất:
Có một vấn đề khác nữa khi kiểm tra các âm tiết là trường hợp có quá nhiều lỗi trong một câu. Khi đó, chương trình sẽ phải xét các âm tiết trong câu rất nhiều lần để tìm ra được tổ hợp tốt nhất, và việc này tốn khá nhiều năng lực của bộ xử lý khi tính toán các xác suất trigram. Để tránh vấn đề trên, trước mỗi lượt xét câu, chúng tôi tính trung bình xác suất của tất cả các âm tiết trong câu (các xác suất này được tính toán trong lượt xét câu trước đó nên không tốn thêm thời gian tính toán). Với giá trị trung bình xác suất nhỏ hơn ngưỡng chọn trước, chúng tôi sẽ tính toán sử dụng các xác suất bigram và unigram tương ứng với từng ngưỡng (ở đây chúng tôi tạm chọn 10-6 cho bigram và cho 10-9 unigram). Và khi đó, với mỗi vòng tính toán cho câu, chúng tôi lại xác định “mức” cho các tính toán xác suất tiếp theo của vòng đó.