Skip to main content
 首页 » 编程设计

python之将 porters stemmer 应用于每个单词的 Pandas 列

2025年05月04日10lyj

我有一个名为“data_stem”的 Pandas 数据框,并且有一列名为“TWEET_SENT_1”,其中包含如下字符串(50 行)

TWEET_SENT_1

亲吻十字架的麦克爸爸

我喜欢那个视频 body 派对

我想将 porters stemmer 应用到“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 

请您参考如下方法:

对具有数百万行的系列应用三种不同的操作是非常昂贵的操作。相反,一次应用所有:

def stem_sentences(sentence): 
    tokens = sentence.split() 
    stemmed_tokens = [porter_stemmer.stem(token) for token in tokens] 
    return ' '.join(stemmed_tokens) 
 
data_stem['TWEET_SENT_1'] = data_stem['TWEET_SENT_1'].apply(stem_sentences) 

(注意:这只是已接受答案的修改版本)