keras — ошибка атрибута: объект «numpy.ndarray» не имеет атрибута «ниже»

#python #keras #text-classification

Вопрос:

Не уверен, что я делаю не так:

У меня есть набор данных (весь текст), и когда я пытаюсь подогнать маркер, это не удается.

 from keras.preprocessing.text import Tokenizer as Tok

# The maximum number of words to be used. (most frequent)
MAX_NB_WORDS = 50000
# Max number of words in each complaint.
MAX_SEQUENCE_LENGTH = 250
# This is fixed.
EMBEDDING_DIM = 100

labels = training_data['group_name']
features = training_data.drop('group_name', axis='columns')

tokenizer = Tok(num_words=MAX_NB_WORDS, filters='!"#$%amp;()* ,-./:;<=>?@[]^_`{|}~', lower=True)
tokenizer.fit_on_texts(features.values)
 

AttributeError: 'numpy.ndarray' object has no attribute 'lower'

Я очистил текст следующим образом:

 REPLACE_BY_SPACE_RE = re.compile('[/(){}[]|@,;]')
BAD_SYMBOLS_RE = re.compile('[^0-9a-z # _]')
STOPWORDS = set(stopwords.words('english'))


def clean_text(text):   
    text = text.lower() # lowercase text
    text = REPLACE_BY_SPACE_RE.sub(' ', text) # replace REPLACE_BY_SPACE_RE symbols by space in text. substitute the matched string in REPLACE_BY_SPACE_RE with space.
    text = BAD_SYMBOLS_RE.sub('', text) # remove symbols which are in BAD_SYMBOLS_RE from text. substitute the matched string in BAD_SYMBOLS_RE with nothing. 
    text = text.replace('x', '')

    text = ' '.join(word for word in text.split() if word not in STOPWORDS) # remove stopwors from text
    return text

print('clean text')
training_data = training_data.applymap(lambda x: clean_text(x))
 

… так что я не могу понять, откуда numpy.ndarray берется

Обновить:

Я смог понять проблему и обойти ее уродливым способом:

Консолидируйте все столбцы в один:

 labels = df['group_name']
features = df.drop('group_name', axis='columns')
tmp = pd.DataFrame()
tmp['txt'] = features[features.columns[1:]].apply(
    lambda x: ','.join(x.dropna().astype(str)),
    axis=1
)
 

теперь он проходит проблемный этап:

 tokenizer = Tok(num_words=MAX_NB_WORDS, filters='!"#$%amp;()* ,-./:;<=>?@[]^_`{|}~', lower=True)
tokenizer.fit_on_texts(tmp['txt'].values)
word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))
X = tokenizer.texts_to_sequences(tmp['txt'].values)
X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)
print('Shape of data tensor:', X.shape)
Y = pd.get_dummies(labels).values
print('Shape of label tensor:', Y.shape)
 

Однако я все еще хочу сохранить исходные столбцы и не хранить все данные в одном столбце.

Как я могу этого достичь (т. Е. Получить все значения из всех столбцов без итерации по вложенным массивам numpy)?

Комментарии:

1. Я думаю x здесь: training_data.applymap(lambda x: clean_text(x)) это массив numpy, а не строка.

2. @Kaveh ты хочешь сказать, что моя «чистка» не имеет никакого эффекта?

3. No. training_data включает в себя массив меток и функций. Когда вы используете map(lambda x: clean_text(x)) , он получает каждую строку как x и передает clean_text(x) , что x является массивом. Итак, в первой строке, где text.lower() вы написали, возникает ошибка. Потому что текст-это не строка, а массив numpy.

4. @Kaveh имеет смысл — можете ли вы предложить альтернативный подход, чтобы применить его ко всем строкам, не меняя его на массив numpy?

5. обновил свой вопрос, так как я смог немного продвинуться