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 варианта:
- Вы позволяете LSTM на верхнем уровне выяснить, что слово может означать, основываясь на его контексте. Например, я люблю шоколад. LSTM может понять, что это объект. Это было продемонстрировано сетями памяти.
- Простой вариант, предварительная обработка, максимально возможная канонизация перед передачей модели. Программы проверки правописания часто очень хорошо их фиксируют и очень быстрые.
- Вы можете использовать кодировку символов вдоль стороны word2vec. Это используется во многих моделях, отвечающих на вопросы, таких как BiDAF, где символьное представление объединено с word2vec, так что у вас есть некоторая информация, касающаяся символов в словах. В этом случае шоколад может быть похож на шоколад.
Один из способов сделать это - добавить функцию, которая отображает ваши аббревиатуры в существующие векторы, которые, скорее всего, будут связаны, т.е. инициализировать вектор choc для шоколадного вектора в w2v.
word_in_your_embedding_matrix[:len(abbreviated_word)]
Есть два возможных случая:
- Есть только один кандидат, который начинается с тех же n букв, что и ваша аббревиатура, тогда вы можете инициализировать вложение вашей аббревиатуры с этим вектором.
- Есть несколько элементов, которые начинаются с тех же n букв, что и ваше сокращение, вы можете использовать среднее значение в качестве вектора инициализации yout.