我有一个大约200万条tweet的数据集,我想使用Asari和其他一些人对其进行情感分析。目前,我正在使用应用程序来获取情感并为它们创建新列。为了加快进程,我想使用多处理,但不确定如何去做。
如果没有多处理器,我的代码看起来如下:(产生新的列)
def asa(x):
asari_1=sonar.ping(x)
hug_1=nlp(x)
return asari_1['top_class'], asari_1['classes'][0]['confidence'], asari_1['classes'][1]['confidence'], hug_1[0]["label"], hug_1[0]["score"]
df_split[i][['asar','asar neg','asar pos','hugposneg','hugscore']]=df_split[i].apply(lambda row: asa(row.Tweet),axis='columns',result_type='expand')
#df_split[0]['asar'],df_split[0]['asar neg'],df_split[0]['asar pos'],df_split[0]['hugposneg'],df_split[0]['hug score']=zip(*df_split[0]['Tweet'].map(asa)) map version
对于多处理器,我尝试了以下方法,但正如您可能猜到的那样,它们返回的错误如'DataFrame'对象没有属性'p'
%%time
if __name__ == '__main__':
with Pool() as p:
j[['asar','asar neg','asar pos','hugposneg','hugscore']]=j.p.apply(lambda row: asa(row.Tweet),axis='columns',result_type='expand')
# j['asar'],j['asar neg'],j['asar pos'],j['hugposneg'],j['hug score']=p.zip(*j['Tweet'].map(asa))
j
提前感谢您的宝贵时间!
您可以使用swifter
包:
pip install swifter
(注意,您可能希望在虚拟环境中使用它,以避免与已安装的依赖项发生版本冲突。)
Swifter作为pandas的插件,允许您重用apply
函数:
import swifter
def some_function(data):
return data * 10
data['out'] = data['in'].swifter.apply(some_function)
它将自动找出最有效的方法来并行化函数,无论它是否矢量化(如上面的例子)。
更多的例子可以在GitHub上找到。请注意,该包正在积极开发中,因此API可能会更改。还需要注意的是,对于字符串列,这不会自动工作。当使用字符串时,Swifter将回退到"简单"的Pandasapply
,这将不是并行的。在这种情况下,即使强迫它使用dask
也不会产生性能改进,您最好手动拆分数据集并使用multiprocessing
并行化。