Выполните nltk.stem.SnowballStemmer в pandas - PullRequest
1 голос
/ 13 января 2020

У меня есть четыре столбца DataFrame с двумя столбцами токенизированных слов, у которых были удалены стоп-слова и преобразованы в нижний регистр, и теперь я пытаюсь выйти из строя.

enter image description here

Я не уверен, получает ли метод apply() доступ к серии плюс ее отдельные ячейки или мне нужен другой способ войти в каждую запись так пробовал оба (я думаю!)

from nltk.stem import SnowballStemmer
stemmer = nltk.stem.SnowballStemmer('english')

Я пробовал:

df_2['Headline'] = df_2['Headline'].apply(lambda x: stemmer.stem(item) for item in x)

---- -------------------------------------------------- --------------------- TypeError Traceback (последний последний вызов) в () ----> 1 df_2 ['Headline__'] = df_2 ['Headline' ] .apply (лямбда-x: stemmer.stem (item) для элемента в x)

~ \ AppData \ Local \ Continuum \ anaconda3 \ envs \ learn-env \ lib \ site-packages \ pandas \ core \ Использование series.py (self, fun c, convert_dtype, args, ** kwds) 3192
else: 3193 values ​​= self.astype (object) .values ​​-> 3194 mapped = lib.map_infer (values, f , convert = convert_dtype) 3195 3196, если len (сопоставлено) и isinstance (сопоставлено [0], серия):

pandas / _libs / src \ inference.pyx в pandas ._ libs.lib.map_infer ()

Ошибка типа: объект «генератор» не может быть вызван

Я полагаю, что эта TypeError похожа на ту, что говорит, что объект «List» не может быть вызван, и исправила эту ошибку с помощью метода apply() и из идей здесь.

df_2['Headline'] = df_2['Headline'].apply(lambda x: stemmer.stem(x))

-------------------------------- ------------------------------------------- AttributeError Traceback (последний вызов последний ) in () ----> 1 df_2 ['Headline'] = df_2 ['Headline']. apply (лямбда x: stemmer.stem (x)) 2 3 df_2.head ()

~ \ AppData \ Local \ Continuum \ anaconda3 \ envs \ learn-env \ lib \ site-packages \ pandas \ core \ series.py in apply (self, fun c, convert_dtype, args, ** kwds) 3192
иначе: 3193 values ​​= self.astype (object) .values ​​-> 3194 mapped = lib.map_infer (values, f, convert = convert_dtype) 3195 3196, если len (mapped) и isinstance (mapped [0], Series):

pandas / _libs / src \ inference.pyx в pandas ._ libs.lib.map_infer ()

в (x) ----> 1 df_2 ['Headline'] = df_2 [ 'Заголовок']. Apply (лямбда x: stemmer.stem (x)) 2 3 df_2.head ()

~ \ AppData \ Local \ Continuum \ anaconda3 \ envs \ learn-env \ lib \ site- пакеты \ nltk \ stem \ snowball.py в стволе (self, word) 1415 1416 "" "-> 1417 word = word.lower () 1418 1419 если слово в self.stopwords или len ( word) <= 2: </p>

AttributeError: у объекта 'list' нет атрибута 'lower'

1 Ответ

1 голос
/ 13 января 2020

Вам необходимо указать axis для apply.

. Вот полный рабочий пример:

import pandas as pd

df = pd.DataFrame({
    'col_1' : [['ducks'], ['dogs']],
    'col_2' : [['he', 'eats', 'apples'], ['she', 'has', 'cats', 'dogs']],
    'col_3' : ['some data 1', 'some data 2'],
    'col_4' : ['another data 1', 'another data 2']
})
df.head()

Выход

    col_1   col_2                   col_3       col_4
0   [ducks] [he, eats, apples]      some data 1 another data 1
1   [dogs]  [she, has, cats, dogs]  some data 2 another data 2

Теперь давайте применим основы для столбцов с токенами:

import nltk
from nltk.stem import SnowballStemmer
stemmer = nltk.stem.SnowballStemmer('english')

df.col_1 = df.apply(lambda row: [stemmer.stem(item) for item in row.col_1], axis=1)
df.col_2 = df.apply(lambda row: [stemmer.stem(item) for item in row.col_2], axis=1)

Проверьте новое содержимое фрейма данных.

df.head()

Выход

    col_1   col_2                   col_3       col_4
0   [duck]  [he, eat, appl]         some data 1 another data 1
1   [dog]   [she, has, cat, dog]    some data 2 another data 2
...