2009-05-19 47 views
5

Tôi cần viết mã giải pháp cho một yêu cầu nhất định và tôi muốn biết liệu có ai quen thuộc với thư viện có sẵn có thể đạt được hay không. thực hành tốt nhất. Mô tả:Thuật toán để so sánh các từ (không theo thứ tự abc)

Người dùng nhập một từ được cho là một trong nhiều tùy chọn cố định (tôi giữ các tùy chọn trong danh sách). Tôi biết đầu vào phải nằm trong một thành viên trong danh sách, nhưng vì nó là đầu vào của người dùng, anh/cô ấy có thể đã phạm sai lầm. Tôi đang tìm một thuật toán sẽ cho tôi biết từ có thể xảy ra nhất mà người dùng có ý nghĩa là gì. Tôi không có bất kỳ ngữ cảnh nào và tôi không thể buộc người dùng chọn từ danh sách (nghĩa là anh ấy phải có thể nhập từ một cách tự do và thủ công).

Ví dụ: giả sử danh sách chứa các từ "nước", "quý", "bia", "củ cải", "địa ngục", "xin chào" và "aardvark".

Các giải pháp phải giải thích cho loại lỗi khác nhau "bình thường":

  • lỗi chính tả Tốc độ (ví dụ như tăng gấp đôi nhân vật, thả nhân vật vv)
  • Bàn phím liền kề ký tự lỗi chính tả (ví dụ: "qater" cho “nước “)
  • lỗi chính tả tiếng Anh không có nguồn gốc (ví dụ: "Khu phố" cho‘quý’)
  • Và vân vân ...

Giải pháp rõ ràng là so sánh từng chữ cái và gửi "trọng số hình phạt" cho mỗi chữ cái khác nhau, chữ cái phụ và thư còn thiếu. Nhưng giải pháp này bỏ qua hàng nghìn lỗi "chuẩn" tôi chắc chắn được liệt kê ở đâu đó. Tôi chắc chắn có những phỏng đoán ở đó xử lý tất cả các trường hợp, cả cụ thể và chung chung, có thể sử dụng một cơ sở dữ liệu lớn không phù hợp tiêu chuẩn (tôi mở cho các giải pháp dữ liệu nặng).

Tôi đang viết mã bằng Python nhưng tôi coi câu hỏi này là không thuyết phục về ngôn ngữ.

Bất kỳ đề xuất/suy nghĩ nào?

Trả lời

10

Bạn muốn đọc như thế nào google thực hiện điều này: http://norvig.com/spell-correct.html

Chỉnh sửa: Một số người đã đề cập đến các thuật toán để xác định một thước đo giữa một người sử dụng từ cho trước và một từ ứng cử viên (Levenshtein, Soundex). Tuy nhiên, đây không phải là giải pháp hoàn chỉnh cho vấn đề, vì người ta cũng cần một cơ sở hạ tầng để thực hiện hiệu quả tìm kiếm lân cận gần như không phải euclide. Điều này có thể được thực hiện ví dụ: với Cây che: http://hunch.net/~jl/projects/cover_tree/cover_tree.html

2

Bạn đã xem các thuật toán so sánh bằng âm thanh ngữ âm, chẳng hạn như soundex? Nó không quá khó để tạo ra các biểu diễn soundex trong danh sách các từ của bạn, lưu trữ chúng, và sau đó nhận được một âm thanh của đầu vào của người dùng và tìm thấy kết quả gần nhất ở đó.

6

Giải pháp chung là tính Levenshtein distance giữa đầu vào và văn bản cố định của bạn. Khoảng cách Levenshtein của hai chuỗi chỉ là số hoạt động đơn giản - chèn, xóa và thay thế một ký tự đơn - bắt buộc phải chuyển một chuỗi ký tự thành chuỗi khác.

0

Mặc dù nó không thể giải quyết toàn bộ vấn đề, bạn có thể muốn xem xét sử dụng thuật toán soundex như một phần của giải pháp. Một tìm kiếm google nhanh chóng của "soundex" và "python" cho thấy một số triển khai python của thuật toán.

0

Thử tìm kiếm "khoảng cách Levenshtein" hoặc "khoảng cách chỉnh sửa".Nó đếm số lượng các hoạt động chỉnh sửa (xóa, chèn, thay đổi thư), bạn cần phải chuyển đổi một từ thành một từ khác. Đó là một thuật toán phổ biến, nhưng tùy thuộc vào vấn đề bạn có thể cần một cái gì đó đặc biệt với trọng lượng khác nhau cho các loại lỗi chính tả khác nhau.

1

Tìm thuật toán Bitap. Nó đủ điều kiện tốt cho những gì bạn muốn làm, và thậm chí đi kèm với một ví dụ mã nguồn trong Wikipedia.

1

Nếu tập dữ liệu của bạn thực sự nhỏ, chỉ cần so sánh khoảng cách Levenshtein trên tất cả các mục độc lập phải đủ. Tuy nhiên, nếu nó lớn hơn, bạn sẽ cần phải sử dụng một hệ thống lập chỉ mục tương tự BK-Tree hoặc tương tự. Bài báo tôi đã liên kết để mô tả cách tìm các kết quả phù hợp trong khoảng cách Levenshtein đã cho, nhưng nó khá đơn giản để thích ứng với các tìm kiếm lân cận gần nhất (và để lại như một bài tập cho người đọc;).

Các vấn đề liên quan