Я обучил и протестировал 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, если слово не найдено? Спасибо
Отредактировано. Надеюсь, теперь все ясно.






Все очень просто. Вы предоставляете Vocab_size, то есть количество слов, известное слою встраивания. Если вы передадите индекс, который находится за пределами vocab_size (новое слово), он будет проигнорирован, или keras выдаст ошибку.
Это отвечает на ваш вопрос о том, следует ли включать все данные для вашей матрицы встраивания. Да, ты должен.
Большое спасибо .. но дело в том, что в чем смысл иметь обученную модель, если вам нужно изменить матрицу встраивания для всех новых данных. В идеале я знаю, что она уже должна включать слова, которые вы ожидаете иметь в своих тестовых данных, но некоторые слова всегда новые. Текст Keras для последовательностей просто пропускает новые слова, но я также использую теги POS, поэтому я не хочу путаться с длиной предложения.Есть ли способ указать тексту последовательности использовать специальное целое число для всех новых слов, так что по крайней мере длина предложения осталась прежней?
Обычная практика - обучать ваши вложения на огромном наборе данных, таком как Википедия, а затем повторно использовать встраивание для вашей задачи. Например, вы можете использовать предварительно обученные вложения Glove, word2vec или fastText. Или вы можете использовать вложения подслов.
Я использую Glove, обученный на твитах, но вопрос не в том, что, если эти слова не найдены, предварительно обученная модель GloVe. Моя проблема в том, что я использовал его для создания матрицы встраивания из обучающего набора. Что, если тестовые данные содержат несколько новых слов, как вы упомянули в своем первом комментарии? Как мне с этим справиться? Спасибо
Не знаю, правильно ли я понял. Вы используете только те вложения перчаток, которые имели место в обучающем наборе в тестовом примере? Тогда решение состоит в том, чтобы просто использовать все вложения перчаток в вашей матрице встраивания, а не только те изменения, которые произошли на этапе обучения.
Да, я строю матрицу встраивания со словами в обучающем наборе ... Думаю, как обычно это происходит. Я добавил код. Я предполагаю, что решение состоит в том, чтобы либо добавить вложения для всех слов в новых тестовых данных, либо использовать какой-то конкретный индекс для всех неизвестных слов.
Не могли бы вы сконцентрироваться на одном вопросе и указать MVCE?