Почему вы не используете обычную модель, используемую в НЛП?
Эти события могут быть переведены, как вы говорите, путем встраивания матрицы.
Затем вы можете представить цепочки событий, используя LSTM (или GRU или RNN или двусторонний LSTM), отличие использования LSTM вместо обычной сети состоит в том, что вы используете один и тот же модуль, повторенный N раз.
Таким образом, ваш вклад на самом деле не 460 000, а внутренне событие A косвенно помогает вам узнать о событии B. Это потому, что LSTM имеет модуль, который повторяется для каждого события в цепочке.
У вас есть пример здесь:
https://www.kaggle.com/ngyptr/lstm-sentiment-analysis-keras
В общих чертах, я бы сделал следующее (в псевдокоде Keras):
- Определить количество общих событий. Я генерирую уникальный список.
unique_events = list (set ([event_0, ..., event_n]))
You can perform the translation of a sequence with:
seq_events_idx = map (unique_events.index, seq_events)
- Добавьте необходимый пэд в каждую последовательность:
sequences_pad = pad_sequences (sequences, max_seq)
- Затем вы можете напрямую использовать вложение для переноса события в связанный вектор измерения, которое вы рассматриваете.
input_ = Input (shape = (max_seq,), dtype = 'int32')
embedding = Embedding (len(unique_events),
dimensions,
input_length = max_seq,
trainable = True) (input_)
- Затем вы определяете архитектуру вашего LSTM (например):
lstm = LSTM (128, input_shape = (max_seq, dimensions), dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True) (embedding)
- Добавьте плотность и результат, который вы хотите:
out = Dense (10, activation = 'softmax') (lstm)
Я думаю, что этот тип модели может помочь вам и дать лучшие результаты.