Быстрое извлечение больших пространственных векторов в Python

Я пытаюсь извлечь некоторые векторы слов из модели на основе трансформатора. Шаги:

  1. Запустите текст через конвейер, используя .
  2. Разбейте текст на предложения (для отдельной классификации по бинарным категориям).
  3. Сохраните векторы предложений в список (для обработки и использования в качестве входных данных модели после классификации).

Фактическая модель работает достаточно быстро, но (в отличие от векторов скипграмм) простой процесс извлечения векторов из spacy.tokens.span.Spanобъект и сохранение их в объект списка или массива очень медленно.

Вот воспроизводимый пример:

      import spacy
import requests
import numpy as np
nlp = spacy.load('en_stsb_roberta_large') # from https://github.com/MartinoMensio/spacy-sentence-bert

# Get some random text
def get_text(
    url = "https://raw.githubusercontent.com/erikthiem/pride-and-prejudice/master/starwars4.txt",
    num_chars = 10_000):

    response = requests.get(url)
    text = response.content.decode().replace("\n", "")
    text = text[0:num_chars]
    return text

Запуск фактического nlp()команда занимает очень мало времени:

      # This takes 0.2 seconds to run
text = get_text()
doc = nlp(text)
sents = list(doc.sents) # doc.sents is a generator

Однако, если я хочу сохранить векторы из первого предложения (36 слов) в список, это очень медленно:

      # Get vectors - takes 5 seconds
example_sent = sents[0]
sent_vectors = [word.vector for word in example_sent]

Очевидно, что это плохо масштабируется.

Я не понимаю, почему так медленно, как будто ты бежишь type(example_sent[0].vector), он возвращается numpy.ndarray, т.е. не генератор, поэтому вектор уже вычислен.

Почему перемещение из диапазона в список занимает так много времени? Массивы имеют размерность (1024,)для каждого слова, а не (300,)для векторов пропуска грамм, которые копируются почти мгновенно. Это единственная разница, насколько я могу судить.

Я также создаю пустой массив необходимых размеров (а не список), но это не имеет значения.

Любые идеи?

0 ответов

Другие вопросы по тегам