lm_human_preferences/datasets/cnndm.py (79 lines of code) (raw):

import hashlib import os import random import re import ftfy from lm_human_preferences.utils import gcs dm_single_close_quote = u'\u2019' # unicode dm_double_close_quote = u'\u201d' END_TOKENS = ['.', '!', '?', '...', "'", "`", '"', dm_single_close_quote, dm_double_close_quote, ")"] # acceptable ways to end a sentence def read_text_file(text_file): lines = [] with open(text_file, "r") as f: for line in f: lines.append(line.strip()) return lines def fix_missing_period(line): """Adds a period to a line that is missing a period""" if "@highlight" in line: return line if line=="": return line if line[-1] in END_TOKENS: return line # print line[-1] return line + "." def get_art_abs(story_file): lines = read_text_file(story_file) # lines = [fix_missing_period(line) for line in lines] article_lines = [] highlights = [] next_is_highlight = False for line in lines: if line == "": continue # empty line elif line.startswith("@highlight"): next_is_highlight = True elif next_is_highlight: highlights.append(line) else: article_lines.append(line) article = '\n\n'.join(article_lines) # Make abstract into a single string, putting <s> and </s> tags around the sentences highlights = [fix_missing_period(sent) for sent in highlights] # abstract = ' '.join(["%s %s %s" % (SENTENCE_START, sent, SENTENCE_END) for sent in highlights]) # abstract = ' '.join(highlights) return article, highlights def hashhex(s): """Returns a heximal formated SHA1 hash of the input string.""" h = hashlib.sha1() h.update(s) return h.hexdigest() def get_path_of_url(url): if 'dailymail.co.uk' in url or 'mailonsunday.ie' in url or 'lib.store.yahoo.net' in url: site = 'dailymail' else: assert 'cnn.com' in url or 'cnn.hk' in url, url site = 'cnn' url_hash = hashhex(url.encode('utf-8')) return f'{site}/stories/{url_hash}.story' def clean_up_start(text): if text[:2] == 'By': text = '\n'.join(text.split('\n')[2:]) text = re.split(r'\(CNN\) +--', text)[-1] text = re.split(r"\(CNN\)", text[:100])[-1]+text[100:] text = re.sub(r"^and \w+\n", "", text) text = re.split(r".*UPDATED:\s+[0-9]{2}:[0-9]{2}.*[2011|2012|2013|2014|2015]", text)[-1] text = text.replace('’', "'") text = text.replace('‘', "'") return text.strip() def cnndm_generator(mode, seed=0, shuffle=False, comm=None): # data originally from https://github.com/abisee/cnn-dailymail if mode == 'valid': mode = 'val' with open(gcs.download_file_cached(f'https://openaipublic.blob.core.windows.net/lm-human-preferences/datasets/cnndm/url_lists/all_{mode}.txt', comm=comm)) as f: urls = [line.strip() for line in f] if shuffle: random.seed(seed) random.shuffle(urls) # if n_eval > 0: # urls = urls[:n_eval] urls_dir = gcs.download_directory_cached(f'gs://lm-human-preferences/datasets/cnndm/cache_{mode}', comm=comm) for i, url in enumerate(urls): path = os.path.join(urls_dir, get_path_of_url(url)) text = open(path).read() text = clean_up_start(text) text = ftfy.fix_text(text) text = re.sub(r"\n{3,}", "\n\n", text) text = text.split('@highlight')[0].strip() yield text # _, ref_sents = get_art_abs(path)