GloVe Text Summarization возвращает тарабарщину со стоп-словами

Я пытаюсь обучить модель суммирования теста Keras для создания нового заголовка для новостной статьи, которую затем можно сравнить с опубликованным заголовком. Я тренируюсь на GloVe 6B, затем предсказываю по статье, которую я почистил, удалив теги, проанализировав, удалив стоп-слова, лемматизировав, а затем воссоединившись. Мои результаты выглядят примерно так:

Первоначальный заголовок: В августе Форд отправился в Мэриленд, несмотря на якобы боязнь летать Сгенерированный заголовок: Мнение: the the the the to to

Текст статьи после очистки: Обвинительница Бретта Кавано Кристин Блейси Форд прошла проверку на детекторе лжи Мэриленд далеко от дома Калифорния, несмотря на предполагаемый страх летать Документы опубликованы в среду проверка на полиграфе проведена Фордом 7 августа Hilton Hotel Linthicum Heights Мэриленд далеко в Балтиморе Вашингтонский международный аэропорт Путь побега из тяжелого места Профессор Кристин Блейси Форд обвиняет кандидата в Верховный суд Бретта Кавано в сексуальном насилии в средней школе Путь к выходу из двери предположил, что дискомфорт вызван предполагаемой встречей с Кавано. Эта причина, по которой Форду нравится летать, ДеВарни сказал, что самолет в конечном счете замкнутое пространство далеко. Идентификационный отпуск Середина Атлантики 7 августа, полиграф дал показания Форда Сенату в 10:00 по восточному поясному времени в четверг.

Вот мой тренировочный код:

from __future__ import print_function

import pandas as pd
from sklearn.model_selection import train_test_split
from keras_text_summarization.library.utility.plot_utils import plot_and_save_history
from keras_text_summarization.library.seq2seq import Seq2SeqGloVeSummarizer
from keras_text_summarization.library.applications.fake_news_loader import fit_text
import numpy as np

LOAD_EXISTING_WEIGHTS = False


def main():
    np.random.seed(42)
    data_dir_path = './data'
    very_large_data_dir_path = './very_large_data'
    report_dir_path = './reports'
    model_dir_path = './models'

    print('loading csv file ...')
    df = pd.read_csv("dcr Man_Cleaned.csv")

    print('extract configuration from input texts ...')
    Y = df.Title
    X = df['Joined']
    config = fit_text(X, Y)

    print('configuration extracted from input texts ...')

    summarizer = Seq2SeqGloVeSummarizer(config)
    summarizer.load_glove(very_large_data_dir_path)

    if LOAD_EXISTING_WEIGHTS:
        summarizer.load_weights(weight_file_path=Seq2SeqGloVeSummarizer.get_weight_file_path(model_dir_path=model_dir_path))

    Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.2, random_state=42)

    print('training size: ', len(Xtrain))
    print('testing size: ', len(Xtest))

    print('start fitting ...')
    history = summarizer.fit(Xtrain, Ytrain, Xtest, Ytest, epochs=20, batch_size=16)

    history_plot_file_path = report_dir_path + '/' + Seq2SeqGloVeSummarizer.model_name + '-history.png'
    if LOAD_EXISTING_WEIGHTS:
        history_plot_file_path = report_dir_path + '/' + Seq2SeqGloVeSummarizer.model_name + '-history-v' + str(summarizer.version) + '.png'
    plot_and_save_history(history, summarizer.model_name, history_plot_file_path, metrics={'loss', 'acc'})


if __name__ == '__main__':
    main()

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


person Michael Kessler    schedule 16.10.2018    source источник


Ответы (1)


Итак, это очень широкий вопрос, и есть много вещей, которые могут пойти не так. Проблема здесь в том, что ваша модель застряла в классах по нескольким причинам:

  1. Скорее всего, у вас недостаточно данных, и модель не может извлечь из них уроки, поэтому она просто предсказывает наиболее вероятный результат.
  2. Ваша модель либо слишком большая, либо слишком маленькая. Если он слишком велик, он не сможет извлечь из данных достаточно информации, чтобы предсказать правильные слова, поэтому он просто предсказывает наиболее вероятные слова, чтобы минимизировать ошибку. Если он слишком мал, он не сможет выучить такую ​​сложную структуру, как естественный язык.

В любом случае, вы должны попытаться добавить несколько слоев, удалить некоторые слои, добавить некоторую регуляризацию, попробовать метод колеса рулетки для генерации следующего слова на основе вероятности слов. Надеюсь это поможет :)

person Novak    schedule 19.10.2018