Функция 1 - получает кусок html в виде строки, дальше она удаляет все html тэги.
Заменяет все символы, кроме букв на пробелы и делает весь текст нижним регистром.
Вырезает все слова меньше 3х символов и лишние пробелы.
def normal_str(s):
    #remove all html tags
    s = re.sub('<.*?>', ' ', s)
    #replace all non alphebetical characters with spaces
    s = re.sub('[^a-z]', ' ', s.lower())
    #remove all words with less than 3 letters and extra spaces
    result = ' '.join(i for i in s.split() if len(i)>2)
    return result
Функция 2 на входе получает строку, а на выходе выдает list состоящий из хэшей троиц слов
хэш1 = хэш(слово1 + слово2 + слово3)
хэш2 = хэш(слово2 + слово3 + слово4)
...
хэшN = хэш(словоN + словоN+1 + словоN+2)
Хэши подогнан под формат bigint MySQL, который будет потом записан в БД.
list хэшей сортируется по величине и из него удаляются дубли.
def words_hash(string):
    words = string.split()
    i = len(words)
    n = 0
    hs = []
    while n <= i-3:
        st = words[n] + words[n+1] + words[n+2]
        hs.append(int(hashlib.sha256(st.encode('utf-8')).hexdigest(), 16) % 10**16)
        n = n + 1
    hs.sort()
    return list(dict.fromkeys(hs))
В принципе обе функции работают нормально, просто если можно их оптимизировать, я бы это сделал.


