toxic-detector/app/core/text_preprocessing.py

82 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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