Một cách tiếp cận để tạo đề xuất mà tôi đã sử dụng thành công nhưng chưa từng thấy được mô tả ở đâu là tính toán trước các đề xuất (khi xây dựng từ điển) bằng cách sử dụng các hàm băm "xấu".
Ý tưởng là xem xét các loại lỗi chính tả mà mọi người mắc phải và thiết kế các hàm băm có thể gán chính tả sai cho cùng một nhóm với chính tả đúng của nó.
Ví dụ, một sai lầm phổ biến là sử dụng các nguyên âm sai, như definate thay vì nhất định . Vì vậy, bạn thiết kế một hàm băm coi tất cả các nguyên âm là cùng một chữ cái. Một cách dễ dàng để làm điều đó là đầu tiên "chuẩn hóa" từ đầu vào và sau đó đặt kết quả chuẩn hóa thông qua một hàm băm thông thường. Trong ví dụ này, hàm chuẩn hóa có thể bỏ tất cả các nguyên âm, vì vậy definite
sẽ trở thành dfnt
. Từ "chuẩn hóa" sau đó được băm bằng một hàm băm điển hình.
Chèn tất cả các từ trong từ điển của bạn vào một chỉ mục bổ trợ (bảng băm) bằng cách sử dụng hàm băm đặc biệt này. Các nhóm trong bảng này sẽ có danh sách xung đột dài vì hàm băm là "xấu", nhưng các danh sách xung đột đó về cơ bản là các đề xuất được tính toán trước.
Bây giờ, khi bạn tìm thấy một từ sai chính tả, bạn tra cứu danh sách va chạm cho nhóm mà lỗi chính tả ánh xạ tới trong các chỉ mục phụ trợ. Ta da: Bạn có một danh sách gợi ý! Tất cả những gì bạn phải làm là xếp hạng các từ trên đó.
Trong thực tế, bạn sẽ cần một vài chỉ mục bổ trợ với các hàm băm khác để xử lý các loại lỗi khác, như các chữ cái chuyển vị, chữ cái đơn / chữ đôi và thậm chí là một chỉ mục đơn giản giống như Soundex để phát hiện lỗi chính tả ngữ âm. Trong thực tế, tôi nhận thấy những cách phát âm đơn giản sẽ đi một chặng đường dài và về cơ bản, một số cách phát âm đã lỗi thời được thiết kế để tìm những lỗi chính tả tầm thường.
Vì vậy, bây giờ bạn tìm kiếm lỗi chính tả trong mỗi chỉ mục phụ và nối danh sách va chạm trước khi xếp hạng.
Hãy nhớ danh sách va chạm chỉ chứa các từ có trong từ điển. Với các phương pháp cố gắng tạo ra các cách viết thay thế (như trong bài viết của Peter Norvig), bạn có thể nhận được (hàng chục) nghìn từ khóa mà trước tiên bạn phải lọc theo từ điển. Với cách tiếp cận được tính toán trước, bạn có thể nhận được vài trăm ứng cử viên và bạn biết rằng tất cả họ đều viết đúng chính tả, vì vậy bạn có thể bỏ qua thẳng để xếp hạng.
Cập nhật : Kể từ đó, tôi đã tìm thấy một mô tả thuật toán tương tự như điều này, Tìm kiếm Phân tán FAROO . Đây vẫn là một tìm kiếm giới hạn khoảng cách chỉnh sửa, nhưng nó rất nhanh vì bước tính toán trước hoạt động giống như ý tưởng "hàm băm xấu" của tôi. FAROO chỉ sử dụng một khái niệm hạn chế về một hàm băm xấu.