Ich versuche eine Methode der Einlage von Sätzen anzuwenden, [InferSent] [1], die semantische Darstellungen von Sätzen liefert. Es wird in den Inferenzdaten natürlicher Sprache trainiert und verallgemeinert sich in vielen verschiedenen Aufgaben.
Der Prozess ist wie folgt:
Erstellen Sie ein Vokabular aus den Trainingsdaten und verwenden Sie dieses Vokabular, um das betreffende Modell zu trainieren. Sobald das Modell trainiert ist, geben Sie einen Satz als Eingabe für die Encoderfunktion an, die unabhängig von der Anzahl der Wörter im Satz einen Vektor mit 4096 Dimensionen zurückgibt.
In meinem Fall gibt es jedoch 130319 Fragen zu kodieren, und daher nimmt die Funktion des Kodierers viel Zeit in Anspruch. Ich frage mich, ob es irgendeinen Weg gibt, es zu beschleunigen.
# Load model
from models import InferSent
MODEL_PATH = '../new_models/infersent1.pkl'
params_model = {'bsize': 64, 'word_emb_dim': 300, 'enc_lstm_dim': 2048,
'pool_type': 'max', 'dpout_model': 0.0, 'version': 1}
model = InferSent(params_model)
model.load_state_dict(torch.load('InferSent/encoder/infersent1.pkl'))
W2V_PATH = 'InferSent/dataset/GloVe/glove.840B.300d.txt'
model.set_w2v_path(W2V_PATH)
model.build_vocab_k_words(K=100000)
# encode questions
questions = list(df["question"])
Das ist, wenn ich code. Ich habe einen Timer für die Prognosen hinzugefügt:
import time
t0 = time.time()
for i in range(len(questions)):
if i%1000 == 0:
t1 = time.time()
total = t1-t0
print("encoding number ",i," time since beginning:", total)
dict_embeddings[questions[i]] = model.encode([questions[i]], tokenize=True)
Dann gibt es mir in den ersten 1000 Iterationen:
encoding number 0 time since beginning: 0.00016880035400390625
encoding number 1000 time since beginning: 228.6366264820099
Wenn wir gut von Sekunde sprechen, mit 130000 Iterationen, schätze ich die Zeit für 8 Stunden 14 Minuten. Was wirklich zu lang ist. Deshalb versucht man diesen Zyklus zu optimieren.
Reproduzierbares Beispiel
Um ein reproduzierbares Beispiel zu geben, hier ist, wie ich zu den "Sätzen" komme, die ich verwende:
# load json file
train = pd.read_json("data/train-v2.0.json")
# add data to a dataframe
contexts = []
questions = []
answers_text = []
answers_start = []
for i in range(train.shape[0]):
topic = train.iloc[i,0]['paragraphs']
for sub_para in topic:
for q_a in sub_para['qas']:
questions.append(q_a['question'])
if q_a['answers']:
answers_start.append(q_a['answers'][0]['answer_start'])
answers_text.append(q_a['answers'][0]['text'])
elif q_a['plausible_answers']:
answers_start.append(q_a['plausible_answers'][0]['answer_start'])
answers_text.append(q_a['plausible_answers'][0]['text'])
contexts.append(sub_para['context'])
df = pd.DataFrame({"context":contexts, "question": questions, "answer_start": answers_start, "text": answers_text})
# load data in csv file
df.to_csv("data/train.csv", index = None)
# Create dictionary of sentence embeddings for faster computation
paras = list(df["context"].drop_duplicates().reset_index(drop= True))
blob = TextBlob(" ".join(paras))
sentences = [item.raw for item in blob.sentences]
Sie finden die Daten auf [der Stanford-Frage-Antwort-Datensatz github] [2].
[1]: https://github.com/facebookresearch/InferSent/blob/master/encoder/demo.ipynb
[2]: https://rajpurkar.github.io/SQuAD-explorer/