Datasets documentation
فهرس البحث
فهرس البحث
يتيح FAISS و Elasticsearch البحث عن أمثلة في مجموعة بيانات. وقد يكون ذلك مفيدًا عندما ترغب في استرجاع أمثلة محددة من مجموعة البيانات ذات الصلة بمهمة معالجة اللغة الطبيعية الخاصة بك. على سبيل المثال، إذا كنت تعمل على مهمة الإجابة على الأسئلة في نطاق مفتوح، فقد ترغب في إرجاع الأمثلة ذات الصلة بالإجابة على سؤالك فقط.
ستُظهر لك هذه الدليل كيفية بناء فهرس لمجموعتك البيانات الذي سيتيح لك البحث فيها.
FAISS
يسترجع FAISS المستندات بناءً على تشابه تمثيلاتهم المتجهية. في هذا المثال، ستقوم بتوليد التمثيلات المتجهية باستخدام نموذج DPR.
- قم بتنزيل نموذج DPR من 🤗 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")- حمّل مجموعة البيانات الخاصة بك واحسب التمثيلات المتجهية:
>>> 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()})- أنشئ الفهرس باستخدام Dataset.add_faiss_index():
>>> ds_with_embeddings.add_faiss_index(column='embeddings')- الآن يمكنك الاستعلام عن مجموعة البيانات الخاصة بك باستخدام فهرس
embeddings. حمّل مُشفِّر أسئلة DPR، وابحث عن سؤال باستخدام 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'- يمكنك الوصول إلى الفهرس باستخدام Dataset.get_index() واستخدامه للعمليات الخاصة، مثل الاستعلام عنه باستخدام
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)- عند الانتهاء من الاستعلام، احفظ الفهرس على القرص باستخدام Dataset.save_faiss_index():
>>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss')- قم بتحميله في وقت لاحق باستخدام Dataset.load_faiss_index():
>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]')
>>> ds.load_faiss_index('embeddings', 'my_index.faiss')Elasticsearch
على عكس FAISS، تسترجع Elasticsearch المستندات بناءً على التطابق الدقيق.
ابدأ تشغيل Elasticsearch على جهازك، أو راجع دليل تثبيت Elasticsearch إذا لم يكن مثبتًا لديك بالفعل.
- قم بتحميل مجموعة البيانات التي تريد فهرستها:
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')- أنشئ الفهرس باستخدام Dataset.add_elasticsearch_index():
>>> squad.add_elasticsearch_index("context", host="localhost", port="9200")- ثم يمكنك الاستعلام عن فهرس
contextباستخدام Dataset.get_nearest_examples():
>>> query = "machine"
>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10)
>>> retrieved_examples["title"][0]
'Computational_complexity_theory'- إذا كنت ترغب في إعادة استخدام الفهرس، فحدد معامل
es_index_nameعند بناء الفهرس:
>>> 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- أعد تحميله لاحقًا باسم الفهرس عند استدعاء 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)للاستخدام المتقدم لـ Elasticsearch، يمكنك تحديد إعداداتك الخاصة مع تكوين مخصص:
>>> 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)