попытка нарезать массив результатов в «слишком много индексов для массива». Могу ли я дополнить массив, чтобы это исправить? - PullRequest
0 голосов
/ 02 декабря 2019

Я видел множество вопросов об этой конкретной ошибке. Я считаю, что мой вопрос достаточно отличается, чтобы оправдать свой пост.

Моя цель: Я создаю RNN, который генерирует заголовки новостей. Он будет предсказывать следующее слово на основе слов, которые были до него. Этот код взят из примера , и я пытаюсь адаптировать его для своей ситуации. Я пытаюсь нарезать массив на X и y.

Проблема: Я понимаю, что ошибка появляется, потому что массив индексируется, как если бы он был 2dмассив, но на самом деле это 1d массив. Перед преобразованием sequences в массив это список списков, но не все вложенные списки имеют одинаковую длину, поэтому numPy преобразует его в массив 1d.

Мой вопрос (ы): Существует ли простой или элегантный способ дополнить sequences, чтобы все списки имели одинаковую длину? Могу ли я сделать это, используя пробелы, чтобы сохранить то же значение в более коротких заголовках? Зачем мне вообще менять список списков на массив? Как я уже говорил, это из примера, и я пытаюсь понять, что они сделали и почему.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Pretreat Data Section
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
# integer encode sequences of words
# create the tokenizer 
t = Tokenizer() 
# fit the tokenizer on the headlines 
t.fit_on_texts(headlines)
sequences = t.texts_to_sequences(headlines)

# vocabulary size
vocab_size = len(t.word_index) + 1

#separate into input and output
sequences = np.array(sequences)
X, y = sequences[:,:-1], sequences[:,-1]     # fix this
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-87-eb7aab0c3a22> in <module>
     18 #separate into input and output
     19 sequences = np.array(sequences)
---> 20 X, y = sequences[:,:-1], sequences[:,-1]     # fix this
     21 y = to_categorical(y, num_classes=vocab_size)
     22 seq_length = X.shape[1]

IndexError: too many indices for array

1 Ответ

1 голос
/ 02 декабря 2019

Проблема в том, что в этом учебнике есть несколько частей на одной странице, и каждая часть имеет собственный "Complete Example"

Первый "Complete Example" читает текст из republic_clean.txt, очищает его и сохраняет в republic_sequences.txt - этосоздает последовательности с одинаковым количеством слов.

Second "Complete Example" читает текст из republic_sequences.txt и использует его с

sequences = np.array(sequences)
X, y = sequences[:,:-1], sequences[:,-1]

Поскольку первая часть создает последовательности с одинаковым количеством слов,этот код работает правильно.

Кажется, вы пропустили первую часть. Вы должны вернуться к первой части, чтобы узнать, как очистить текст и как создать правильный файл, который вы можете использовать во второй части.


РЕДАКТИРОВАТЬ: , если вы не можетесоздайте последовательности с одинаковым количеством слов, затем вы можете добавить пробелы к более коротким последовательностям. Код будет работать, но я не знаю, создаст ли он лучшую модель.

sequences = [['a'], ['b','c'], ['d','e','f']]

max_len = max(map(len, sequences))

sequences = [x + [""]*(max_len-len(x)) for x in sequences]

print(sequences)

Результат

[['a', '', ''], ['b', 'c', ''], ['d', 'e', 'f']]
...