Reemplaza palabras marcando desde el dataframe de pandas

Tengo un dataframe como abajo.

ID Word Synonyms ------------------------ 1 drove drive 2 office downtown 3 everyday daily 4 day daily 5 work downtown 

Estoy leyendo una oración y me gustaría reemplazar las palabras en esa oración con sus sinónimos como se definió anteriormente. Aquí está mi código:

 import nltk import pandas as pd import string sdf = pd.read_excel('C:\synonyms.xlsx') sd = sdf.apply(lambda x: x.astype(str).str.lower()) words = 'i drove to office everyday in my car' ####### def tokenize(text): text = ''.join([ch for ch in text if ch not in string.punctuation]) tokens = nltk.word_tokenize(text) synonym = synonyms(tokens) return synonym def synonyms(words): for word in words: if(sd[sd['Word'] == word].index.tolist()): idx = sd[sd['Word'] == word].index.tolist() word = sd.loc[idx]['Synonyms'].item() else: word return word print(tokenize(words)) 

El código anterior tokeniza la oración de entrada. Me gustaría lograr el siguiente resultado:

En : i drove to office everyday in my car
Fuera : i drive to downtown daily in my car

Pero la salida que obtengo es

Fuera : car

Si omito la función de synonyms , entonces mi salida no tiene problemas y se divide en palabras individuales. Estoy tratando de entender lo que estoy haciendo mal en la función de synonyms . Además, por favor avise si hay una mejor solución a este problema.

Aprovecharía la indexación de Pandas / NumPy. Debido a que su asignación de sinónimos es de muchos a uno, puede volver a indexar usando la columna de Word .

 sd = sd.applymap(str.strip).applymap(str.lower).set_index('Word').Synonyms print(sd) 
 Word drove drive office downtown everyday daily day daily Name: Synonyms, dtype: object 

Luego, puede alinear fácilmente una lista de tokens a sus respectivos sinónimos.

 words = nltk.word_tokenize(u'i drove to office everyday in my car') sentence = sd[words].reset_index() print(sentence) 
  Word Synonyms 0 i NaN 1 drove drive 2 to NaN 3 office downtown 4 everyday daily 5 in NaN 6 my NaN 7 car NaN 

Ahora, queda por usar los tokens de Synonyms , volviendo a Word . Esto se puede lograr con

 sentence = sentence.Synonyms.fillna(sentence.Word) print(sentence.values) 
 [u'i' 'drive' u'to' 'downtown' 'daily' u'in' u'my' u'car'] 
 import re import pandas as pd sdf = pd.read_excel('C:\synonyms.xlsx') rep = dict(zip(sdf.Word, sdf.Synonyms)) #convert into dictionary words = "i drove to office everyday in my car" rep = dict((re.escape(k), v) for k, v in rep.iteritems()) pattern = re.compile("|".join(rep.keys())) rep = pattern.sub(lambda m: rep[re.escape(m.group(0))], words) print rep 

salida

 i drive to downtown daily in my car 

Cortesía: https://stackoverflow.com/a/6117124/6626530