summarize_from_feedback/datasets/cnndm.py (121 lines of code) (raw):
"""
all data originally from https://cs.nyu.edu/~kcho/DMQA/ and https://github.com/abisee/cnn-dailymail
"""
import hashlib
import json
import os
import re
import ftfy
from summarize_from_feedback.utils import blobs
dm_single_close_quote = "\u2019" # unicode
dm_double_close_quote = "\u201d"
END_TOKENS = [
".",
"!",
"?",
"...",
"'",
"`",
'"',
dm_single_close_quote,
dm_double_close_quote,
")",
] # acceptable ways to end a sentence
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 clean_up_highlights(line):
if line.startswith("NEW: "):
return line.split("NEW: ")[1].strip()
bad_prefixes = ["READ: ", "for all the latest "]
for prefix in bad_prefixes:
if line.startswith(prefix):
return ""
# these are bad even if they appear mid-highlight
bad_after = [
"CLICK HERE ",
"Click HERE ",
"Click here ",
"For confidential support call the Samaritans in the UK",
]
for bad in bad_after:
if bad in line:
line = line.split(bad)[0].strip()
return line
def get_article_and_highlights(story_file, refs_with_bullets=False, clean_highlights=True):
with open(story_file) as f:
original_text = f.read()
original_text = ftfy.fix_text(original_text)
original_text = original_text.replace("\xa0", " ") # hmm, not handled by ftfy?
article_lines = []
highlights = []
has_seen_highlight = False
for line in original_text.split("\n"):
if line == "":
continue # empty line
elif line.startswith("@highlight"):
assert line == "@highlight"
has_seen_highlight = True
elif has_seen_highlight:
if clean_highlights:
line = clean_up_highlights(line)
if not refs_with_bullets:
line = fix_missing_period(line)
if line:
highlights.append(line)
else:
article_lines.append(line)
article = "\n\n".join(article_lines)
article = clean_up_start(article)
if refs_with_bullets:
highlights = "- " + "\n- ".join(highlights)
else:
highlights = " ".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_url_info(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 url_hash, site
def clean_up_start(text):
text = re.split(r"\(CNN\) +--", text)[-1]
text = re.split(r"\(CNN\)", text[:100])[-1] + text[100:]
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_iter(split, subset="all", refs_with_bullets=False, clean_highlights=True):
if split == "valid":
split = "val"
with blobs.open_file_cached(
f"https://openaipublic.blob.core.windows.net/summarize-from-feedback/datasets/cnndm/url_lists/{subset}_{split}.txt"
) as f:
urls = [line.strip() for line in f]
with blobs.open_file_cached("https://openaipublic.blob.core.windows.net/summarize-from-feedback/datasets/cnndm/titles.json") as f:
titles = json.load(f)
urls_dir = blobs.download_directory_cached(
f"https://openaipublic.blob.core.windows.net/summarize-from-feedback/datasets/cnndm/cache_{split}"
)
for url in urls:
article_id, site = get_url_info(url)
path = os.path.join(urls_dir, site, "stories", f"{article_id}.story")
article, ref_sents = get_article_and_highlights(
path, refs_with_bullets=refs_with_bullets, clean_highlights=clean_highlights
)
yield dict(
article=article, reference=ref_sents, id=article_id, site=site, title=titles[article_id]
)
def cnndm_generator(split):
yield from _cnndm_iter(split, subset="all")
def cnndm_filtered_generator(split):
yield from _cnndm_iter(split, subset="filtered48to64", refs_with_bullets=True)
def cnndm_filtered_generator_short(split):
yield from _cnndm_iter(split, subset="filtered24to48")