def trainIters(self): iter = self.setup_train() count = mle_total = r_total = 0 while iter <= config.max_iterations: batch = self.batcher.next_batch() try: mle_loss, r = self.train_one_batch(batch, iter) except KeyboardInterrupt: print( "-------------------Keyboard Interrupt------------------") exit(0) mle_total += mle_loss r_total += r count += 1 iter += 1 if iter % 50 == 0: mle_avg = mle_total / count r_avg = r_total / count logger.info("iter:" + str(iter) + " mle_loss:" + "%.3f" % mle_avg + " reward:" + "%.4f" % r_avg) count = mle_total = r_total = 0 if iter % 5000 == 0: self.save_model(iter)
def evaluate_batch(self, article): self.setup_valid() batch = self.batcher.next_batch() start_id = self.vocab.word2id(data.START_DECODING) end_id = self.vocab.word2id(data.STOP_DECODING) unk_id = self.vocab.word2id(data.UNKNOWN_TOKEN) decoded_sents = [] ref_sents = [] article_sents = [] rouge = Rouge() while batch is not None: enc_batch, enc_lens, enc_padding_mask, enc_batch_extend_vocab, extra_zeros, ct_e = get_enc_data( batch) with T.autograd.no_grad(): enc_batch = self.model.embeds(enc_batch) enc_out, enc_hidden = self.model.encoder(enc_batch, enc_lens) #-----------------------Summarization---------------------------------------------------- with T.autograd.no_grad(): pred_ids = beam_search(enc_hidden, enc_out, enc_padding_mask, ct_e, extra_zeros, enc_batch_extend_vocab, self.model, start_id, end_id, unk_id) for i in range(len(pred_ids)): decoded_words = data.outputids2words(pred_ids[i], self.vocab, batch.art_oovs[i]) if len(decoded_words) < 2: decoded_words = "xxx" else: decoded_words = " ".join(decoded_words) decoded_sents.append(decoded_words) abstract = batch.original_abstracts[i] article = batch.original_articles[i] ref_sents.append(abstract) article_sents.append(article) batch = self.batcher.next_batch() load_file = self.opt.load_model if article: self.print_original_predicted(decoded_sents, ref_sents, article_sents, load_file) scores = rouge.get_scores(decoded_sents, ref_sents) rouge_1 = sum([x["rouge-1"]["f"] for x in scores]) / len(scores) rouge_2 = sum([x["rouge-2"]["f"] for x in scores]) / len(scores) rouge_l = sum([x["rouge-l"]["f"] for x in scores]) / len(scores) logger.info(load_file + " rouge_1:" + "%.4f" % rouge_1 + " rouge_2:" + "%.4f" % rouge_2 + " rouge_l:" + "%.4f" % rouge_l)
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--task", type=str, default="validate", choices=["validate", "test", "demo"]) parser.add_argument("--start_from", type=str, default="0160000.tar") parser.add_argument("--load_model", type=str, default='0195000.tar') opt = parser.parse_args() if opt.task == "validate": saved_models = os.listdir(config.save_model_path) saved_models.sort() file_idx = saved_models.index(opt.start_from) saved_models = saved_models[file_idx:] for f in saved_models: opt.load_model = f eval_processor = Evaluate(config.valid_data_path, opt) eval_processor.evaluate_batch(False) elif opt.task == "test": eval_processor = Evaluate(config.test_data_path, opt) eval_processor.evaluate_batch(True) else: demo_processor = Demo(opt) logger.info( demo_processor.abstract( '就在对接货币基金的互联网理财产品诞生一周年的时候余额宝们的收益率破5已悄然成常态而数据显示今年截至6月6日市场上654只债券基金AB类份额分开计算平均收益率达451%且有248只债基产品收益率超过5%占比38%' ))
def decode(self): start = time.time() counter = 0 batch = self.batcher.next_batch() decoded_result = [] refered_result = [] article_result = [] while batch is not None: # Run beam search to get best Hypothesis best_summary = self.beam_search(batch) # Extract the output ids from the hypothesis and convert back to words output_ids = [int(t) for t in best_summary.tokens[1:]] decoded_words = data.outputids2words( output_ids, self.vocab, (batch.art_oovs[0] if config.pointer_gen else None)) # Remove the [STOP] token from decoded_words, if necessary try: fst_stop_idx = decoded_words.index(data.STOP_DECODING) decoded_words = decoded_words[:fst_stop_idx] except ValueError: decoded_words = decoded_words original_abstract_sents = batch.original_abstracts_sents[0] article = batch.original_articles[0] #write_for_rouge(original_abstract_sents, decoded_words, counter, # self._rouge_ref_dir, self._rouge_dec_dir) decoded_sents = [] while len(decoded_words) > 0: try: fst_period_idx = decoded_words.index(".") except ValueError: fst_period_idx = len(decoded_words) sent = decoded_words[:fst_period_idx + 1] decoded_words = decoded_words[fst_period_idx + 1:] decoded_sents.append(' '.join(sent)) # pyrouge calls a perl script that puts the data into HTML files. # Therefore we need to make our output HTML safe. decoded_sents = [make_html_safe(w) for w in decoded_sents] reference_sents = [ make_html_safe(w) for w in original_abstract_sents ] decoded_result.append(' '.join(decoded_sents)) refered_result.append(' '.join(reference_sents)) article_result.append(article) counter += 1 if counter % 1000 == 0: print('%d example in %d sec' % (counter, time.time() - start)) start = time.time() batch = self.batcher.next_batch() print("Decoder has finished reading dataset for single_pass.") print("Now starting ROUGE eval...") load_file = self.model_path_name self.print_original_predicted(decoded_result, refered_result, article_result, load_file) rouge = Rouge() scores = rouge.get_scores(decoded_result, refered_result) rouge_1 = sum([x["rouge-1"]["f"] for x in scores]) / len(scores) rouge_2 = sum([x["rouge-2"]["f"] for x in scores]) / len(scores) rouge_l = sum([x["rouge-l"]["f"] for x in scores]) / len(scores) rouge_1_r = sum([x["rouge-1"]["r"] for x in scores]) / len(scores) rouge_2_r = sum([x["rouge-2"]["r"] for x in scores]) / len(scores) rouge_l_r = sum([x["rouge-l"]["r"] for x in scores]) / len(scores) rouge_1_p = sum([x["rouge-1"]["p"] for x in scores]) / len(scores) rouge_2_p = sum([x["rouge-2"]["p"] for x in scores]) / len(scores) rouge_l_p = sum([x["rouge-l"]["p"] for x in scores]) / len(scores) log_str = " rouge_1:" + "%.4f" % rouge_1 + " rouge_2:" + "%.4f" % rouge_2 + " rouge_l:" + "%.4f" % rouge_l log_str_r = " rouge_1_r:" + "%.4f" % rouge_1_r + " rouge_2_r:" + "%.4f" % rouge_2_r + " rouge_l_r:" + "%.4f" % rouge_l_r logger.info(load_file + " rouge_1:" + "%.4f" % rouge_1 + " rouge_2:" + "%.4f" % rouge_2 + " rouge_l:" + "%.4f" % rouge_l) log_str_p = " rouge_1_p:" + "%.4f" % rouge_1_p + " rouge_2_p:" + "%.4f" % rouge_2_p + " rouge_l_p:" + "%.4f" % rouge_l_p results_file = os.path.join(self._decode_dir, "ROUGE_results.txt") with open(results_file, "w") as f: f.write(log_str + '\n') f.write(log_str_r + '\n') f.write(log_str_p + '\n')