0 Daumen
23 Aufrufe

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/

Gefragt von

Bitte logge dich ein oder registriere dich, um die Frage zu beantworten.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage sofort und kostenfrei

x
Made by a lovely community
...