Контролируемое извлечение текстового суммирования - PullRequest
0 голосов
/ 21 января 2019

Я хочу извлечь потенциальные предложения из новостных статей, которые могут быть частью резюме статьи.

Потратив некоторое время, я обнаружил, что этого можно достичь двумя способами:

  1. Добывающее суммирование (извлечение предложений из текста и их сбор)
  2. Абстрактное суммирование (представление на внутреннем языке для создания более похожих на людей резюме)

Ссылка: редко-технологии.com

Я следовал abigailsee Get To The Point: суммирование с сетями указателей-генераторов для суммирования, которое давало хорошие результаты с предварительно обученной моделью, но оно было абстрагирующим.

Проблема: Большинство извлеченных сумматоров, которые я до сих пор просматривал (PyTeaser, PyTextRank и Gensim), основаны не на контролируемом обучении, а на наивном байесовском классификаторе, tf – idf, POS-тегирование, ранжирование предложений на основе частоты ключевых слов, позиции и т. д., которые не требуют обучения.

Несколько вещей, которые я до сих пор пытался извлечь потенциальные сводные предложения.

  • Получить все предложения статей и пометить итоговые предложения как 1 и 0 для всех остальных
  • Очистить текст и применить фильтры стоп-слов
  • Векторизовать корпус текста с помощью токенизатора from keras.preprocessing.text import Tokenizer с размером словаря 20000 и дополнить все последовательности средней длиной всех предложений.
  • Построить SqequentialКерас моделирует поезд.
model_lstm = Sequential()
model_lstm.add(Embedding(20000, 100, input_length=sentence_avg_length))
model_lstm.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model_lstm.add(Dense(1, activation='sigmoid'))
model_lstm.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

Это дает очень низкую точность ~ 0,2

Я думаю, это потому, что приведенная выше модель больше подходит для положительных / отрицательных предложений, чемклассификация суммарных / несводных предложений.

Будем признательны за любые рекомендации по подходу к решению этой проблемы.

1 Ответ

0 голосов
/ 22 января 2019

Я думаю, это потому, что вышеприведенная модель больше подходит для положительных / отрицательных предложений, а не для классификации суммарных / неполных предложений.

Это верно.Вышеуказанная модель используется для двоичной классификации, а не для суммирования текста.Если вы заметили, вывод (Dense(1, activation='sigmoid')) дает вам только оценку от 0 до 1, в то время как при суммировании текста нам нужна модель, которая генерирует последовательность токенов.

Что мне делать?

Доминирующей идеей решения этой проблемы являются модели кодер-декодер (также известные как seq2seq).Есть хороший учебник по репозиторию Keras, который используется для машинного перевода, но его довольно легко адаптировать для суммирования текста.

Основная часть кода:

from keras.models import Model
from keras.layers import Input, LSTM, Dense

# Define an input sequence and process it.
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]

# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(None, num_decoder_tokens))
# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the 
# return states in the training model, but we will use them in inference.
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs,
                                     initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)

# Define the model that will turn
# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

# Run training
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

Исходя из вышеприведенной реализации, необходимо передать encoder_input_data, decoder_input_data и decoder_target_data в model.fit(), которые соответственно являются входным текстом и суммируют версию текста.

Обратите внимание, что decoder_input_data и decoder_target_data - это одно и то же, за исключением того, что decoder_target_data на один токен опережает decoder_input_data.

Это дает очень низкую точность ~0.2

Я думаю, это потому, что вышеприведенная модель больше подходит для положительных / отрицательных предложений, а не для классификации суммарных / неполных предложений.

Низкая точность, вызванная различными причинамив том числе небольшой тренировочный размер, переоснащение, подгонка и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...