CHƯƠNG 3 phương pháp ĐỀ XUẤT
3.2. Phương pháp phát hiện và sửa lỗi
3.2.1. Phát hiện và sửa lỗi mức kí tự
Greedy heuristic
Như vậy với mơ hình ngơn ngữ, ta có thể dùng để xác định xác suất của một bất kì một kí tự kế tiếp dựa vào chuỗi kí tự phía trước nó. Giả sử ta đã xây dựng được mơ hình
ngơn ngữ mức kí tự trên tập dữ liệu đủ lớn. Ví dụ với input là chuỗi “ngơi nh”, ta có xác suất của các kí tự tiếp theo:
• ngơi nh[a] 𝑝 = 0.0223 • ngôi nh[b] 𝑝 = 0.0007 • … • ngôi nh[à] 𝑝 = 0.9433 • ngơi nh[á] 𝑝 = 0.0131 • … • ngơi nh[z] 𝑝 = 0.0002
Bước tiếp theo của bài toán là phát hiện lỗi chính tả có thể có trong văn bản. Một mơ hình ngơn ngữ đủ tốt sẽ capture được tốt xác suất của ngôn ngữ trong gần hết các ngữ cảnh. Một văn bản đúng chính tả sẽ có tất cả xác suất của từ hay kí tự đều cao hơn ngưỡng chấp nhận được. Ngược lại, khi có lỗi sai chính tả, thì tại vị trí đó xác suất của từ hay kí tự sẽ thấp hơn rất nhiều và gần với giá trị 0. Ví dụ với câu: “soạn thảu văn bản”. Giả sử năm kí tự đầu tiên là đúng, ngưỡng xác suất để xác định sai chính tả là 0.01, ta xem xét giá trị xác suất của từ kế tiếp với đoạn văn bản đầu là “hơm na”:
• soạn [t] 𝑝 = 0.3795 > 0.01 Đúng chính tả
• soạn t[h] 𝑝 = 0.5039 > 0.01 Đúng chính tả
• soạn th[ả] 𝑝 = 0.8254 > 0.01 Đúng chính tả
• soạn thả[u] 𝑝 = 0.0062 < 0.01 Sai chính tả
Vì xác suất của kí tự “u” thấp hơn ngưỡng, nên có thể xem như vị trí này đang bị sai chính tả. Kế tiếp, cần phải sửa lại lỗi sai này. Đơn giản nhất là lấy từ kế tiếp có xác suất cao nhất theo mơ hình ngơn ngữ để thay thế. Cụ thể trong trường hợp này là kí tự “o”, với 𝑝 = 0.9902. Lúc này, câu được sửa lại thành “soạn thảo văn bản”. Tiếp tục kiểm tra xác suất tại các vị trí cịn lại, ta sẽ thấy giá trị sẽ đủ lớn để có thể chấp nhận được. Hình 3.4 minh hoạ cho giải thuật Greedy này.
Hình 3.4. Flowchart greedy heuristic
Trên đây là một heuristic đơn giản và tường minh cho phát hiện và sửa lỗi. Tuy nhiên, không phải lúc nào phương pháp này cũng hoạt động một cách hiệu quả. Vì chúng ta khơng biết chính xác ngưỡng xác suất để xác định đó là sai bằng bao nhiêu, việc chọn ngưỡng sai có thể dẫn đến kết quả khơng mong muốn. Đối với một số văn bản, lỗi chính tả xảy ra ngay từ đầu văn bản, khi dùng những ngữ cảnh sai chính tả này để dự đốn xác suất từ kế tiếp sẽ làm cho việc phát hiện sửa lỗi khơng chính xác. Vì vậy, cần phải có những kĩ thuật, chiến lược heuristic phù hợp để cải thiện và tận dụng tối đa khả năng của mơ hình ngôn ngữ.
n-Lookahead probability
Trong một số trường hợp, việc sử dụng từ có xác suất trực tiếp cao nhất để thay thế có thể là khơng đúng. Ví dụ với trường hợp sau: “mùa zuân tây bắc”. Áp dụng chiến lược ở trên ta phát hiện vị trí thứ năm, kí tự “z” bị sai chính tả. Ta xem năm từ có xác suất cao nhất ứng với ngữ cảnh trước đó:
• mùa [s] 𝑝 = 0.4293
• mùa [t] 𝑝 = 0.1143
• mùa [x] 𝑝 = 0.1701
• mùa [h] 𝑝 = 0.1121
• mùa [đ] 𝑝 = 0.0975
Như vậy, nếu ta chọn từ có xác suất cao nhất và thay thế, lúc này câu sẽ trở thành “mùa suân tây bắc” và vẫn sai chính tả. Ngun nhân là do mơ hình ngơn ngữ khơng thể thấy được phần ngữ cảnh phía sau là cụm “uân” mà chỉ dùng phần phía trước “mùa ” để đưa ra xác suất của các từ. Trong trường hợp này, thay vì sử dụng xác suất trực tiếp, chúng ta sẽ sử dụng xác suất n-Lookahead. Có nghĩa là thay vì dùng xác suất trực tiếp để phát hiện và sửa lỗi, ta sẽ dùng xác suất của từ hiện tại tính thêm 𝑛 − 1 từ kế tiếp. Cụ thể, với ví dụ trên, khi chọn kí tự phù hợp để thay thế, với 𝑛 = 4, ta tính:
• mùa [s] 𝑝1 mùa s[u] 𝑝2 mùa su[â] 𝑝3 mùa suâ[n] 𝑝3 • mùa [t] 𝑝1 mùa t[u] 𝑝2 mùa tu[â] 𝑝3 mùa tuâ[n] 𝑝4 • mùa [x] 𝑝1 mùa x[u] 𝑝2 mùa xu[â] 𝑝3 mùa xuâ[n] 𝑝4
• …
Xác suất n-lookahead của mỗi trường hợp sẽ là:
𝑝(𝑛 − 𝑙𝑜𝑜𝑘𝑎ℎ𝑒𝑎𝑑) = 𝑝1x 𝑝2x 𝑝3x 𝑝4
Lúc này, do tính đến xác suất của cả ngữ cảnh phía sau, nên xác suất n-lookahead của trường hợp kí tự “x” sẽ cao hơn và được chọn để thay thế. Ngoài ra, khi chọn 𝑛 lớn, các giá trị xác suất khi nhân với nhau sẽ cho ra kết quả rất nhỏ. Ta có thể lấy tổng 𝑙𝑜𝑔 của các xác suất thành phần và dùng kết quả đó thay cho xác suất n-lookahead ban đầu:
𝑙𝑜𝑔𝑝(𝑛 − 𝑙𝑜𝑜𝑘𝑎ℎ𝑒𝑎𝑑) = log(𝑝1) + log(𝑝2) + ⋯ + log(𝑝𝑛)
Các chiến lược sửa lỗi
Có nhiều loại lỗi thường xảy ra khi sai chính tả, việc thay thế từ bị sai chỉ là phương pháp sửa lỗi dựa trên một trong số chúng. Các lỗi sai có thể chia thành các loại sau:
• Lỗi replace: ngôi nhà ngai nhà
• Lỗi transpose: ngơi nhà ngiơ nhà
• Lỗi delete: ngôi nhà ngi nhà
• Lỗi insert: ngơi nhà ngơơi nhà
Ngồi ra, có thể có thêm một số trường hợp khác tuỳ theo các trường hợp khác nhau.
Với mỗi loại ta sẽ có chiến lược sửa lỗi tương ứng, cụ thể:
• Lỗi replace replace • Lỗi transpose transpose • Lỗi delete insert
• Lỗi insert delete
Trong thực tế, khi phát hiện lỗi sai dựa trên xác suất mơ hình ngơn ngữ, chúng ta khơng biết được là sai loại nào. Vì thế, với mỗi loại lỗi, chúng ta sẽ tạo ra những correct case (trường hợp sửa lỗi) tương ứng. Sau đó chúng ta sẽ tính giá trị nlookahead của từng trường hợp và chọn giá trị cao nhất.
Kết hợp sửa lỗi từ hai phía left2right và right2left
ngữ cảnh từ hai phía trái và phải của kí tự đó để sửa lỗi. Lúc này, ta cần huấn luyện một mô hình ngơn ngữ với cả hai phía. Mơ hình left2right với chiều xuôi và mô hình right2left theo chiều người lại. Ví dụ với từ “đường”, dữ liệu huấn luyện cho mơ hình left2right vẫn sẽ giữ ngun là “đường”, cịn mơ hình right2left thì từ sẽ được đảo ngược lại thành “gnờưđ”. Mơ hình left2right sẽ phát hiện và sửa lỗi tốt phần cuối văn bản (do đã có nhiều ngữ cảnh từ phía đầu), cịn mơ hình right2left sẽ sửa tốt phần đầu (do có nhiều ngữ cảnh từ phía cuối).
Khi kết hợp, hai mơ hình sẽ bắt đầu kiểm tra lỗi đồng thời tại hai vị trí đầu và cuối văn bản, nếu có lỗi từ phía nào thì sẽ sửa lỗi từ phía đó. Sau khi sửa xong sẽ tiếp tục kiểm tra lỗi tại hai vị trí ban đầu cho đến khi khơng cịn lỗi. Nếu cùng lúc có lỗi từ hai phía, hệ thống sẽ ưu tiên chọn trường hợp có xác suất n-lookahead cao hơn để sửa lỗi.
Ví dụ: “mùa huân hoa nở”, ngưỡng xác suất là 0.01
• Mơ hình left2right:
mùa [h] 𝑝 = 0.4212 > 0.01 Đúng chính tả
• Mơ hình right2left:
[h]n hoa nở 𝑝 = 0.0052 < 0.01 Sai chính tả