我有一个名为'data_stem'的pandas数据框,并且有一个名为'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
答案 0 :(得分: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))
答案 1 :(得分:3)
对具有数百万行的序列应用三个不同的操作是非常昂贵的操作。相反,请一次全部应用:
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)
(注意:这只是已接受答案的修改版本)