Đừng bắt người dùng chọn chế độ: ô tìm kiếm tự đoán ý
Một từ điển nhận ba loại chữ viết có thể hoặc bắt người dùng chọn, hoặc tự suy ra. Bắt chọn thì dễ làm hơn và tệ hơn khi dùng. Đây là cách chúng tôi làm cho việc suy đoán đủ tin cậy.
KoiSpeak nhận ba loại nhập liệu trong một ô: tiếng Việt, pinyin và chữ Hán. Thiết kế hiển nhiên là một nút chuyển chế độ. Chúng tôi cố ý không làm thế, và lý do áp dụng được cho nhiều thứ ngoài từ điển.
Vì sao nút chuyển chế độ thất bại
Một nút chuyển trông vô hại. Nó tốn của người dùng một lần chạm. Nhưng nó tốn mỗi lần, và nó hỏng theo một kiểu rất cụ thể và rất bực: khi chế độ sai, bạn nhận về 0 kết quả, mà 0 kết quả trông y hệt "từ này không tồn tại".
Mô hình tư duy thật của người dùng không phải "tôi đang thực hiện một truy vấn pinyin". Nó là "cái này nghĩa là gì". Mọi thành phần giao diện chen giữa ý định đó và câu trả lời đều là ma sát, và ma sát cộng dồn trong một công cụ người ta mở bốn chục lần một ngày.
Có một quy tắc chung ẩn ở đây. Nếu hệ thống có thể tự xác định được điều gì, nó không nên hỏi người dùng. Một nút chuyển chế độ là lời thừa nhận của giao diện rằng nó không muốn làm phần việc đó.
Ba loại chữ viết tách bạch hơn vẻ ngoài
Tin tốt là chúng chiếm những vùng phần lớn không giao nhau.
Chữ Hán dễ nhận ra một cách tầm thường
Ký tự Hán nằm trong các khối Unicode đã biết, chủ yếu là CJK Unified Ideographs từ U+4E00 đến U+9FFF, cùng các phần mở rộng ở nơi khác. Nếu chuỗi nhập chứa ký tự trong các dải đó, người dùng đã gõ tiếng Trung. Đây gần như là chắc chắn chứ không phải suy đoán.
Tiếng Việt có dấu mà pinyin không dùng
Tiếng Việt viết bằng chữ Latin với bộ dấu riêng: dấu móc (ơ, ư), dấu mũ (â, ê, ô), dấu trăng (ă), chữ đ có gạch ngang, cùng các dấu thanh gồm dấu nặng (ạ) và dấu hỏi (ả).
Pinyin dùng dấu ngang, dấu sắc, dấu ca-rông và dấu huyền, và chỉ trên a, e, i, o, u, ü. Hai tập hợp gần như không chồng lấn. Một chuỗi chứa đ, ơ, ư hay dấu nặng là tiếng Việt, chấm hết.
Pinyin là một tập hợp nhỏ và đóng
Đây là phần người ta hay xem nhẹ. Tiếng Phổ thông chỉ có vài trăm âm tiết hợp lệ. zhang, xue, qiong là hợp lệ; blorp và strem thì không.
Nên bạn có thể kiểm chứng: thử tách chuỗi nhập thành các âm tiết pinyin hợp lệ. Nếu tách sạch, khả năng cao đó là pinyin. Cách này bắt được cả pinyin không dấu, vốn là thứ phần lớn người ta thật sự gõ.
Phần khó là chỗ chồng lấn
Việc nhận diện dễ ở các trường hợp rõ ràng và thú vị ở các trường hợp mập mờ. Những va chạm có thật:
- Chuỗi ngắn vừa là cái này vừa là cái kia.
mavừa là pinyin hợp lệ vừa là từ tiếng Việt hợp lệ.ba,co,cancũng vậy. - Tiếng Việt không dấu. Rất nhiều người gõ tiếng Việt không dấu, và điều đó xoá mất tín hiệu mạnh nhất của bạn.
- Tiếng Anh. Người học gõ từ tiếng Anh, mà tiếng Anh không nằm trong ba ngôn ngữ của bạn.
Cố giải quyết bằng cách thêm quy tắc là cuộc chiến thua. Bộ quy tắc dài ra, mâu thuẫn nhau, và vẫn sai.
Đừng phân loại. Hãy tìm hết rồi xếp hạng.
Thiết kế thật sự hiệu quả là thôi coi đây là bài toán phân loại.
Thay vì quyết định chuỗi nhập là gì rồi tìm trong một chỉ mục, hãy chạy truy vấn qua tất cả các cách diễn giải, rồi trộn kết quả bằng một điểm số có tính tới độ hợp lý của từng cách.
Đại khái:
- Chấm điểm từng cách diễn giải: có chứa chữ Hán không, có mang dấu riêng của tiếng Việt không, có tách được thành pinyin hợp lệ không.
- Truy vấn các chỉ mục mà những cách diễn giải đó hàm ý.
- Trộn lại, gán trọng số cho mỗi kết quả theo điểm của cách diễn giải, độ khớp chính xác, và tần suất từ.
Người dùng thấy một danh sách duy nhất. Với ma họ nhận được cả kết quả pinyin lẫn kết quả tiếng Việt, từ thông dụng lên trước, và đáp án họ muốn nằm trên màn hình dù theo hướng nào. Sự mập mờ thôi là trạng thái lỗi và trở thành một danh sách có thứ hạng.
Phân loại buộc phải đưa ra một quyết định có thể sai. Xếp hạng cho phép bạn không chắc chắn mà vẫn hữu ích. Khi hệ thống không thể chắc, hãy ưu tiên thiết kế suy biến thành "vài đáp án hợp lý" thay vì "một đáp án sai đầy tự tin".
Cái giá phải trả
Nói thật về sự đánh đổi: bạn đang chạy nhiều truy vấn hơn trên mỗi lần gõ phím. Điều đó có thật, và vì thế thiết kế này sống chết theo hiệu năng.
Những thứ khiến nó chấp nhận được:
- Cách diễn giải rẻ chạy trước. Nhận diện chữ Hán chỉ là kiểm tra dải trên vài ký tự đầu. Nếu trúng, bỏ qua toàn bộ phần còn lại.
- Chỉ mục tiền tố riêng cho từng loại chữ viết, để mỗi truy vấn đơn lẻ là một phép tra rẻ chứ không phải quét toàn bộ.
- Tần suất được nướng sẵn vào chỉ mục, để việc xếp hạng không cần thêm một lượt duyệt kết quả.
- Debounce, và huỷ truy vấn đang bay khi nội dung nhập thay đổi. Phần lớn lần gõ phím không bao giờ sinh ra một truy vấn hoàn tất.
Chỗ vẫn cần lối thoát hiểm
Tự nhận diện không nên là con đường duy nhất. Hai trường hợp thật sự cần thứ khác:
- Bạn không gõ được chữ đó chút nào. Đó là việc của nhập liệu viết tay và tra theo bộ thủ.
- Bạn muốn ép một chiều cụ thể. Thỉnh thoảng người dùng thật sự chỉ muốn Việt sang Trung. Chúng tôi có nút chọn chiều, nhưng như một tuỳ chọn ghi đè khi cần, chứ không phải một quyết định bắt buộc từ đầu.
Thứ tự đó chính là nguyên tắc. Hãy đoán tốt theo mặc định, và cho người ta sửa lại phán đoán. Chứ không phải: từ chối đoán, và bắt mọi người tự khai báo.
Bài học chung
Sản phẩm nào cũng có khoảnh khắc mà cách triển khai dễ nhất là hỏi người dùng một câu mà hệ thống lẽ ra tự trả lời được. Loại tệp. Quốc gia. Loại tiền. Chế độ tìm kiếm.
Mỗi câu đều nhỏ. Cộng lại, chúng là khác biệt giữa một công cụ người ta với tay lấy mà không cần nghĩ, và một công cụ người ta phải vận hành.