SimilaritySearch.jl é uma biblioteca para a pesquisa de vizinhos mais próxima. Em particular, ele contém a implementação do SearchGraph, um índice de pesquisa rápido e flexível usando qualquer função métrica. Ele foi projetado para suportar multithreading na maioria de suas funções e estruturas.
O pacote fornece os seguintes índices:
ParallelExhaustiveSearch : Um índice de pesquisa de força bruta, onde cada consulta é resolvida usando todos os threads disponíveis.ExhaustiveSearch : um índice de pesquisa de força bruta, cada consulta é resolvida usando um único thread.SearchGraph : um índice de pesquisa aproximado com construção paralela.O principal conjunto de funções são:
search : resolve uma única consulta.searchbatch : resolve um conjunto de consultas.allknn : calcula o neardup : remove quase duplicatos de um conjunto de dados métricos.closestpair : calcula o par mais próximo em um conjunto de dados métricos.As definições precisas dessas funções e o conjunto completo de funções e estruturas podem ser encontradas na documentação.
Atualmente, existem vários pacotes dedicados à pesquisa de vizinhos mais próximos, por exemplo, temos RegionTrees.jl NearestNeighbors.jl JuliaNeighbors estruturas de pesquisa como árvores de KD, árvores de bola, quadtrees, octrees, BK-árvores, VP-Tree e outras estruturas multidimensionais e métricas. Essas estruturas funcionam muito bem para dados de baixa dimensão, pois foram projetados para resolver consultas exatas de similaridade.
Existem vários pacotes que realizam pesquisas aproximadas de similaridade, como Rayuela.jl usando esquemas de quantização de produtos, o invólucro da biblioteca FAISS Faiss.jl . A Biblioteca FAISS fornece implementações de alto desempenho dos esquemas de quantização de produtos e esquemas de hash sensíveis à localidade, juntamente com uma implementação de resistência industrial do índice HNSW . O NearestNeighborDescent.jl algodescentes e implementos do algoritmo de pesquisa atrás pynndescent .
O pacote SimilaritySearch.jl tenta enriquecer o ecossistema com estruturas e algoritmos de pesquisa projetados para aproveitar os sistemas de leitura multith e um recurso exclusivo de autotuning que simplifica seu uso para os profissionais. Esses recursos são implementados de maneira sucinta e eficiente devido ao dinamismo e desempenho da linguagem de programação Julia. Em relação às características de desempenho, os tempos de construção são muito reduzidos em comparação com abordagens semelhantes sem reduzir o desempenho da pesquisa ou a qualidade dos resultados.
Você pode instalar o pacote da seguinte maneira
] add SimilaritySearch . jlAlém disso, você pode executar o conjunto de testes da seguinte forma
] test SimilaritySearchPor favor, veja exemplos. Você encontrará uma lista de notebooks Jupyter e Plutão e alguns scripts que exemplificam seu uso.
Contribuições são bem -vindas. Por favor, preencha uma solicitação de tração para documentar e implementar contribuições. Para problemas, preencha um problema com as informações necessárias (veja abaixo). Se você já possui uma solução, forneça uma solicitação de tração.
Relatar problemas no pacote, fornecendo um exemplo reprodutível mínimo. Se o problema depender de dados, não se esqueça de fornecer os dados necessários para reproduzi -lo.
SearchGraph A estrutura de pesquisa principal, o SearchGraph, é um gráfico com várias características, muitas delas induzidas pelo conjunto de dados sendo indexadas. Algumas de suas limitações conhecidas estão relacionadas a essas características. Por exemplo:
O manuscrito a seguir descreve e os benchmarks do índice SearchGraph (versão do pacote 0.6 ):
@article{tellezscalable,
title={A scalable solution to the nearest neighbor search problem through local-search methods on neighbor graphs},
author={Tellez, Eric S and Ruiz, Guillermo and Chavez, Edgar and Graff, Mario},
journal={Pattern Analysis and Applications},
pages={1--15},
publisher={Springer}
}
O algoritmo atual (versão 0.8 e 0.9 ) é descrito e comparado no manuscrito a seguir:
@misc{tellez2022similarity,
title={Similarity search on neighbor's graphs with automatic Pareto optimal performance and minimum expected quality setups based on hyperparameter optimization},
author={Eric S. Tellez and Guillermo Ruiz},
year={2022},
eprint={2201.07917},
archivePrefix={arXiv},
primaryClass={cs.IR}
}
Este pacote também é descrito no Joss Paper:
Eric S. Tellez e Guillermo Ruiz.
SimilaritySearch.jl: índices de vizinhos mais próximos para Julia . Journal of Open Source Software https://doi.org/10.21105/joss.04442.
Os algoritmos desta versão são os mesmos que v0.8, mas a compatibilidade da API de interrupção:
Polyester para lidar com o multithreading em vez de threads.@Threadsallknn agora preserva as auto-referências para simplificar os algoritmos e melhorar a eficiência ( allknn na v0.8 remove as auto-referências automaticamente)Outros:
SearchGraphtimedsearchbatch Isso facilita o ajuste da estrutura SearchGraph para diferentes cargas de trabalho e aplicativos. Por exemplo,
Consulte https://github.com/sadit/similaritysearchdemos e https://github.com/sadit/similaritysearch.jl/blob/main/test/testsearchgraph.jl para exemplos de trabalho.
Introduz uma grande refatoração. Em particular, faz uso explícito de objetos de contexto para a maioria das funções. Ele também apresenta procedimentos simples de registro. No entanto, preservamos a compatibilidade em muitas funções públicas usando o uso implícito de objetos de contexto padrão.