Применять портеры 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))