Как сохранить выходные векторы предложения-Берта в файл?
Я использую Bert, чтобы получить сходство между многословными словами. Вот мой код, который я использовал для встраивания:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-large-uncased-whole-word-masking')
words = [
"Artificial intelligence",
"Data mining",
"Political history",
"Literature book"]
У меня также есть набор данных, содержащий 540000 других слов.
Vocabs = [
"Winter flooding",
"Cholesterol diet", ....]
проблема в том, что когда я хочу встроить словари в векторы, это требует времени навсегда.
words_embeddings = model.encode(words)
Vocabs_embeddings = model.encode(Vocabs)
есть ли способ сделать это быстрее? или я хочу встроить словари в циклы for и сохранить выходные векторы в файл, чтобы мне не приходилось вставлять 540000 слов каждый раз, когда мне это нужно. есть ли способ сохранить вложения в файл и использовать его снова? Я буду очень признателен вам за то, что вы потратили время, пытаясь мне помочь.
1 ответ
Вы можете подобным образом обработать свой корпус и вложения, вы также можете вместо этого выбрать словарь или записать их в файл в любом другом формате, который вы предпочитаете.
import pickle
with open("my-embeddings.pkl", "wb") as fOut:
pickle.dump({'sentences': words, 'embeddings': word_embeddings},fOut)
Или, в более общем смысле, как показано ниже, поэтому вы кодируете, когда вложения не существуют, но после этого каждый раз, когда они вам нужны, вы загружаете их из файла, вместо того, чтобы перекодировать свой корпус:
if not os.path.exists(embedding_cache_path):
# read your corpus etc
corpus_sentences = ...
print("Encoding the corpus. This might take a while")
corpus_embeddings = model.encode(corpus_sentences, show_progress_bar=True, convert_to_numpy=True)
corpus_embeddings = corpus_embeddings / np.linalg.norm(corpus_embeddings, axis=1, keepdims=True)
print("Storing file on disc")
with open(embedding_cache_path, "wb") as fOut:
pickle.dump({'sentences': corpus_sentences, 'embeddings': corpus_embeddings}, fOut)
else:
print("Loading pre-computed embeddings from disc")
with open(embedding_cache_path, "rb") as fIn:
cache_data = pickle.load(fIn)
corpus_sentences = cache_data['sentences']
corpus_embeddings = cache_data['embeddings']