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

apply porters stemmer to a Pandas column for each word

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

TWEET_SENT_1

kiss cross的老爹

我喜欢那个视频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

您首先需要做的是标记您的句子。 Tokenize 意味着根据您拥有的分隔符类型将句子拆分为单词,这样您就可以避免标点符号之类的东西,而这些有时并不是真正需要的。这取决于用例。在您尝试预测下一个序列的序列建模中,逗号很重要,但是当您尝试获取单词的 pos 标签仅用于分析时,它可能 not.Anyhow,这里是如何进行标记化。

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

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

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)

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