У меня есть файл 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)