window.event
не является особенностью, это ошибка!
Цитата MDN :
window.event
является запатентованным Microsoft Internet Explorer, доступное только при вызове обработчика событий DOM. Его значение - это объект Event, который в настоящее время обрабатывается.И самое главное:
Не является частью какой-либо спецификации.
window.event
является нестандартным, поэтому не ожидайте, что будут поддерживаться любые браузеры .Первым параметром функции обратного вызова в
element.addEventListener()
является объектEvent
, Используйте его вместоwindow.event
.
Итак, насколько я понял, у вас есть последовательность максимум 50 событий, на которые вы хотите сделать прогнозы. Эти события имеют прикрепленные текстовые данные, которые можно рассматривать как другую последовательность вложений слов.
Я бы предложил решение, которое включает в себя LSTM для текстовой части 1D-свертку для «реальной» части последовательности. Каждый слой LSTM объединяется с числовыми данными. Это включает в себя 50 слоев LSTM, которые могут потребовать много времени для обучения, даже если вы используете общие веса. Также возможно использовать только слои свертки для текстовой части, которая выполняется быстрее, но не моделирует долгосрочные зависимости. (У меня есть опыт, что эти долгосрочные зависимости часто не так важны для интеллектуального анализа текста).
Текст -> LSTM или 1DConv -> concat с числовыми данными -> 1DConv -> Выходные данные Вот какой код exmaple, который показывает, как использовать весы осколков
numeric_input = Input(shape=(x_numeric_train.values.shape[1],), name='numeric_input')
nlp_seq = Input(shape=(number_of_messages ,seq_length,), name='nlp_input'+str(i))
# shared layers
emb = TimeDistributed(Embedding(input_dim=num_features, output_dim=embedding_size,
input_length=seq_length, mask_zero=True,
input_shape=(seq_length, )))(nlp_seq)
x = TimeDistributed(Bidirectional(LSTM(32, dropout=0.3, recurrent_dropout=0.3, kernel_regularizer=regularizers.l2(0.01))))(emb)
c1 = Conv1D(filter_size, kernel1, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p1 = GlobalMaxPooling1D()(c1)
c2 = Conv1D(filter_size, kernel2, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p2 = GlobalMaxPooling1D()(c2)
c3 = Conv1D(filter_size, kernel3, padding='valid', activation='relu', strides=1, kernel_regularizer=regularizers.l2(kernel_reg))(x)
p3 = GlobalMaxPooling1D()(c3)
x = concatenate([p1, p2, p3, numeric_input])
x = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[nlp_seq, meta_input] , outputs=[x])
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])
И training:
model.fit([x_train, x_numeric_train], y_train)
# where x_train is a a array of num_samples * num_messages * seq_length
Для такой сложной модели требуется много данных для сближения. Для меньшего количества данных более простое решение может быть реализовано путем агрегирования событий, чтобы иметь только одну последовательность. Например, текстовые данные всех событий можно рассматривать как один единственный текст (с маркером разделителя) вместо нескольких текстов, в то время как числовые данные могут быть суммированы, усреднены или даже объединены в список фиксированной длины. Но это зависит от ваших данных.
Поскольку я работаю над чем-то подобным, я обновлю этот ответ с кодом позже.