2017-05-05 1 views
2

j'ai un dataframe de pandas géants appelé « data_stem » et il y a une colonne nommée « TWEET_SENT_1 » qui ont des chaînes comme ci-dessous (50 lignes)appliquent porteurs égrappoir à une colonne Pandas pour chaque mot

TWEET_SENT_1

la mack papa de baiser croix

j'ai aimé ce corps vidéo parti

je veux appliquer stemmer porteurs dans la colonne « TWEET_SENT_1 » (pour tous les mots d'une ligne) i essayé ci-dessous le code et il donne une erreur. pourriez-vous s'il vous plaît me aider à surmonter cette

from nltk.stem import PorterStemmer, WordNetLemmatizer 
porter_stemmer = PorterStemmer() 
data_stem[' TWEET_SENT_1 '] = data_stem[' TWEET_SENT_1 '].apply(lambda x: [porter_stemmer.stem(y) for y in x]) 

ci-dessous est l'erreur

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-412-c16b1beddfb5> in <module>() 
     1 from nltk.stem import PorterStemmer, WordNetLemmatizer 
     2 porter_stemmer = PorterStemmer() 
----> 3 data_stem[' TWEET_SENT_1 '] = data_stem[' TWEET_SENT_1 '].apply(lambda x: [porter_stemmer.stem(y) for y in x]) 

C:\Users\SampathR\Anaconda2\envs\dato-env\lib\site-packages\pandas\core\series.pyc in apply(self, func, convert_dtype, args, **kwds) 
    2058    values = lib.map_infer(values, lib.Timestamp) 
    2059 
-> 2060   mapped = lib.map_infer(values, f, convert=convert_dtype) 
    2061   if len(mapped) and isinstance(mapped[0], Series): 
    2062    from pandas.core.frame import DataFrame 

pandas\src\inference.pyx in pandas.lib.map_infer (pandas\lib.c:58435)() 

<ipython-input-412-c16b1beddfb5> in <lambda>(x) 
     1 from nltk.stem import PorterStemmer, WordNetLemmatizer 
     2 porter_stemmer = PorterStemmer() 
----> 3 data_stem[' TWEET_SENT_1 '] = data_stem[' TWEET_SENT_1 '].apply(lambda x: [porter_stemmer.stem(y) for y in x]) 

TypeError: 'NoneType' object is not iterable 
+1

Avez-vous des 'None's dans' data_stem ['TWEET_SENT_1'] '? Existe-t-il des espaces autour de TWEET_SENT_1? – DyZ

+0

@DYZ merci beaucoup. il n'y en a pas dans data_stem ['TWEET_SENT_1']. oui il y a des espaces entre TWEET_SENT_1. quand j'exécute 'porter_stemmer.stem (data_stem.iloc [1,2])' ça marche. mais je veux l'appliquer à chaque mot et à toutes les lignes de la colonne –

+1

Vous devez marquer avant d'appliquer comme vous êtes. La façon dont vous faites porter_stemmer.stem (y) dans une compréhension de liste. Il fera lettre par lettre et non mot par mot ce que vous voulez. – Satyadev

Répondre

4

Ce que vous devez faire est d'abord tokenize vos phrases. Tokenize signifie diviser une phrase en mots en fonction du type de délimiteur que vous avez afin d'éviter des choses comme des ponctuations qui ne sont parfois pas vraiment nécessaires. Cela dépend du cas d'utilisation. Dans la modélisation de séquence où vous essayez de prédire la séquence suivante, une virgule est importante, mais lorsque vous essayez d'obtenir des balises POS pour des mots juste pour l'analyse, il se peut que cela ne soit pas le cas.

data_stem['TWEET_TOKENIZED']=data_stem['TWEET_SENT_1'].apply(lambda x : filter(None,x.split(" "))) 

Appliquer votre égrappoir à la colonne tokenized ci-dessus comme suit:

data_stem['Tweet_stemmed']=data_stem['TWEET_TOKENIZED'].apply(lambda x : [porter_stemmer.stem(y) for y in x]) 

Mise à jour: Ajout d'une fonctionnalité de concaténation

Pour revenir le tweet en format phrase, procédez comme suit:

+0

Génial cela fonctionne comme un charme. petite demande, puis-je obtenir la sortie en tant que même chaîne originale. ex: le texte original était 'le papa mack de kiss cross' et le résultat Tweet_stemmed est [le, mack, papa, de, kiss, cross], puis-je le convertir en format original (pas aux mots originaux) sans virgule (,) et entre crochets –

+0

Pouvez-vous coller un exemple de sortie ici? Aussi, n'oubliez pas d'accepter la réponse si elle a résolu votre question. – Satyadev

+0

Mise à jour de la réponse. – Satyadev