3.10 Lỗi chính tả tiếng Việt: bốn loại, bốn cách chữa
Đây là mục quan trọng nhất của Phần 3 nếu sản phẩm của bạn phục vụ người Việt. Lý do: phần lớn “lỗi gõ” tiếng Việt không phải lỗi ngẫu nhiên — chúng là những phép biến đổi có quy luật, và fuzzy search là công cụ sai cho việc có quy luật.
| Loại | Ví dụ | Bản chất | Cách chữa đúng |
|---|---|---|---|
| 1. Mất dấu | mật khẩu → mat khau | phép biến đổi hệ thống, người dùng cố ý | bỏ dấu ở cả index và query |
| 2. Sai dấu / sai âm | khẩu → khảu, xin → sin | lỗi thật, khoảng cách 1 | fuzzy k=1, hoặc trigram |
| 3. Teencode / viết tắt | ko, k → không; dc → được | từ vựng riêng | từ điển ánh xạ, không phải fuzzy |
| 4. Gõ trượt phím | mật → mậtt, mtậ | lỗi ngẫu nhiên | Damerau k=1 |
Vì sao mất dấu không chữa được bằng fuzzy
Phần tiêu đề “Vì sao mất dấu không chữa được bằng fuzzy”Đếm số phép sửa giữa mật khẩu và mat khau:
mật khẩum ậ t k h ẩ u ↓ ↓m a t k h a u ậ→a , ẩ→a = 2 phép thayHai từ là 2 phép sửa. Một câu 6 từ mất dấu dễ dàng lên 5–8 phép sửa — vượt xa
giới hạn fuzziness ≤ 2 của Elasticsearch, và ở mức đó thì ngưỡng trigram cũng đã
bỏ qua từ lâu. Fuzzy không cứu được truy vấn mất dấu. Nó chỉ tốn CPU rồi trả về
rỗng.
Cách chữa đúng là chuẩn hoá: bỏ dấu ở cả hai phía (index và truy vấn) thì mat khau
và mật khẩu trở thành cùng một chuỗi, khoảng cách 0, chi phí truy vấn bằng 0.
Cái giá của việc bỏ dấu — và điểm hoà vốn
Phần tiêu đề “Cái giá của việc bỏ dấu — và điểm hoà vốn”Bỏ dấu làm mất thông tin: mà, má, mã, mả, mạ sập về một term. Số đo trên
golden set của cẩm nang (Tầng 0):
| index | truy vấn | nDCG@5 |
|---|---|---|
| có dấu | có dấu | 0,787 |
| có dấu | không dấu | 0,665 |
| bỏ dấu | bất kỳ | 0,766 |
Gọi p là tỷ lệ truy vấn thật không có dấu. Index bỏ dấu tốt hơn khi:
0,787 − 0,122p < 0,766 → p > ~17%Nên áp dụng vào AI Agent: đo p trên log truy vấn thật — đó là một câu SQL, và nó quyết định thẳng một lựa chọn kiến trúc. Trên hầu hết sản phẩm tiêu dùng Việt Nam, p vượt 17% khá dễ dàng.
Cách tốt nhất, nếu chịu được chi phí index gấp đôi: index cả hai field —
title (có dấu) và title_nodiacritics — rồi cộng điểm cả hai, trọng số field có
dấu cao hơn. Truy vấn có dấu ăn điểm cả hai; truy vấn không dấu vẫn tìm ra. Không
phải chọn một bên.
Teencode: từ điển, không phải thuật toán
Phần tiêu đề “Teencode: từ điển, không phải thuật toán”ko, hok, k, khong, khôg đều là không. Không có phép biến đổi hình thức nào
gộp được chúng — chỉ có bảng ánh xạ, viết tay, sắp theo tần suất trong log của bạn.
Hai lưu ý:
- Chỉ ánh xạ ở phía truy vấn, đừng sửa nội dung tài liệu.
- Cảnh giác với từ ngắn.
kcũng là “nghìn” (50k), là biến số, là hạngk. Ánh xạ mùk → khôngsẽ làm hỏng truy vấn về giá. Ánh xạ có điều kiện ngữ cảnh, hoặc bỏ hẳn những trường hợp một ký tự.
Telex/VNI: lỗi có cấu trúc bàn phím
Phần tiêu đề “Telex/VNI: lỗi có cấu trúc bàn phím”Người Việt gõ dấu bằng phím thường (aa→â, as→á, af→à). Kéo theo hai loại lỗi
rất đặc trưng:
- Dấu lạc chỗ:
mậtgõ thànhmasr t/matj— chuỗi ký tự trung gian rò ra. - Chữ thừa ở cuối:
khoas(chưa kịp chuyển thànhkhoá).
Nếu log của bạn có nhiều loại này, một bước “thử diễn giải chuỗi theo Telex” ở phía truy vấn rẻ hơn nhiều so với fuzzy — vì nó là phép biến đổi xác định, không phải tìm kiếm.
Bảng quyết định
Phần tiêu đề “Bảng quyết định”| Truy vấn của bạn trông thế nào | Làm gì |
|---|---|
| Phần lớn không dấu | Index bỏ dấu (hoặc index cả hai field). Xong. Chưa cần fuzzy |
| Có dấu nhưng sai dấu | fuzzy k=1 trên field đã bỏ dấu — bỏ dấu trước đã gộp phần lớn nhiễu |
| Nhiều teencode | Từ điển ánh xạ ở phía truy vấn |
| Chứa mã lỗi, SKU, số | Tắt fuzzy cho field đó. E2003 ≠ E2004 (3.7) |
| Diễn đạt khác hẳn từ trong tài liệu | Không phải lỗi chính tả — đây là vocabulary mismatch, cần embedding (Tầng 1) |