Find out human defined keywords in a text string.

    Searches for the string "Keywords:" and its declinations and matches the
    following words.

def get_author_keywords(skw_db, ckw_db, fulltext):
    """Find out human defined keywords in a text string.

    Searches for the string "Keywords:" and its declinations and matches the
    following words.
    """
    timer_start = time.clock()
    out = {}

    split_string = current_app.config[
        "CLASSIFIER_AUTHOR_KW_START"
    ].split(fulltext, 1)
    if len(split_string) == 1:
        current_app.logger.info(
            "No keyword marker found when matching authors.")
        return out

    kw_string = split_string[1]

    for regex in current_app.config["CLASSIFIER_AUTHOR_KW_END"]:
        parts = regex.split(kw_string, 1)
        kw_string = parts[0]

    # We separate the keywords.
    author_keywords = current_app.config[
        "CLASSIFIER_AUTHOR_KW_SEPARATION"
    ].split(kw_string)

    current_app.logger.info(
        "Matching author keywords... %d keywords found in "
        "%.1f sec." % (len(author_keywords), time.clock() - timer_start)
    )

    for kw in author_keywords:
        # If the author keyword is an acronym with capital letters
        # separated by points, remove the points.
        if re.match('([A-Z].)+$', kw):
            kw = kw.replace('.', '')

        # Drop trailing dots such as those in the last keyword.
        if kw.endswith('.'):
            kw = kw[:-1]

        # First try with the keyword as such, then lower it.
        kw_with_spaces = ' %s ' % kw
        matching_skw = get_single_keywords(skw_db, kw_with_spaces)
        matching_ckw = get_composite_keywords(ckw_db, kw_with_spaces,
                                              matching_skw)

        if matching_skw or matching_ckw:
            out[kw] = (matching_skw, matching_ckw)
            continue

        lowkw = kw.lower()

        matching_skw = get_single_keywords(skw_db, ' %s ' % lowkw)
        matching_ckw = get_composite_keywords(ckw_db, ' %s ' % lowkw,
                                              matching_skw)

        out[kw] = (matching_skw, matching_ckw)

    return out