1 - Да, уникальность слова не гарантируется, см. документы :
- С
one_hot
: Это оболочка для функции hashing_trick
... - С
hashing_trick
: «Для одного и того же индекса могут быть назначены два или более слова из-за возможных коллизий с помощью функции хеширования . Вероятность коллизии зависит от измеренияпространства хеширования и количества различных объектов. "
Было бы лучше использовать Tokenizer
для этого.(См. Вопрос 4)
Очень важно помнить , что вы должны задействовать все слова одновременно при создании индексов.Вы не можете использовать функцию для создания словаря с 2 словами, затем снова с 2 словами, затем снова .... Это создаст очень неправильные словари.
2 - Вложения имеют размер 50 x 8
, поскольку они были определены в слое внедрения:
Embedding(vocab_size, 8, input_length=max_length)
vocab_size = 50
- это означает, что имеется 50 словв словаре embedding_size= 8
- это истинный размер вложения: каждое слово представлено вектором из 8 чисел.
3 - Вы нея знаюОни используют одинаковое вложение.
Система будет использовать то же вложение (тот, что для index = 2).Это совсем не здорово для вашей модели.Вы должны использовать другой метод для создания индексов в вопросе 1.
4 - Вы можете создать словарь слов вручную или использовать класс Tokenizer
.
Вручную :
Убедитесь, что вы удалили пунктуацию, сделайте все слова строчными.
Просто создайте словарь для каждого имеющегося у вас слова:
dictionary = dict()
current_key = 1
for doc in docs:
for word in doc.split(' '):
#make sure you remove punctuation (this might be boring)
word = word.lower()
if not (word in dictionary):
dictionary[word] = current_key
current_key += 1
Tokenizer:
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
#this creates the dictionary
#IMPORTANT: MUST HAVE ALL DATA - including Test data
#IMPORTANT2: This method should be called only once!!!
tokenizer.fit_on_texts(docs)
#this transforms the texts in to sequences of indices
encoded_docs2 = tokenizer.texts_to_sequences(docs)
См. Вывод encoded_docs2
:
[[6, 2], [3, 1], [7, 4], [8, 1], [9], [10], [5, 4], [11, 3], [5, 1], [12, 13, 2, 14]]
См. Максимальный индекс:
padded_docs2 = pad_sequences(encoded_docs2, maxlen=max_length, padding='post')
max_index = array(padded_docs2).reshape((-1,)).max()
Итак, ваш vocab_size
должно быть 15 (иначе у вас будет много бесполезных - и безвредных - встраивание строк).Обратите внимание, что 0
не использовался в качестве индекса.Он появится в отступе !!!
Не «подгонять» токенизатор снова!Используйте только texts_to_sequences()
или другие методы здесь , которые не относятся к "подгонке".
Подсказка: может быть полезно иногда включать в свой текст end_of_sentence
слова.
Подсказка2: это хорошая идея, чтобы сохранить Tokenizer
для последующего использования (так как он имеет специфический режим для ваших данных, созданный с помощью fit_on_texts
).
#save:
text_to_save = tokenizer.to_json()
#load:
from keras.preprocessing.text import tokenizer_from_json
tokenizer = tokenizer_from_json(loaded_text)
5 - правильные параметры для встраивания.
Плотность:
Параметры для Dense
всегда основаны на предыдущем слое (Flatten
в этом случае).
Формула: previous_output * units + units
Это приводит к 32 (from the Flatten) * 1 (Dense units) + 1 (Dense bias=units) = 33
Сглаживание:
Получает все предыдущиеумноженные размеры = 8 * 4
.
Embedding
выводит lenght = 4
и embedding_size = 8
.
6 - Уровень Embedding
не зависит от ваших данных и от того, как вы их предварительно обрабатываете,
Слой Embedding
имеет просто размер 50 x 8, потому что вы так сказали.(См. Вопрос 2)
Есть, конечно, более эффективные способы предварительной обработки данных - см. Вопрос 4.
Это поможет вам лучше выбрать vocab_size
(то есть размер словаря).
Видя вложение слова:
Получить матрицу вложения:
embeddings = model.layers[0].get_weights()[0]
Выбрать любой индекс слова:
embeding_for_word_7 = embeddings[7]
Вот таквсе.
Если вы используете токенизатор, получите индекс слова с помощью:
index = tokenizer.texts_to_sequences([['word']])[0][0]