This repository releases our code for the Refresh model. It is improved from our code for Sidenet. It uses Tensorflow 0.10, please use scripts provided by Tensorflow to translate them to newer upgrades.
Please contact me at [email protected] for any question.
Please cite this paper if you use our code or data:
Ranking Sentences for Extractive Summarization with Reinforcement Learning, Shashi Narayan, Shay B. Cohen and Mirella Lapata, NAACL 2018.
Single document summarization is the task of producing a shorter version of a document while preserving its principal information content. In this paper we conceptualize extractive summarization as a sentence ranking task and propose a novel training algorithm which globally optimizes the ROUGE evaluation metric through a reinforcement learning objective. We use our algorithm to train a neural summarization model on the CNN and DailyMail datasets and demonstrate experimentally that it outperforms state-of-the-art extractive and abstractive systems when evaluated automatically and by humans.
This extractive model was used as part of comparing this model's performance against the one used as part of the USP summarisation project. To run this model on corpora that is outside of the news-wire domain several additional data preperation utilities were written. These are the following:
combine_multi_oracle_files.py
-- Combines several moracle files together generated by theestimate_multi_oracles.py
scriptcorpora_splitter.py
-- Splits corpora into seperate files at a per-sentence level.preprocessed_data_preparer(-docker/-gpu).py
-- Computes the single oracle scores for a given set of corpora by calculating the cosine distance between source and target. CPU, Docker, and GPU based implementations available.vocab_mapper.py
-- Converts words and/or punctuation into word IDs or vice-versa.
These can be found in the scrpits\trivago-utils
directory.
The Refresh model requires Python 2.x and particular older version of Tensorflow. The requirements-2.7.txt
file contains the required dependencies. The trivago utilities are all based on Python 3.6 and the requirements can be found in the requirements-3.6.txt
file.
In addition to our code, please find links to additional files which are not uploaded here.
- Pretrained word embeddings trained on "1 billion word language modeling benchmark r13output" (405MB)
- Preprocessed CNN and DailyMail data: Articles are tokenized/segmented with the original case. Then, words are replaced with word ids in the word embedding file with (PAD_ID = 0, UNK_ID = 1). (1.9GB)
- Original Test and Validation mainbody data: These files are used to assemble summaries. (35MB)
- Gold Test and Validation highlights: These files are used to estimate ROUGE scores. (11MB)
We train for a certain number of epochs and then we estimate ROUGE score on the validation set after each epoch. The chosen models are the best ones performing on the validation set.
We have selected 20 (10 CNN and 10 DailyMail) articles. Please see our paper for the experiment setup.
Please download data using the above links and then either update my_flags.py
for the following parameters or pass them as in-line arguments:
pretrained_wordembedding: /address/data/1-billion-word-language-modeling-benchmark-r13output.word2vec.vec (Pretrained wordembedding file trained on the one million benchmark data)
preprocessed_data_directory: /address/data/preprocessed-input-directory (Preprocessed news articles)
gold_summary_directory: /address/data/Baseline-Gold-Models (Gold summary directory)
doc_sentence_directory: /address/data/CNN-DM-Filtered-TokenizedSegmented (Directory where document sentences are kept)
mkdir -p /address/to/training/directory/cnn-reinforcementlearn-singlesample-from-moracle-noatt-sample5
# Training
python document_summarizer_training_testing.py --use_gpu /gpu:2 --data_mode cnn --train_dir /address/to/training/directory/cnn-reinforcementlearn-singlesample-from-moracle-noatt-sample5 --num_sample_rollout 5 > /address/to/training/directory/cnn-reinforcementlearn-singlesample-from-moracle-noatt-sample5/train.log
# Evaluation
python document_summarizer_training_testing.py --use_gpu /gpu:2 --data_mode cnn --exp_mode test --model_to_load 11 --train_dir /address/to/training/directory/cnn-reinforcementlearn-singlesample-from-moracle-noatt-sample5 --num_sample_rollout 5 > /address/to/training/directory/cnn-reinforcementlearn-singlesample-from-moracle-noatt-sample5/test.model11.log
mkdir -p /address/to/training/directory/dailymail-reinforcementlearn-singlesample-from-moracle-noatt-sample15
# Training
python document_summarizer_training_testing.py --use_gpu /gpu:2 --data_mode dailymail --train_dir /address/to/training/directory/dailymail-reinforcementlearn-singlesample-from-moracle-noatt-sample15 --num_sample_rollout 15 > /address/to/training/directory/dailymail-reinforcementlearn-singlesample-from-moracle-noatt-sample15/train.log
# Evaluation
python document_summarizer_training_testing.py --use_gpu /gpu:2 --data_mode dailymail --exp_mode test --model_to_load 7 --train_dir /address/to/training/directory/dailymail-reinforcementlearn-singlesample-from-moracle-noatt-sample15 --num_sample_rollout 15 > /address/to/training/directory/dailymail-reinforcementlearn-singlesample-from-moracle-noatt-sample15/test.model7.log
Check our "scripts/oracle-estimator" to compute multiple oracles for your own dataset for training.
You could find a live demo of Refresh here.
See here for a light introduction of our paper written by nurture.ai.