2009-05-19 15 views
12

Tôi gặp sự cố nhỏ với ứng dụng dữ liệu lõi mà hiện tại tôi đang viết. Tôi có hai mô hình differents, bối cảnh và các cửa hàng phù hợp. Một là cho dữ liệu ứng dụng của tôi, một trong những khác là cho một trang web với infos có liên quan với tôi.Kết hợp một chuỗi gần đúng trong kho dữ liệu chính

Hầu hết thời gian, tôi khớp chính xác một bản ghi từ ứng dụng của tôi với một bản ghi khác từ nguồn khác. Đôi khi tuy nhiên, tôi phải dự phòng để phù hợp chuỗi mờ để liên kết hai bản ghi. Tôi đang cố gắng phù hợp với tiêu đề bài hát. Tiêu đề địa phương của tôi có thể là (được tạo thành) "The French Idealist is in your pensée" và tiêu đề bài hát từ xa có thể là "01 - 10 - French idealist in in you're pensee, The (dub remix, feat. DJ Objective-C)"

Tôi chặn tìm kiếm chồng, Google, tài liệu ca cao và tôi không thể tìm thấy câu trả lời rõ ràng về cách thực hiện đối sánh mờ trong những trường hợp này. Chuỗi của tôi có thể bắt đầu bằng bất kỳ thứ gì, có một loạt các ký tự đặc biệt, thường kết thúc bằng các ký tự ngẫu nhiên hoặc bị bỏ qua.

Regexp sẽ không thực hiện, cũng như NSPredicates, Soundex không hoạt động tốt với tên nước ngoài, và có lẽ Levenshtein sẽ không đủ (hoặc sẽ không?).

Tôi đang tìm kiếm một tiêu đề trong một tập hợp khoảng một chục trận đấu tiềm năng, nhưng tôi hava để thực hiện thao tác này khá nhiều. Độ chính xác 100% không phải là mục tiêu.

Tôi đã nghĩ đến việc xóa các từ bị bỏ qua, trích xuất các từ khóa (trong ví dụ này là "french, idealist, pensée"), nối chúng, và sau đó sử dụng khoảng cách Levenshtein (các từ trong tiêu đề bài hát phải theo cùng thứ tự).

Trong trường hợp đặc biệt của tôi, nó có hoạt động không? Tiêu chuẩn của ngành về vấn đề này là gì (tôi không thể là người duy nhất trên thế giới muốn kết hợp các tên bài hát hơi khác nhau) Core Data, Cocoa hay Objective-C có thể giúp tôi không?

Thanks a lot.

Trả lời

3

Bạn muốn tìm kiếm của bạn không nhạy cảm với dấu cách để khớp với 'é' trong pensée và 'e' trong pensee. Bạn nhận được điều này bằng cách thêm [d] sau thuộc tính. Giống như vậy:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@)", yourSongSubstring];
Chữ 'c' trong [cd] dành cho trường hợp không nhạy cảm.

Vì chuỗi của bạn có thể xuất hiện theo bất kỳ thứ tự nào trong chuỗi bạn đang tìm kiếm, bạn có thể mã hóa chuỗi tìm kiếm của mình ([... componentsByString: @ ""]) rồi tạo một vị từ như

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@) and (songTitle like[cd] %@)", songToken1, songToken2];
Cú pháp đó để kết hợp các vị từ trên có thể được tắt, đi từ bộ nhớ.

+0

Vâng, trước tiên tôi đã thử một biến thể của điều này và khi tôi phân tích cú pháp dữ liệu thế giới thực, nó không hoạt động. Hầu hết thời gian, vấn đề không phải là dấu phụ hoặc trường hợp nhưng trong sự khác biệt rõ ràng được đánh vần (như trong "Backstreet girl" vs "Back Street Girl"). Giải pháp này cũng phụ thuộc nhiều vào bước trước, mã thông báo, điều này thực sự khó cho miền "từ có thể xuất hiện trong tiêu đề bài hát" – damdamdam

2

Tôi tin rằng công cụ bạn muốn sử dụng ở đây là SearchKit. Tôi nói rằng như thể tôi vừa mới làm công việc của bạn dễ dàng .... tôi chưa có, nhưng nó cần có những công cụ bạn cần để thành công ở đây. LNC vẫn cung cấp miễn phí SearchKit Podcast (rất đẹp).

Mỗi bản nhạc sẽ là tài liệu trong trường hợp này và bạn cần tìm ra cách tốt để lập chỉ mục chúng với số nhận dạng có thể được sử dụng để tìm chúng. Sau đó, bạn có thể tải chúng lên bằng siêu dữ liệu và tìm kiếm chúng. Có lẽ việc đặt tiêu đề "trong" tài liệu sẽ hữu ích ở đây để tạo thuận lợi cho việc sử dụng Tìm kiếm Tương tự (kSKSearchOptionFindSimilar). Điều đó có thể hoặc có thể không hoạt động tốt.

Câu hỏi bạn đã hỏi là tốt nhất, nhưng chắc chắn không có tiêu chuẩn công nghiệp cho nó bởi vì bất kỳ ai giải quyết tốt vấn đề này (nghĩa là mọi công cụ tìm kiếm chính) đều giữ bí mật thuật toán của họ. Đây là một vấn đề khó khăn; không ai sẵn sàng cho câu trả lời của họ.

+0

SearchKit. Tôi hoàn toàn quên về API này. Tôi nhìn rất chăm chỉ vào tài liệu, tôi thấy ngay lập tức sử dụng trong ứng dụng của tôi cho nó, nhưng tôi nghĩ rằng đó là cách quá tham gia chỉ để appoximate một trận đấu giữa một chuỗi và một chuỗi khác. – damdamdam

1

Xem xét q-grams, là các chiều dài có chiều dài q (Gravano et al., 2001).

Bạn có thể, đối với hai chuỗi s1 và s2, xác định cho mỗi q gam của s1 tương ứng với gam-gam của s2 với khoảng cách chỉnh sửa nhỏ nhất. Sau đó, thêm tất cả những khoảng cách đó và bạn kết thúc với một số liệu rất mạnh mẽ để hoán vị từ và các ký tự phụ.

Nói chung, q phải được điều chỉnh cho miền sự cố của bạn (thử nghiệm với q = 3, 4, 5 ...).

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