J'ai un cadre de données pandas comme ci-dessous, il contient une phrase de mots, et j'ai une liste de plus appelée vocab, je veux supprimer tous les mots de la phrase sauf que les mots sont dans la liste de vocabulaire.

Exemple df:

                                 sentence
0  packag come differ what about tomorrow
1        Hello dear truth is hard to tell

Exemple de vocabulaire:

['packag', 'differ', 'tomorrow', 'dear', 'truth', 'hard', 'tell']

O / P attendu:

                                   sentence                  res
0   packag come differ what about tomorrow     packag differ tomorrow
1         Hello dear truth is hard to tell    dear truth hard tell

J'ai d'abord essayé d'utiliser .str.replace et de supprimer toutes les données importantes de la phrase, puis de les stocker dans t1. Fait à nouveau la même chose pour t1 et phrase, donc, j'obtiendrai ma sortie attendue. Mais cela ne fonctionne pas comme prévu.

Ma tentative:

vocab_lis=['packag', 'differ', 'tomorrow', 'dear', 'truth', 'hard', 'tell']
vocab_regex = ' '+' | '.join(vocab_lis)+' '
df=pd.DataFrame()
s = pd.Series(["packag come differ what about tomorrow", "Hello dear truth is hard to tell"])
df['sentence']=s
df['sentence']= ' '+df['sentence']+' '

df['t1'] = df['sentence'].str.replace(vocab_regex, ' ')
df['t2'] = df.apply(lambda x: pd.Series(x['sentence']).str.replace(' | '.join(x['t1'].split()), ' '), axis=1)

Existe-t-il un moyen simple de réaliser ma tâche ci-dessus? Je sais que mon code ne fonctionne pas à cause des espaces. Comment résoudre ça?

1
Mohamed Thasin ah 13 mars 2019 à 12:58

2 réponses

Meilleure réponse

Utilisez la compréhension des listes imbriquées avec une division par des espaces:

df['res'] = [' '.join(y for y in x.split() if y in vocab_lis) for x in df['sentence']]
print (df)
                                 sentence                     res
0  packag come differ what about tomorrow  packag differ tomorrow
1        Hello dear truth is hard to tell    dear truth hard tell

vocab_regex = '|'.join(r"\b{}\b".format(x) for x in vocab_lis)
df['t1'] = df['sentence'].str.replace(vocab_regex, '')
print (df)
                                 sentence                  t1
0  packag come differ what about tomorrow   come  what about 
1        Hello dear truth is hard to tell     Hello   is  to
2
jezrael 13 mars 2019 à 10:23

En utilisant np.array

données

                                   sentence
0    packag come differ what about tomorrow
1          Hello dear truth is hard to tell

Vocab

v = ['packag', 'differ', 'tomorrow', 'dear', 'truth', 'hard', 'tell']

Divisez d'abord la phrase pour faire une liste, puis utilisez np.in1d pour vérifier les éléments communs entre les deux listes. Ensuite, il suffit de rejoindre la liste pour créer une chaîne

data['sentence'] = data['sentence'].apply(lambda x: ' '.join(np.array(x.split(' '))[np.in1d(x.split(' '),v)]))

Sortie

                                   sentence                     res
0    packag come differ what about tomorrow  packag differ tomorrow
1          Hello dear truth is hard to tell    dear truth hard tell
2
iamklaus 13 mars 2019 à 10:24