Невозможно удалить английские стоп-слова из фрейма данных

Я пытался выполнить анализ настроений по набору данных обзоров фильмов, и я застрял в точке, где я не могу удалить английские стоп-слова из данных. Что я делаю не так?

from nltk.corpus import stopwords
stop = stopwords.words("English")
list_ = []
for file_ in dataset:
    dataset['Content'] = dataset['Content'].apply(lambda x: [item for item in x.split(',') if item not in stop])
    list_.append(dataset)
dataset = pd.concat(list_, ignore_index=True)

person ykombinator    schedule 26.06.2017    source источник
comment
Что error вы получаете?   -  person student    schedule 26.06.2017
comment
@open-source Нет ошибки - ничего не происходит, когда я выполняю этот код.   -  person ykombinator    schedule 26.06.2017
comment
Ваш контент имеет формат 'i, am, the, computer, machine.'? Можете ли вы опубликовать одну строку, из которой, как вы ожидаете, будут удалены стоп-слова?   -  person student    schedule 26.06.2017
comment
Возможно, это то, что вам нужно github. com/alvations/earthy/blob/master/ =)   -  person alvas    schedule 26.06.2017


Ответы (4)


Я думаю, что код должен работать с информацией до сих пор. Предположение, которое я делаю, заключается в том, что данные имеют дополнительное пространство, разделенное запятой. Ниже приведен тест: (надеюсь, это поможет!)

import pandas as pd
from nltk.corpus import stopwords
import nltk

stop = nltk.corpus.stopwords.words('english')

dataset = pd.DataFrame([{'Content':'i, am, the, computer, machine'}])
dataset = dataset.append({'Content':'i, play, game'}, ignore_index=True)
print(dataset)
list_ = []
for file_ in dataset:
    dataset['Content'] = dataset['Content'].apply(lambda x: [item.strip() for item in x.split(',') if item.strip() not in stop])
    list_.append(dataset)
dataset = pd.concat(list_, ignore_index=True)

print(dataset)

Ввод со стоп-словами:

                          Content
0   i, am, the, computer, machine
1                   i, play, game

Выход:

                Content
 0  [computer, machine]
 1         [play, game]
person student    schedule 26.06.2017

Что ж, благодаря вашему комментарию я думаю, что вам не нужно зацикливаться на dataset. (Возможно, dataset содержит только один столбец с именем Content)

Вы можете просто сделать:

 dataset["Content"] = dataset["Content"].str.split(",").apply(lambda x: [item for item in x if item not in stop])
person Community    schedule 26.06.2017
comment
Я получаю TypeError: string indices must be integers - person ykombinator; 26.06.2017

Попробуйте earthy:

>>> from earthy.wordlist import punctuations, stopwords
>>> from earthy.preprocessing import remove_stopwords
>>> result = dataset['Content'].apply(remove_stopwords)

См. https://github.com/alvations/earthy/blob/master/FAQ.md#what-else-can-earthy-do

person alvas    schedule 26.06.2017
comment
Я думаю, я должен добавить бесстыдную вилку ;P - person alvas; 26.06.2017

Вы зацикливаетесь на наборе данных, но каждый раз добавляете весь кадр и не используете файл_ Попробуйте:

from nltk.corpus import stopwords
stop = stopwords.words("English")
dataset['Cleaned'] = dataset['Content'].apply(lambda x: ','.join([item for item in x.split(',') if item not in stop]))

Это возвращает серию, содержащую списки слов, если вы хотите свести ее к одному списку:

flat_list = [item for sublist in list(dataset['Cleaned'].values) for item in sublist]

С советом по Создание плоского списка списка списков в Python

person tvashtar    schedule 26.06.2017
comment
Я также получаю TypeError: string indices must be integers за этот код. dataset это тип DataFrame кстати. - person ykombinator; 26.06.2017
comment
Ах, хорошо, это было неясно, и в какой форме вы хотели получить результат? Один список слов или список на строку? - person tvashtar; 26.06.2017
comment
Я обновил свой ответ, чтобы дать вам оба варианта. Я предполагаю, что элементы dataset['Content'] содержат список слов, разделенных запятыми, если нет, приведите пример набора данных. - person tvashtar; 26.06.2017
comment
И чтобы уточнить, вы получали эти ошибки в обоих примерах, потому что итерация по фрейму данных фактически итерирует столбцы, а не строки. Для этого вы можете использовать iterrows, но в этом случае вы можете просто применить, как показано, поскольку iterrows возвращает кортежи. Вы также можете перебрать индекс набора данных, если действительно хотите сделать что-то похожее на свой код. - person tvashtar; 26.06.2017
comment
Да, набор данных представляет собой фрейм данных, разделенный запятыми, состоящий из обзоров фильмов. Знаки препинания убраны из каждой строки. Ожидаемый результат: 3 строки содержат около 50 слов, в этих строках 2, 5, 7 стоп-слов. Вывод должен быть разделенным запятыми кадром данных из 48, 45 и 43 слов. - person ykombinator; 26.06.2017
comment
Понятно, хорошо, изменил ответ выше, чтобы перекомпоновать список слов в список, разделенный запятыми, в каждой строке. - person tvashtar; 26.06.2017