word2Vec и сокращения

Я работаю над задачей классификации текста, где мой набор данных содержит много сокращений и имен собственных. Например: Milka Choc. бар.
Моя идея состоит в том, чтобы использовать двунаправленную модель LSTM с встраиванием в word2vec.
И вот моя проблема, как закодировать слова, которых нет в словаре? Я частично решил эту проблему путем объединения предварительно обученных векторов со случайно инициализированными. Вот моя реализация:

import gensim
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess

from gensim.models.keyedvectors import KeyedVectors

word_vectors = KeyedVectors.load_word2vec_format('ru.vec', binary=False, unicode_errors='ignore')

EMBEDDING_DIM=300
vocabulary_size=min(len(word_index)+1,num_words)
embedding_matrix = np.zeros((vocabulary_size, EMBEDDING_DIM))
for word, i in word_index.items():
    if i>=num_words:
        continue
    try:
        embedding_vector = word_vectors[word]
        embedding_matrix[i] = embedding_vector
    except KeyError:
        embedding_matrix[i]=np.random.normal(0,np.sqrt(0.25),EMBEDDING_DIM)

def LSTMModel(X,words_nb, embed_dim, num_classes):
    _input = Input(shape=(X.shape[1],))
    X = embedding_layer = Embedding(words_nb,
                            embed_dim,
                            weights=[embedding_matrix],
                            trainable=True)(_input)
   X = The_rest_of__the_LSTM_model()(X)

Считаете ли вы, что позволить модели корректировать веса встраивания - это хорошая идея? Не могли бы вы сказать мне, как я могу кодировать слова, как шоколад? Очевидно, эта аббревиатура расшифровывается как шоколад.

2 ответа

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

Для решения этой проблемы у вас есть 3 варианта:

  1. Вы позволяете LSTM на верхнем уровне выяснить, что слово может означать, основываясь на его контексте. Например, я люблю шоколад. LSTM может понять, что это объект. Это было продемонстрировано сетями памяти.
  2. Простой вариант, предварительная обработка, максимально возможная канонизация перед передачей модели. Программы проверки правописания часто очень хорошо их фиксируют и очень быстрые.
  3. Вы можете использовать кодировку символов вдоль стороны word2vec. Это используется во многих моделях, отвечающих на вопросы, таких как BiDAF, где символьное представление объединено с word2vec, так что у вас есть некоторая информация, касающаяся символов в словах. В этом случае шоколад может быть похож на шоколад.

Один из способов сделать это - добавить функцию, которая отображает ваши аббревиатуры в существующие векторы, которые, скорее всего, будут связаны, т.е. инициализировать вектор choc для шоколадного вектора в w2v.

word_in_your_embedding_matrix[:len(abbreviated_word)]

Есть два возможных случая:

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