Я пытался получить вложения предложений fastText для 80 миллионов английских твитов, используя механизм распараллеливания с использованием dask, как описано в этом ответе: Как вы распараллеливаете apply() на кадрах данных Pandas, используя все ядра на одной машине?
Вот мой полный код:
import dask.dataframe as dd
from dask.multiprocessing import get
import fasttext
import fasttext.util
import pandas as pd
print('starting langage: ' + 'en')
lang_output = pd.DataFrame()
lang_input = full_input.loc[full_input.name == 'en'] # 80 Million English tweets
ddata = dd.from_pandas(lang_input, npartitions = 96)
print('number of lines to compute: ' + str(len(lang_input)))
fasttext.util.download_model('en', if_exists='ignore') # English
ft = fasttext.load_model('cc.'+'en'+'.300.bin')
fasttext.util.reduce_model(ft, 20)
lang_output['sentence_embedding'] = ddata.map_partitions(lambda lang_input: lang_input.apply((lambda x: get_fasttext_sentence_embedding(x.tweet_text, ft)), axis = 1)).compute(scheduler='processes')
print('finished en')
Это функция get_fasttext_sentence_embedding:
def get_fasttext_sentence_embedding(row, ft):
if pd.isna(row):
return np.zeros(20)
return ft.get_sentence_vector(row)
Но я получаю ошибку травления в этой строке:
lang_output['sentence_embedding'] = ddata.map_partitions(lambda lang_input: lang_input.apply((lambda x: get_fasttext_sentence_embedding(x.tweet_text, ft)), axis = 1)).compute(scheduler='processes')
Это ошибка, которую я получаю:
TypeError: can't pickle fasttext_pybind.fasttext objects
Есть ли способ распараллелить модель get_sentence_vector fastText с помощью dask (или чего-либо еще)? Мне нужно распараллелить, потому что встраивание предложений для 80 миллионов твитов занимает два много времени, а одна строка моего фрейма данных полностью независима от другой.