Мне любопытно, как я могу добавить нормализованный рандомизированный вектор размерности 300 (element 'type = tf.float32) всякий раз, когда встречается слово, неизвестное предварительно обученному словарю. Я использую предварительно подготовленные словарные вставки GloVe, но в некоторых случаях я понимаю, что сталкиваюсь с неизвестными словами, и я хочу создать нормализованный рандомизированный вектор слов для этого нового найденного неизвестного слова.
Проблема в том, что с моей текущей настройкой я использую tf.contrib.lookup.index_table_from_tensor для преобразования из слов в целые числа на основе известный словарь. Эта функция может создавать новые токены и хешировать их для некоторого предопределенного количества слов из словаря, но мой embed
не будет содержать вложение для этого нового неизвестного значения хэш-функции. Я не уверен, могу ли я просто добавить рандомизированное вложение в конец списка embed
.
Я также хотел бы сделать это эффективным образом, поэтому, возможно, была бы наиболее эффективной функция pre-built shadoworflow или метод, включающий функции tensorflow. Я определяю заранее известные специальные маркеры, такие как токен конца предложения, и по умолчанию неизвестно как пустая строка ( "по индексу 0" ), но это ограничено по возможности изучать разные разные неизвестные слова. В настоящее время я использую tf.nn.embedding_lookup() как последний шаг внедрения.
Я хотел бы иметь возможность добавлять новые случайные 300d-векторы для каждого неизвестного слова в данных обучения, и я также хотел бы добавить заранее сделанные случайные векторы слов для любых неизвестных токенов, не встречающихся в процессе обучения, которые, возможно, встречаются во время тестирование. Каков наиболее эффективный способ сделать это?
def embed_tensor(string_tensor, trainable=True):
"""
Convert List of strings into list of indicies then into 300d vectors
"""
# ordered lists of vocab and corresponding (by index) 300d vector
vocab, embed = load_pretrained_glove()
# Set up tensorflow look up from string word to unique integer
vocab_lookup = tf.contrib.lookup.index_table_from_tensor(
mapping=tf.constant(vocab),
default_value = 0)
string_tensor = vocab_lookup.lookup(string_tensor)
# define the word embedding
embedding_init = tf.Variable(tf.constant(np.asarray(embed),
dtype=tf.float32),
trainable=trainable,
name="embed_init")
# return the word embedded version of the sentence (300d vectors/word)
return tf.nn.embedding_lookup(embedding_init, string_tensor)