import re import logging from typing import List logger = logging.getLogger(__name__) ENGLISH_TO_RUSSIAN_LETTERS = { 'a': 'а', 'c': 'с', 'e': 'е', 'o': 'о', 'p': 'р', 'x': 'х', 'y': 'у', 'B': 'В', 'M': 'М', 'T': 'Т', } LETTER_DIGIT_PATTERN = re.compile(r'([а-яё]+)(\d+)', re.IGNORECASE) RUSSIAN_LETTER_PATTERN = re.compile(r'[а-яё]', re.IGNORECASE) def is_majority_russian(word: str) -> bool: """Проверяет, составляет ли большинство букв в слове русские буквы.""" letters = re.findall(r'[а-яёА-ЯЁ]', word) if not letters: return False russian_count = len(letters) total_letters = len(word) return russian_count > (total_letters / 2) def replace_similar_english_letters(word: str) -> str: """Заменяет похожие английские буквы на русские эквиваленты.""" return ''.join([ENGLISH_TO_RUSSIAN_LETTERS.get(char, char) for char in word]) def replace_digits(word: str) -> str: """Заменяет цифры '3' и '0' на буквы 'з' и 'о' соответственно.""" return word.replace('3', 'з').replace('0', 'о') def split_letters_digits(word: str) -> str: """Разделяет буквы и цифры в слове.""" return LETTER_DIGIT_PATTERN.sub(r'\1 \2', word) def preprocess_text(text: str) -> str: """ Предобрабатывает текст: 1. Приводит к нижнему регистру. 2. Заменяет похожие английские буквы на русские. 3. В словах с большинством русских букв заменяет '3' на 'з' и '0' на 'о'. 4. Разделяет буквы и цифры. """ logger.debug("Начало предобработки текста.") text = text.lower() logger.debug(f"Текст после приведения к нижнему регистру: {text}") words = text.split() processed_words: List[str] = [] for word in words: original_word = word if is_majority_russian(word): word = replace_similar_english_letters(word) logger.debug(f"Слово после замены английских букв: {word}") word = replace_digits(word) logger.debug(f"Слово после замены цифр: {word}") word = split_letters_digits(word) logger.debug(f"Слово после разделения букв и цифр: {word}") processed_words.append(word) logger.debug(f"Слово '{original_word}' преобразовано в '{word}'.") preprocessed_text = ' '.join(processed_words) logger.debug(f"Текст после предобработки: {preprocessed_text}") return preprocessed_text