Bỏ qua để đến nội dung
Search & RAG

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ạiVí dụBản chấtCách chữa đúng
1. Mất dấumật khẩumat khauphép biến đổi hệ thống, người dùng cố ýbỏ dấu ở cả index và query
2. Sai dấu / sai âmkhẩukhảu, xinsinlỗi thật, khoảng cách 1fuzzy k=1, hoặc trigram
3. Teencode / viết tắtko, kkhông; dcđượctừ vựng riêngtừ điển ánh xạ, không phải fuzzy
4. Gõ trượt phímmậtmậtt, mtậlỗi ngẫu nhiênDamerau 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ẩumat khau:

mật khẩu
m ậ t k h ẩ u
↓ ↓
m a t k h a u ậ→a , ẩ→a = 2 phép thay

Hai 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 khaumậ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ạ sập về một term. Số đo trên golden set của cẩm nang (Tầng 0):

indextruy vấnnDCG@5
có dấucó dấu0,787
có dấukhông dấu0,665
bỏ dấubấ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. k cũng là “nghìn” (50k), là biến số, là hạng k. Ánh xạ mù k → không sẽ 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ự.

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ật gõ thành masr t / matj — chuỗi ký tự trung gian rò ra.
  • Chữ thừa ở cuối: khoas (chưa kịp chuyển thành khoá).

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.

Truy vấn của bạn trông thế nàoLàm gì
Phần lớn không dấuIndex bỏ dấu (hoặc index cả hai field). Xong. Chưa cần fuzzy
Có dấu nhưng sai dấufuzzy k=1 trên field đã bỏ dấu — bỏ dấu trước đã gộp phần lớn nhiễu
Nhiều teencodeTừ điển ánh xạ ở phía truy vấn
Chứa mã lỗi, SKU, sốTắt fuzzy cho field đó. E2003E2004 (3.7)
Diễn đạt khác hẳn từ trong tài liệuKhông phải lỗi chính tả — đây là vocabulary mismatch, cần embedding (Tầng 1)
Phần 3 — Nền tảng kỹ thuật