Datasets documentation
Índice de búsqueda
Índice de búsqueda
FAISS y Elasticsearch permiten buscar ejemplos en un conjunto de datos. Esto puede ser útil cuando deseas recuperar ejemplos específicos de un conjunto de datos que sean relevantes para tu tarea de NLP. Por ejemplo, si estás trabajando en una tarea de respuesta a preguntas de dominio abierto, es posible que quieras devolver solo los ejemplos que sean relevantes para responder a tu pregunta.
Esta guía te mostrará cómo construir un índice para tu conjunto de datos que te permitirá buscar en él.
FAISS
FAISS recupera documentos en función de la similitud de sus representaciones vectoriales. En este ejemplo, generará las representaciones vectoriales con el modelo DPR.
- Descargue el modelo DPR desde 🤗 Transformers:
>>> from transformers import DPRContextEncoder, DPRContextEncoderTokenizer
>>> import torch
>>> torch.set_grad_enabled(False)
>>> ctx_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
>>> ctx_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")- Cargue su conjunto de datos y calcule las representaciones vectoriales:
>>> from datasets import load_dataset
>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]')
>>> ds_with_embeddings = ds.map(lambda example: {'embeddings': ctx_encoder(**ctx_tokenizer(example["line"], return_tensors="pt"))[0][0].numpy()})- Cree el índice con Dataset.add_faiss_index():
>>> ds_with_embeddings.add_faiss_index(column='embeddings')- Ahora puedes consultar tu conjunto de datos con el índice
embeddings. Carga el codificador de preguntas DPR y busca una pregunta con Dataset.get_nearest_examples():
>>> from transformers import DPRQuestionEncoder, DPRQuestionEncoderTokenizer
>>> q_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
>>> q_tokenizer = DPRQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
>>> question = "Is it serious ?"
>>> question_embedding = q_encoder(**q_tokenizer(question, return_tensors="pt"))[0][0].numpy()
>>> scores, retrieved_examples = ds_with_embeddings.get_nearest_examples('embeddings', question_embedding, k=10)
>>> retrieved_examples["line"][0]
'_that_ serious? It is not serious at all. It’s simply a fantasy to amuse\r\n'- Puede acceder al índice con Dataset.get_index() y usarlo para operaciones especiales, por ejemplo, consultarlo usando
range_search:
>>> faiss_index = ds_with_embeddings.get_index('embeddings').faiss_index
>>> limits, distances, indices = faiss_index.range_search(x=question_embedding.reshape(1, -1), thresh=0.95)- Cuando hayas terminado de consultar, guarda el índice en disco con Dataset.save_faiss_index():
>>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss')- Recárguelo más adelante con Dataset.load_faiss_index():
>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]')
>>> ds.load_faiss_index('embeddings', 'my_index.faiss')Elasticsearch
A diferencia de FAISS, Elasticsearch recupera documentos basándose en coincidencias exactas.
Inicia Elasticsearch en tu máquina o consulta la guía de instalación de Elasticsearch si aún no lo tienes instalado.
- Cargue el conjunto de datos que desea indexar:
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')- Crea el índice con Dataset.add_elasticsearch_index():
>>> squad.add_elasticsearch_index("context", host="localhost", port="9200")- Luego puedes consultar el índice
contextcon Dataset.get_nearest_examples():
>>> query = "machine"
>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10)
>>> retrieved_examples["title"][0]
'Computational_complexity_theory'- Si desea reutilizar el índice, defina el parámetro
es_index_nameal construir el índice:
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')
>>> squad.add_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context")
>>> squad.get_index("context").es_index_name
hf_squad_val_context- Cárgalo más tarde con el nombre del índice cuando llames a Dataset.load_elasticsearch_index():
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')
>>> squad.load_elasticsearch_index("context", host="localhost", port="9200", es_index_name="hf_squad_val_context")
>>> query = "machine"
>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10)Para un uso más avanzado de Elasticsearch, puedes especificar tu propia configuración con ajustes personalizados:
>>> import elasticsearch as es
>>> import elasticsearch.helpers
>>> from elasticsearch import Elasticsearch
>>> es_client = Elasticsearch([{"host": "localhost", "port": "9200"}]) # default client
>>> es_config = {
... "settings": {
... "number_of_shards": 1,
... "analysis": {"analyzer": {"stop_standard": {"type": "standard", " stopwords": "_english_"}}},
... },
... "mappings": {"properties": {"text": {"type": "text", "analyzer": "standard", "similarity": "BM25"}}},
... } # default config
>>> es_index_name = "hf_squad_context" # name of the index in Elasticsearch
>>> squad.add_elasticsearch_index("context", es_client=es_client, es_config=es_config, es_index_name=es_index_name)