2012-11-22 33 views
12

Tôi mới đến khu vực đó và tôi tự hỏi phần lớn nhà nước-nghệ thuật là gì và nơi tôi có thể đọc về nó. Giả sử rằng tôi chỉ có một kho khóa/giá trị và tôi có khoảng cách (key1, key2) được xác định bằng cách nào đó (không chắc đó có phải là số liệu hay không, tức là nếu bất đẳng thức tam giác phải giữ luôn).cách tìm kiếm mờ trong dữ liệu lớn

Điều tôi muốn chủ yếu là chức năng tìm kiếm (khóa) trả về cho tôi tất cả các mục có khóa tới khoảng cách nhất định đến khóa tìm kiếm. Có lẽ giới hạn khoảng cách đó có thể cấu hình được. Có lẽ đây cũng chỉ là một iterator lười biếng. Có lẽ cũng có thể có một giới hạn đếm và một mục (khóa, giá trị) là với một số P xác suất trong tập hợp trả về trong đó P = 1/khoảng cách (khóa, khóa tìm kiếm) hoặc hơn (tức là, kết hợp hoàn hảo chắc chắn sẽ là trong tập hợp và kết quả trùng khớp ít nhất với xác suất cao).


Một ví dụ ứng dụng là phù hợp với vân tay trong MusicBrainz. Họ sử dụng dấu vân tay AcoustId và đã xác định this compare function. Họ sử dụng chỉ số Gre PostgreSQL và tôi đoán (mặc dù tôi chưa hiểu hết/đọc mã acoustid-server) GIN Partial Match Algorithm nhưng tôi chưa hoàn toàn hiểu rằng đó là những gì tôi yêu cầu và cách nó hoạt động.


Đối với văn bản, những gì tôi đã tìm thấy cho đến nay là sử dụng một số phonetic algorithm để đơn giản hóa lời dựa trên phát âm của họ. Ví dụ là here. Điều này chủ yếu là để phá vỡ không gian tìm kiếm xuống một không gian nhỏ hơn. Tuy nhiên, điều đó có một số hạn chế, ví dụ: nó vẫn phải là một trận đấu hoàn hảo trong không gian nhỏ hơn.

Nhưng dù sao, tôi cũng đang tìm kiếm một giải pháp chung chung hơn, nếu điều đó tồn tại.

+1

Không phải là một câu trả lời hoàn chỉnh, nhưng có cái nhìn tại VP-cây (http://en.wikipedia.org/wiki/Vp-tree và http: // stevehanov .ca/blog/index.php? id = 130). Chúng cho phép truy vấn nhanh trong không gian số liệu. –

Trả lời

10

Không có giải pháp chung (nhanh), mỗi ứng dụng sẽ cần cách tiếp cận khác nhau.

Không một trong hai ví dụ thực sự thực hiện tìm kiếm lân cận gần nhất truyền thống. AcoustID (Tôi là tác giả) chỉ tìm kiếm các kết quả khớp chính xác, nhưng nó tìm kiếm với số lượng băm rất cao với hy vọng rằng một số sẽ phù hợp. Ví dụ tìm kiếm ngữ âm sử dụng metaphone để chuyển đổi từ thành biểu diễn ngữ âm của chúng và cũng chỉ tìm kiếm các kết quả khớp chính xác.

Bạn sẽ thấy rằng nếu bạn có nhiều dữ liệu, tìm kiếm chính xác bằng cách sử dụng bảng băm lớn là điều duy nhất bạn có thể thực tế thực hiện. Vấn đề sau đó sẽ trở thành cách chuyển đổi kết hợp mờ của bạn thành tìm kiếm chính xác.

Cách tiếp cận phổ biến là sử dụng locality-sensitive hashing (LSH) với phương pháp băm thông minh, nhưng như bạn có thể thấy trong hai ví dụ, đôi khi bạn có thể tiếp cận với cách tiếp cận đơn giản hơn.

Btw, bạn đang tìm kiếm cụ thể cho tìm kiếm văn bản, cách đơn giản nhất bạn có thể thực hiện là chia đầu vào của mình thành N-grams và lập chỉ mục những mục đó. Tùy thuộc vào cách xác định hàm khoảng cách của bạn, điều đó có thể cung cấp cho bạn kết quả phù hợp với ứng cử viên mà không có quá nhiều công việc.

+0

Cảm ơn rất nhiều! Tôi đã không mong đợi để có được một câu trả lời từ bạn ở đây. :) Đó là lý do tại sao tôi yêu Internet. - Bạn có thể giới thiệu bất kỳ tài liệu nào về điều này (tìm kiếm mờ trong dữ liệu lớn nói chung, một số tổng quan) với các kết quả nghiên cứu gần đây không? – Albert

