como paralelizar muitas comparações de strings (nebulosas) usando apply no Pandas?
Eu tenho o seguinte problema
Eu tenho um quadro de dadosmestre que contém frases, como
master
Out[8]:
original
0 this is a nice sentence
1 this is another one
2 stackoverflow is nice
Para cada linha no Master, procuro outro Dataframeescravo para a melhor correspondência usandofuzzywuzzy
. Uso fuzzywuzzy porque as frases correspondentes entre os dois quadros de dados podem diferir um pouco (caracteres extras, etc.).
Por exemplo,escravo poderia ser
slave
Out[10]:
my_value name
0 2 hello world
1 1 congratulations
2 2 this is a nice sentence
3 3 this is another one
4 1 stackoverflow is nice
Aqui está um exemplo de trabalho totalmente funcional, maravilhoso e compacto :)
from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
import difflib
master= pd.DataFrame({'original':['this is a nice sentence',
'this is another one',
'stackoverflow is nice']})
slave= pd.DataFrame({'name':['hello world',
'congratulations',
'this is a nice sentence ',
'this is another one',
'stackoverflow is nice'],'my_value': [2,1,2,3,1]})
def fuzzy_score(str1, str2):
return fuzz.token_set_ratio(str1, str2)
def helper(orig_string, slave_df):
#use fuzzywuzzy to see how close original and name are
slave_df['score'] = slave_df.name.apply(lambda x: fuzzy_score(x,orig_string))
#return my_value corresponding to the highest score
return slave_df.ix[slave_df.score.idxmax(),'my_value']
master['my_value'] = master.original.apply(lambda x: helper(x,slave))
A pergunta de 1 milhão de dólares é: posso paralelizar meu código de inscrição acima?
Afinal, todas as linhas demaster
é comparado a todas as linhas emslave
(slave é um pequeno conjunto de dados e posso armazenar muitas cópias dos dados na RAM).
Não vejo por que não consegui executar várias comparações (ou seja, processar várias linhas ao mesmo tempo).
Problema: não sei como fazer isso ou se isso é possível.
Qualquer ajuda muito apreciada!