Применять портеры stemmer к столбцу панд для каждого слова

У меня есть пандас dataframe под названием "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

2 ответа

Решение

Применение трех различных операций к серии с миллионами строк - очень дорогая операция. Вместо этого примените все сразу:

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)

(Примечание: это просто измененная версия принятого ответа)

Что вам нужно сделать, это токенизировать ваши предложения. Токенизация означает разбиение предложения на слова в зависимости от типа разделителей, которые вы используете, чтобы избежать таких вещей, как знаки препинания, которые иногда не нужны. Это зависит от варианта использования. В моделировании последовательностей, когда вы пытаетесь предсказать следующую последовательность, запятая имеет значение, но когда вы пытаетесь получить pos-теги для слов просто для анализа, это может не сработать. Так вот, вот как сделать токенизацию.

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

Примените свой Stemermer к вышеупомянутому столбцу Tokenized следующим образом:

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))
Другие вопросы по тегам