Datasets documentation
Chỉ mục tìm kiếm
Chỉ mục tìm kiếm
FAISS và Elasticsearch cho phép tìm kiếm các ví dụ trong một tập dữ liệu. Điều này có thể hữu ích khi bạn muốn truy xuất các ví dụ cụ thể từ tập dữ liệu có liên quan đến tác vụ NLP của mình. Ví dụ, nếu bạn đang làm việc với tác vụ Trả lời Câu hỏi Mở (Open Domain Question Answering), bạn có thể chỉ muốn trả về các ví dụ có liên quan đến việc trả lời câu hỏi của mình.
Hướng dẫn này sẽ cho bạn thấy cách xây dựng một chỉ mục cho bộ dữ liệu của bạn, cho phép bạn tìm kiếm trong đó.
FAISS
FAISS truy xuất tài liệu dựa trên độ tương tự của các biểu diễn vector của chúng. Trong ví dụ này, bạn sẽ tạo ra các biểu diễn vector bằng mô hình DPR.
- Tải mô hình DPR từ 🤗 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")- Tải bộ dữ liệu của bạn và tính toán các biểu diễn vector:
>>> 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()})- Tạo chỉ mục bằng Dataset.add_faiss_index():
>>> ds_with_embeddings.add_faiss_index(column='embeddings')- Bây giờ bạn có thể truy vấn bộ dữ liệu của mình bằng chỉ mục
embeddings. Tải bộ mã hóa câu hỏi DPR và tìm kiếm một câu hỏi bằng 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'- Bạn có thể truy cập chỉ mục bằng Dataset.get_index() và sử dụng nó cho các thao tác đặc biệt, ví dụ như truy vấn bằng
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)- Khi bạn hoàn tất truy vấn, hãy lưu chỉ mục trên đĩa bằng Dataset.save_faiss_index():
>>> ds_with_embeddings.save_faiss_index('embeddings', 'my_index.faiss')- Tải lại nó vào thời điểm sau bằng Dataset.load_faiss_index():
>>> ds = load_dataset('community-datasets/crime_and_punish', split='train[:100]')
>>> ds.load_faiss_index('embeddings', 'my_index.faiss')Elasticsearch
Khác với FAISS, Elasticsearch truy xuất tài liệu dựa trên sự khớp chính xác.
Khởi động Elasticsearch trên máy của bạn, hoặc xem hướng dẫn cài đặt Elasticsearch nếu bạn chưa cài đặt.
- Tải bộ dữ liệu mà bạn muốn lập chỉ mục:
>>> from datasets import load_dataset
>>> squad = load_dataset('rajpurkar/squad', split='validation')- Xây dựng chỉ mục bằng Dataset.add_elasticsearch_index():
>>> squad.add_elasticsearch_index("context", host="localhost", port="9200")- Sau đó, bạn có thể truy vấn chỉ mục
contextbằng Dataset.get_nearest_examples():
>>> query = "machine"
>>> scores, retrieved_examples = squad.get_nearest_examples("context", query, k=10)
>>> retrieved_examples["title"][0]
'Computational_complexity_theory'- Nếu bạn muốn tái sử dụng chỉ mục, hãy xác định tham số
es_index_namekhi bạn xây dựng chỉ mục:
>>> 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- Tải lại nó sau đó bằng tên index khi bạn gọi 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)Để sử dụng Elasticsearch nâng cao hơn, bạn có thể chỉ định cấu hình của riêng mình với các cài đặt tùy chỉnh:
>>> 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)