Прогнозирование текстовых данных с помощью keras

Я обучил и протестировал CNN для анализа настроений. Данные поезда и теста были подготовлены таким же образом, при этом предложение было размечено и предоставлены уникальные целые числа:

tokenizer = Tokenizer(filters='$%&()*/:;<=>@[\\]^`{|}~\t\n')
tokenizer.fit_on_texts(text)
vocab_size = len(tokenizer.word_index) + 1
sequences = tokenizer.texts_to_sequences(text)

Затем предварительно обученная модель перчатки для создания матрицы внедрения для CNN как:

filepath_glove = 'glove.twitter.27B.200d.txt'
glove_vocab = []
glove_embd=[]
embedding_dict = {}

file = open(filepath_glove,'r',encoding='UTF-8')
for line in file.readlines():
    row = line.strip().split(' ')
    vocab_word = row[0]
    glove_vocab.append(vocab_word)
    embed_vector = [float(i) for i in row[1:]] # convert to list of float
    embedding_dict[vocab_word]=embed_vector
   file.close()
  for word, index in tokenizer.word_index.items(): 
 `embedding_matrix[index] = embedding_dict[word]`

На этом этапе я также использовал тестовые предложения для создания этой матрицы, которая позже была передана в качестве весов в слой встраивания:

e= Embedding(vocab_size, 200, input_length=maxSeqLength, weights=[embedding_matrix], trainable=False)(inp)

Теперь я хочу перезагрузить свою модель и протестировать с некоторыми новыми данными, но это будет означать, что матрица встраивания не будет включать некоторые слова из новых данных. Это заставляет меня задаться вопросом, что, если даже раньше я не должен был включать тестовые данные при создании матрицы встраивания? А если нет, то как слой встраивания работает с этими новыми словами? Эта часть похожа на этот вопрос, но я не смог найти ответа: Как работает слой встраивания Keras, если слово не найдено? Спасибо

Не могли бы вы сконцентрироваться на одном вопросе и указать MVCE?

sophros 30.07.2018 18:15

Отредактировано. Надеюсь, теперь все ясно.

Ayza 30.07.2018 18:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
477
1

Ответы 1

Все очень просто. Вы предоставляете Vocab_size, то есть количество слов, известное слою встраивания. Если вы передадите индекс, который находится за пределами vocab_size (новое слово), он будет проигнорирован, или keras выдаст ошибку.

Это отвечает на ваш вопрос о том, следует ли включать все данные для вашей матрицы встраивания. Да, ты должен.

Большое спасибо .. но дело в том, что в чем смысл иметь обученную модель, если вам нужно изменить матрицу встраивания для всех новых данных. В идеале я знаю, что она уже должна включать слова, которые вы ожидаете иметь в своих тестовых данных, но некоторые слова всегда новые. Текст Keras для последовательностей просто пропускает новые слова, но я также использую теги POS, поэтому я не хочу путаться с длиной предложения.Есть ли способ указать тексту последовательности использовать специальное целое число для всех новых слов, так что по крайней мере длина предложения осталась прежней?

Ayza 31.07.2018 11:13

Обычная практика - обучать ваши вложения на огромном наборе данных, таком как Википедия, а затем повторно использовать встраивание для вашей задачи. Например, вы можете использовать предварительно обученные вложения Glove, word2vec или fastText. Или вы можете использовать вложения подслов.

ixeption 31.07.2018 11:32

Я использую Glove, обученный на твитах, но вопрос не в том, что, если эти слова не найдены, предварительно обученная модель GloVe. Моя проблема в том, что я использовал его для создания матрицы встраивания из обучающего набора. Что, если тестовые данные содержат несколько новых слов, как вы упомянули в своем первом комментарии? Как мне с этим справиться? Спасибо

Ayza 31.07.2018 15:42

Не знаю, правильно ли я понял. Вы используете только те вложения перчаток, которые имели место в обучающем наборе в тестовом примере? Тогда решение состоит в том, чтобы просто использовать все вложения перчаток в вашей матрице встраивания, а не только те изменения, которые произошли на этапе обучения.

ixeption 31.07.2018 17:11

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

Ayza 31.07.2018 18:08

Другие вопросы по теме