82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
|
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
|
|||
|
|
|||
|
|