Проблема здесь в том, что fasttext
объекты, по-видимому, не могут быть обработаны, и Dask не знает, как сериализовать и десериализовать эту структуру данных без травления.
Самый простой способ использования Dask здесь ( но, вероятно, не самый эффективный), чтобы каждый процесс определял саму модель ft
, что позволило бы избежать ее переноса (и, таким образом, избежать попыток травления). Что-то вроде следующего будет работать. Обратите внимание, что ft
определено внутри функции, отображаемой между разделами.
Сначала приведем несколько примеров данных.
import dask.dataframe as dd
import fasttext
import pandas as pd
import dask
import numpy as np
df = pd.DataFrame({"text":['this is a test sentence', None, 'this is another one.', 'one more']})
ddf = dd.from_pandas(df, npartitions=2)
ddf
Dask DataFrame Structure:
text
npartitions=2
0 object
2 ...
3 ...
Dask Name: from_pandas, 2 tasks
Затем мы можем настроить ваши функции, чтобы определить ft
в каждом обработать. Это дублирует усилия, но устраняет необходимость переноса модели. При этом мы можем плавно запустить его через map_partitions
.
def get_embeddings(sent, model):
return model.get_sentence_vector(sent) if not pd.isna(sent) else np.zeros(10)
def func(df):
ft = fasttext.load_model("amazon_review_polarity.bin") # arbitrary model
res = df['text'].apply(lambda x: get_embeddings(x, model=ft))
return res
ddf['sentence_vector'] = ddf.map_partitions(func)
ddf.compute(scheduler='processes')
text sentence_vector
0 this is a test sentence [-0.01934033, 0.03729743, -0.04679677, -0.0603...
1 None [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
2 this is another one. [-0.0025579212, 0.0353713, -0.027139299, -0.05...
3 one more [-0.014522496, 0.10396308, -0.13107553, -0.198...
Обратите внимание, что эта вложенная структура данных (список в столбце), вероятно, не является оптимальным способом обработки этих векторов, но она будет зависеть от ваш вариант использования. Кроме того, вероятно, есть способ выполнить это вычисление в пакетах, используя fastext
вместо одной строки за раз (в Python), но я не очень хорошо разбираюсь в нюансах fastext
.