Datasets documentation

Arama dizini

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Arama dizini

FAISS ve Elasticsearch, bir veri kümesindeki örneklerin aranmasını sağlar. Bu, NLP görevinizle ilgili belirli örnekleri bir veri kümesinden geri getirmek istediğinizde faydalı olabilir. Örneğin, Açık Alan Soru Cevaplama (Open Domain Question Answering) görevi üzerinde çalışıyorsanız, sorunuzun cevabıyla ilgili örnekleri döndürmek isteyebilirsiniz.

Bu kılavuz, verisetinizi aramanıza olanak tanıyacak bir indeks oluşturmanızı gösterir.

FAISS

FAISS, belgelerin vektör temsillerinin benzerliğine dayanarak belgeleri alır. Bu örnekte, vektör temsillerini DPR modeliyle oluşturacaksınız.

  1. DPR modelini 🤗 Transformers'tan indirin:
>>> 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")
  1. Veri setinizi yükleyin ve vektör temsillerini hesaplayın:
>>> 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()})
  1. Dizin oluşturmak için Dataset.add_faiss_index() kullanın:
>>> ds_with_embeddings.add_faiss_index(column='embeddings')
  1. Artık veri setinizi embeddings diziniyle sorgulayabilirsiniz. DPR Question Encoder'ı yükleyin ve Dataset.get_nearest_examples() ile bir soru arayın:
>>> 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'
  1. Dizinine Dataset.get_index() ile erişebilir ve onu özel işlemler için kullanabilirsiniz, örneğin range_search kullanarak sorgulayabilirsiniz:
>>> 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)
  1. Sorgulama işlemleriniz bittiğinde, indeksi Dataset.save_faiss_index() ile diske kaydedin:
>>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss')
  1. Daha sonra Dataset.load_faiss_index() ile yeniden yükleyin:
>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]')
>>> ds.load_faiss_index('embeddings', 'my_index.faiss')

Elasticsearch

FAISS'in aksine, Elasticsearch belgeleri tam eşleşmelere dayalı olarak alır.

Elasticsearch'i makinenizde başlatın veya daha önce kurmadıysanız Elasticsearch kurulum kılavuzuna bakın.

  1. Dizinlemek istediğiniz veri setini yükleyin:
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')
  1. Dataset.add_elasticsearch_index() ile indeksi oluşturun:
>>> squad.add_elasticsearch_index("context", host="localhost", port="9200")
  1. Ardından context dizinini Dataset.get_nearest_examples() ile sorgulayabilirsiniz:
>>> query = "machine"
>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10)
>>> retrieved_examples["title"][0]
'Computational_complexity_theory'
  1. Dizinyi yeniden kullanmak istiyorsanız, dizini oluştururken es_index_name parametresini tanımlayın:
>>> 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
  1. Daha sonra Dataset.load_elasticsearch_index() çağrısında indeks adıyla yeniden yükleyin:
>>> 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)

Daha gelişmiş Elasticsearch kullanımı için, özel ayarlarla kendi yapılandırmanızı belirleyebilirsiniz:

>>> 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)
Update on GitHub