def clean_text(document_string):
    """
    Function that takes in a document in
    the form of a string, and pre-processes
    it, returning a clean string ready
    to be used to fit a CountVectorizer.

    Pre-processing includes:
    - lower-casing text
    - eliminating punctuation
    - dealing with edge case punctuation
      and formatting
    - replacing contractions with
      the proper full words

    :param: document_string: str

    :returns: cleaned_text: str
    :returns: words: list
    """
    # Make text lowercase
    raw_text = document_string.lower()

    # Replace encoding error with a space
    raw_text = raw_text.replace('\xa0', ' ')

    # Normalize period formatting
    raw_text = raw_text.replace('. ', '.')
    raw_text = raw_text.replace('.', '. ')

    # Replace exclamation point with a space
    raw_text = raw_text.replace('!', ' ')

    # Replace slashes with empty
    raw_text = raw_text.replace('/', '')

    # Replace questin marks with empty
    raw_text = raw_text.replace('??', ' ')
    raw_text = raw_text.replace('?', ' ')

    # Replace dashes with space
    raw_text = raw_text.replace('-', ' ')
    raw_text = raw_text.replace('—', ' ')

    # Replace ... with empty
    raw_text = raw_text.replace('…', '')
    raw_text = raw_text.replace('...', '')

    # Replace = with 'equals'
    raw_text = raw_text.replace('=', 'equals')

    # Replace commas with empty
    raw_text = raw_text.replace(',', '')

    # Replace ampersand with and
    raw_text = raw_text.replace('&', 'and')

    # Replace semi-colon with empty
    raw_text = raw_text.replace(';', '')

    # Replace colon with empty
    raw_text = raw_text.replace(':', '')

    # Get rid of brackets
    raw_text = raw_text.replace('[', '')
    raw_text = raw_text.replace(']', '')

    # Replace parentheses with empty
    raw_text = raw_text.replace('(', '')
    raw_text = raw_text.replace(')', '')

    # Replace symbols with letters
    raw_text = raw_text.replace('$', 's')
    raw_text = raw_text.replace('¢', 'c')

    # Replace quotes with nothing
    raw_text = raw_text.replace('“', '')
    raw_text = raw_text.replace('”', '')
    raw_text = raw_text.replace('"', '')
    raw_text = raw_text.replace("‘", "")

    # Get rid of backslashes indicating contractions
    raw_text = raw_text.replace(r'\\', '')

    # Replace extra spaces with single space
    raw_text = raw_text.replace('   ', ' ')
    raw_text = raw_text.replace('  ', ' ')

    # Some apostrophes are of a different type --> ’ instead of '
    raw_text = raw_text.replace("’", "'")

    # Replace contractions with full words, organized alphabetically
    raw_text = raw_text.replace("can't", 'cannot')
    raw_text = raw_text.replace("didn't", 'did not')
    raw_text = raw_text.replace("doesn't", 'does not')
    raw_text = raw_text.replace("don't", 'do not')
    raw_text = raw_text.replace("hasn't", 'has not')
    raw_text = raw_text.replace("he's", 'he is')
    raw_text = raw_text.replace("i'd", 'i would')
    raw_text = raw_text.replace("i'll", 'i will')
    raw_text = raw_text.replace("i'm", 'i am')
    raw_text = raw_text.replace("isn't", 'is not')
    raw_text = raw_text.replace("it's", 'it is')
    raw_text = raw_text.replace("nobody's", 'nobody is')
    raw_text = raw_text.replace("she's", 'she is')
    raw_text = raw_text.replace("shouldn't", 'should not')
    raw_text = raw_text.replace("that'll", 'that will')
    raw_text = raw_text.replace("that's", 'that is')
    raw_text = raw_text.replace("there'd", 'there would')
    raw_text = raw_text.replace("they're", 'they are')
    raw_text = raw_text.replace("there's", 'there are')
    raw_text = raw_text.replace("we'd", 'we would')
    raw_text = raw_text.replace("we'll", 'we will')
    raw_text = raw_text.replace("we're", 'we are')
    raw_text = raw_text.replace("we've", 'we have')
    raw_text = raw_text.replace("wouldn't", 'would have')
    raw_text = raw_text.replace("you'd", 'you would')
    raw_text = raw_text.replace("you'll", 'you will')
    raw_text = raw_text.replace("you're", 'you are')
    raw_text = raw_text.replace("you've", 'you have')

    # Fix other contractions
    raw_text = raw_text.replace("'s", ' is')

    cleaned_text = raw_text

    # Extract tokens
    text_for_tokens = cleaned_text
    text_for_tokens = text_for_tokens.replace('.', '')
    words = text_for_tokens.split()

    return (cleaned_text, words)