Try to process text on the `index_page` deduce the keywords and then try
    to match them on the Aleph's dataset.

    Function returns maximally `no_items` items, to prevent spamming the user.

    Args:
        index_page (str): Content of the page as UTF-8 string
        no_items (int, default 5): Number of items to return.

    Returns:
        list: List of :class:`.SourceString` objects.

def extract_keywords_from_text(index_page, no_items=5):
    """
    Try to process text on the `index_page` deduce the keywords and then try
    to match them on the Aleph's dataset.

    Function returns maximally `no_items` items, to prevent spamming the user.

    Args:
        index_page (str): Content of the page as UTF-8 string
        no_items (int, default 5): Number of items to return.

    Returns:
        list: List of :class:`.SourceString` objects.
    """
    index_page = MLStripper.strip_tags(index_page)
    tokenized_index = TextBlob(index_page).lower()

    def to_str(key):
        if isinstance(key, unicode):
            return key.encode("utf-8")

        return key

    present_keywords = [
        KEYWORDS_LOWER[key]
        for key in KEYWORDS_LOWER.keys()
        if len(key) > 3 and key in tokenized_index
    ]

    def to_source_string(key):
        source = "Keyword analysis"
        try:
            return SourceString(key, source)
        except UnicodeEncodeError:
            return SourceString(key.encode("utf-8"), source)

    multi_keywords = [
        to_source_string(key)
        for key in present_keywords
        if tokenized_index.words.count(key) >= 1
    ]

    multi_keywords = sorted(multi_keywords, key=lambda x: len(x), reverse=True)

    if len(multi_keywords) > no_items:
        return multi_keywords[:no_items]

    return multi_keywords