+0

Ngoài ra, một câu hỏi khác: Bạn tìm kiếm bao nhiêu biến thể của hàm băm trong AcoustId? Chỉ cần tất cả băm với Hamming khoảng cách 1 hay như vậy? – Albert

+0

Xin lỗi, tôi không biết bất kỳ tài liệu nào về điều này. Thông thường bạn chỉ cần chọn một thứ gì đó về một miền cụ thể. Về AcoustID, nó không tìm kiếm các biến thể băm, nhưng dấu vân tay là các vectơ băm, vì vậy tìm kiếm tất cả các mục trong vectơ, có một cơ hội một trong số chúng sẽ khớp chính xác. –

4

Tôi đề nghị bạn hãy xem FLANN Fast Approximate Nearest Neighbors. Tìm kiếm mờ trong dữ liệu lớn còn được gọi là gần đúng hàng xóm.

Thư viện này cung cấp cho bạn số liệu khác nhau, ví dụ: Euclidian, Hamming và các phương pháp phân cụm khác nhau: LSH hoặc k-means chẳng hạn.

Tìm kiếm luôn trong 2 giai đoạn.Trước tiên, bạn nạp hệ thống với dữ liệu để đào tạo thuật toán, điều này có khả năng tốn thời gian tùy thuộc vào dữ liệu của bạn. Tôi đã ghép thành công 13 triệu dữ liệu trong chưa đầy một phút mặc dù (sử dụng LSH).

Sau đó, đến giai đoạn tìm kiếm, rất nhanh. Bạn có thể chỉ định khoảng cách tối đa và/hoặc số lượng hàng xóm tối đa. Như Lukas nói, không có giải pháp chung tốt, mỗi tên miền sẽ có các thủ thuật để làm cho nó nhanh hơn hoặc tìm cách tốt hơn bằng cách sử dụng thuộc tính bên trong của dữ liệu bạn đang sử dụng.

Shazam sử dụng kỹ thuật đặc biệt với các phép chiếu hình học để nhanh chóng tìm thấy bài hát của bạn. Trong tầm nhìn máy tính, chúng ta thường sử dụng BOW: Bag of words, vốn xuất hiện trong quá trình truy xuất văn bản.

Nếu bạn có thể xem dữ liệu của mình dưới dạng biểu đồ, có các phương pháp khác để đối sánh gần đúng bằng lý thuyết đồ thị phổ chẳng hạn.

Hãy cho chúng tôi biết.

+0

Ngoài ra, cảm ơn rất nhiều cho các tài liệu tham khảo! Đối với bạn cùng một câu hỏi: Bạn có thể giới thiệu bất kỳ tài liệu cập nhật nào về lĩnh vực này không? – Albert

+0

Chắc chắn nó phụ thuộc vào dữ liệu của bạn. Đó là hình ảnh hoặc xử lý âm thanh? – Kikohs

+0

Tôi quan tâm đến các giải pháp chung và chủ yếu là lý thuyết đằng sau nó. Hoặc một số tài liệu mà ít nhất bao gồm hầu hết các trường hợp. Ngoài ra, FLANN trông chung chung. Tôi đoán bạn có thể sử dụng nó cho cả hình ảnh hoặc âm thanh, phải không? Ví dụ: – Albert