我正在计算机上使用训练有素的FastText模型创建文档向量。据我所知,Gensim的FastText没有创建文档矢量的选项(最好称为段落矢量[PV])。因此,我通过取文档中可用单词的总和的平均值来手动计算它们。仅此一项任务就不需要花费很多时间。
如果我要将其他几个数字特征附加到计算出的PV,则500万文档需要大约30分钟的创建时间。我认为可以通过使用Python的多处理库将工作分解到计算机上的几个内核上来改善此过程,该库现在可以运行,但只能在一定程度上使用。
在进入此阶段之前,我必须解决一些问题。由于我使用Jupyter Notebook执行代码,因此必须将一些方法放在单独的Python脚本中才能在Jupyter Notebook中使用多处理。这是Jupyter Notebook中可用的代码。它导入模块“ m_helpers”,该模块具有以下方法 创建文档向量:
import multiprocessing
import m_helpers
# Define number of workers.
num_processes = 3
if __name__ == "__main__":
# This pool spawns several processes to built the
# document vectors with the FastText model
with multiprocessing.Pool(processes = num_processes,
initializer = m_helpers.init_vars,
initargs = (fasttext_model, vars_df)) as pool:
results = pool.map(m_helpers.create_docvecs,
data_df.itertuples(name = False),
chunksize = 512)
output = [x for x in results]
# Print length of output to see whether everything was processed
print("Length of output (document vectors): {0}".format(len(output)))
m_helpers.py:
fasttext_model = None
vars_df = None
def init_vars(model, df):
global fasttext_model
fasttext_model = model
global vars_df
vars_df = df
def create_docvecs(data):
word_vectors = [fasttext_model.wv[word] for word in data[-1].str.split()]
document_vector = sum(word_vectors) / len(word_vectors)
feature_vector = vars_df.loc[data[0], :].values
# Further code to combine both vectors
return document_vector
我有一台6核/ 12线程的计算机。但是,我可以使此代码仅适用于3个内核。使用更多内核通常会导致由于耗尽所有内存(RAM)而导致错误。我认为这是由每个过程的所有对象副本造成的。
现在,似乎已经有一种方法可以创建一个供所有进程访问的共享内存。我正在遍历一个数据框以访问文本数据。为所有进程调用的方法使用另一个数据框和快速文本模型。所有这些对象都是只读的,以创建PV并从其他数据帧附加值。我可以合并文本数据框和要素数据框。但是,我仍然至少需要共享fasttext_model对象。所以问题是,怎么做?有可能吗?我已经在stackoverflow上阅读了有关此问题的几个问题,但是我做不到。也许我需要使用不同于Pool的东西?