keras pad_sequence для строкового типа данных

У меня есть список предложений. Я хочу добавить к ним отступы; но когда я использую keras pad_sequence следующим образом:

from keras.preprocessing.sequence import pad_sequences
s = [["this", "is", "a", "book"], ["this", "is", "not"]]
g = pad_sequences(s, dtype='str', maxlen=10, value='_PAD_')

результат:

array([['_', '_', '_', '_', '_', '_', 't', 'i', 'a', 'b'],
       ['_', '_', '_', '_', '_', '_', '_', 't', 'i', 'n']], dtype='<U1')

Почему он не работает должным образом?

Я хочу использовать этот результат в качестве входных данных для встраивания ELMO, и мне нужны строковые предложения, а не целочисленное кодирование.


person Behnaz Moradabadi    schedule 04.05.2019    source источник
comment
Возможный дубликат Разница в заполнении целого числа и строки в keras.   -  person giser_yugang    schedule 05.05.2019


Ответы (2)


Измените dtype на object, это сделает всю работу за вас.

from keras.preprocessing.sequence import pad_sequences

s = [["this", "is", "a", "book"], ["this", "is", "not"]]
g = pad_sequences(s, dtype=object, maxlen=10, value='_PAD_')
print(g)

Вывод:

array([['_PAD_', '_PAD_', '_PAD_', '_PAD_', '_PAD_', '_PAD_', 'this',
        'is', 'a', 'book'],
       ['_PAD_', '_PAD_', '_PAD_', '_PAD_', '_PAD_', '_PAD_', '_PAD_',
        'this', 'is', 'not']], dtype=object)
person John    schedule 07.09.2019

Текст должен быть сначала преобразован в числовые значения. Keras предоставляет токенизатор и два метода fit_on_texts и texts_to_sequences для работы с текстовыми данными.

См. эту документацию по keras здесь

Токенизатор: это помогает векторизовать текстовый корпус, превращая каждый текст либо в последовательность целых чисел (каждое целое число является индексом токена в словаре), либо в вектор, где коэффициент для каждого токена может быть двоичным, на основе слова считать

fit_on_texts: создает индекс словарного запаса, основанный на частоте слов.

texts_to_sequences: преобразует каждый текст в texts в последовательность целых чисел.

from keras.preprocessing import text, sequence
s = ["this", "is", "a", "book", "of my choice"]
tokenizer = text.Tokenizer(num_words=100,lower=True)
tokenizer.fit_on_texts(s)
seq_token = tokenizer.texts_to_sequences(s)
g = sequence.pad_sequences(seq_token, maxlen=10)
g

Выход

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 2],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 3],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 4],
       [0, 0, 0, 0, 0, 0, 0, 5, 6, 7]], dtype=int32)
person joel    schedule 29.05.2019