Tôi đang tìm thư viện JavaScript tìm kiếm mờ để lọc một mảng. Tôi đã thử sử dụng fuzzyset.js và fuse.js , nhưng kết quả thật tệ (có những bản demo bạn có thể thử trên các trang được liên kết).
Sau khi thực hiện một số đọc về khoảng cách Levenshtein, tôi thấy nó là một con số gần đúng kém về những gì người dùng đang tìm kiếm khi họ nhập. Đối với những người không biết, hệ thống sẽ tính toán số lần chèn , xóa và thay thế cần thiết để làm cho hai chuỗi khớp nhau.
Một lỗ hổng rõ ràng, được sửa trong mô hình Levenshtein-Demerau, là cả blub và boob đều được coi là tương tự như bóng đèn (mỗi loại yêu cầu hai thay thế). Tuy nhiên, rõ ràng là bóng đèn đó giống với blub hơn là boob , và mô hình tôi vừa đề cập nhận ra điều đó bằng cách cho phép chuyển vị .
Tôi muốn sử dụng điều này trong ngữ cảnh hoàn thành văn bản, vì vậy nếu tôi có một mảng ['international', 'splint', 'tinder']
và truy vấn của tôi là int , tôi nghĩ quốc tế nên xếp hạng cao hơn splint , mặc dù trước đó có điểm (cao hơn = tệ hơn) là 10 so với 3 của sau.
Vì vậy, những gì tôi đang tìm kiếm (và sẽ tạo nếu nó không tồn tại), là một thư viện thực hiện những việc sau:
- Trọng số các thao tác văn bản khác nhau
- Trọng số của mỗi thao tác khác nhau tùy thuộc vào vị trí chúng xuất hiện trong một từ (thao tác sớm tốn kém hơn thao tác muộn)
- Trả về danh sách kết quả được sắp xếp theo mức độ liên quan
Có ai đi qua bất cứ điều gì như thế này? Tôi nhận ra rằng StackOverflow không phải là nơi để yêu cầu các đề xuất phần mềm, nhưng ẩn ý (không còn nữa!) Ở trên là: tôi đang nghĩ về điều này có đúng cách không?
Biên tập
Tôi đã tìm thấy một bài báo tốt (pdf) về chủ đề này. Một số ghi chú và đoạn trích:
Các hàm chỉnh sửa khoảng cách liên kết ấn định chi phí tương đối thấp hơn cho một chuỗi các lần chèn hoặc xóa
hàm khoảng cách Monger-Elkan (Monge & Elkan 1996), là một biến thể affine của hàm khoảng cách Smith-Waterman (Durban et al. 1998) với các tham số chi phí cụ thể
Đối với khoảng cách Smith-Waterman (wikipedia) , "Thay vì xem xét chuỗi tổng, thuật toán Smith – Waterman so sánh các đoạn của tất cả các độ dài có thể và tối ưu hóa độ đo tương tự." Đó là cách tiếp cận n-gram.
Một số liệu tương tự rộng rãi, không dựa trên mô hình khoảng cách chỉnh sửa, là số liệu Jaro (Jaro 1995; 1989; Winkler 1999). Trong tài liệu liên kết bản ghi, kết quả tốt đã thu được khi sử dụng các biến thể của phương pháp này, dựa trên số lượng và thứ tự của các ký tự chung giữa hai chuỗi.
Một biến thể của điều này do Winkler (1999) cũng sử dụng độ dài P của tiền tố chung dài nhất
(dường như chủ yếu dành cho các chuỗi ngắn)
Đối với mục đích hoàn thành văn bản, các phương pháp Monger-Elkan và Jaro-Winkler dường như có ý nghĩa nhất. Sự bổ sung của Winkler vào chỉ số Jaro có hiệu quả làm tăng trọng số của các từ bắt đầu. Và khía cạnh liên kết của Monger-Elkan có nghĩa là sự cần thiết phải hoàn thành một từ (đơn giản là một chuỗi các phép bổ sung) sẽ không làm mất tác dụng của nó quá nhiều.
Phần kết luận:
xếp hạng TFIDF hoạt động tốt nhất trong số một số chỉ số khoảng cách dựa trên mã thông báo và chỉ số khoảng cách chỉnh sửa affine-gap do Monge và Elkan đề xuất hoạt động tốt nhất trong số một số chỉ số khoảng cách chỉnh sửa chuỗi. Một thước đo khoảng cách tốt đáng ngạc nhiên là một sơ đồ heuristic nhanh, được đề xuất bởi Jaro và sau đó được Winkler mở rộng. Điều này hoạt động gần giống như lược đồ Monge-Elkan, nhưng là một thứ tự cường độ nhanh hơn. Một cách đơn giản để kết hợp phương pháp TFIDF và Jaro-Winkler là thay thế các khớp mã thông báo chính xác được sử dụng trong TFIDF bằng các khớp mã thông báo gần đúng dựa trên lược đồ Jaro-Winkler. Sự kết hợp này hoạt động tốt hơn một chút so với Jaro-Winkler hoặc TFIDF ở mức trung bình, và đôi khi hoạt động tốt hơn nhiều. Nó cũng gần về hiệu suất với sự kết hợp đã học của một số số liệu tốt nhất được xem xét trong bài báo này.
krole
không trở lại Final Fantasy V: Krile
, mặc dù tôi rất muốn. Nó yêu cầu tất cả các ký tự trong truy vấn phải có cùng thứ tự trong kết quả, điều này khá thiển cận. Có vẻ như cách duy nhất để tìm kiếm mờ tốt là có một cơ sở dữ liệu về các lỗi chính tả phổ biến.