Увеличение скорости применения модели машинного обучения к коллекции текстов. - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть файл JSON, содержащий около 3.000.000 текстов. У меня также есть 4 модели машинного обучения с предварительной подготовкой, которые получают текст в качестве входных данных и возвращают массив 1d numpy размером 300. Я пробовал и с Pandas, и с Dask, но для запуска требуется слишком много времени, поэтому я ищу какой-нибудь возможный способ немного увеличить процесс.

Мое решение в Pandas

ft = fasttext.FastTextModel()
df['ft'] = df.text.apply(ft.text_to_vector)

Я также пробовал с Swifter, который обещает улучшение скорости

ft = fasttext.FastTextModel()
df['ft'] = df.abstract.swifter.apply(ft.text_to_vector)

И это в Dask

def getFTVector(rec):
    ft = fasttext.FastTextModel()
    try:
        rec['ft'] = ft.text_to_vector(rec['abstract']).tolist() #I have to convert to list since numpy array cannot be serialized
    except:
        rec['ft'] = [0] * 300

    return rec

bag = db.read_text('texts.json').map(json.loads)        
bag.map(getFTVector).map(json.dumps).to_textfiles('vectors_ft_*.json', encoding='utf-8')

Все 3 потребовали более или менее 4-5 часов для запуска одной из моделей.

И .txt_to_vector выглядит следующим образом:

def text_to_vector(self, text):
    """
    Given a string, normalizes it, then splits it into words and finally converts
    it to a sequence of word vectors.
    """
    ft_model = self.model
    tokens = self.nltk_tokenizer(text)

    x = []

    for word in tokens:
        y = ft_model.get_word_vector(word).astype('float32')
        x.append(y)

    return np.average(x, axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...