2017-05-05 59 views
2

我有稱爲「data_stem」一個大熊貓數據幀和有一個名爲「TWEET_SENT_1」,其有一個字符串象下面(50行)申請搬運工詞幹的熊貓列對每個字

TWEET_SENT_1

列吻的萬人迷交叉

我喜歡這個視頻屍體派對

我想爲「TWEET_SENT_1」列申請搬運工詞幹(對於行的所有的話) 我想下面的代碼,它給出了一個錯誤。請你幫我克服這個

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]) 

下面是錯誤

--------------------------------------------------------------------------- 
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

'data_stem ['TWEET_SENT_1']''中有'None'嗎? TWEET_SENT_1的確有空格嗎? – DyZ

+0

@DYZ非常感謝。 data_stem ['TWEET_SENT_1']中沒有任何內容。是的,TWEET_SENT_1之間有空格。當我執行'porter_stemmer.stem(data_stem.iloc [1,2])'它工作。但是我想將它應用到列的每個單詞和所有行中 –

+1

您需要在應用您的方式之前進行標記化。您在列表理解中執行porter_stemmer.stem(y)的方式。它會逐字逐句逐字逐句逐字逐句逐字逐字處理。 – Satyadev

回答

4

是記號化你的句子,你首先需要做的是什麼。 Tokenize意味着根據您擁有的分隔符類型將一個句子拆分爲單詞,這樣您就可以避免有時並不需要的標點符號。這取決於用例。在序列建模中,您試圖預測下一個序列,逗號很重要,但是當您試圖爲分析獲取單詞的pos標記時,它可能不會。總之,以下是如何執行標記化。

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

應用您的詞幹上述標記化列如下:

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

更新:添加級聯功能

找回推入句子格式,請執行下列操作:

data_stem['tweet_stemmed_sentence']=data_stem['Tweet_stemmed'].apply(lambda x : " ".join(x)) 
+0

偉大的工程就像一個魅力。小的請求,我可以得到與原始字符串相同的輸出。例如:原文是'親吻十字'的麥克爸爸,並且Tweet_stemmed的結果是[the,mack,daddy,of,kiss,cross],可以將它再次轉換爲原始格式(而不是原始單詞) ,)和方括號 –

+0

你能在這裏粘貼一些示例輸出嗎?另外,如果它解決了你的問題,不要忘記接受答案。 – Satyadev

+0

更新了答案。 – Satyadev