Mintik24's picture
🎉 Полный рефакторинг проекта Medical Transcriber
e275025
"""
Medical Term Manager - управление медицинской терминологией
"""
import logging
from pathlib import Path
from typing import List, Set, Dict, Optional
import re
logger = logging.getLogger(__name__)
class MedicalTermManager:
"""
Менеджер медицинских терминов для коррекции транскрипций.
Функции:
- Загрузка терминов из файлов
- Поиск и валидация терминов
- Категоризация (анатомия, процедуры, диагнозы)
- Нормализация терминов
"""
def __init__(self, terms_file: Optional[Path] = None):
"""
Инициализация менеджера.
Args:
terms_file: Путь к файлу с медицинскими терминами
"""
self.terms: Set[str] = set()
self.categories: Dict[str, List[str]] = {
'imaging': [], # МРТ, КТ, МСКТ
'sequences': [], # Т1-ВИ, Т2-ВИ, FLAIR
'anatomy': [], # позвонки, диски, органы
'pathology': [], # грыжа, протрузия, стеноз
'modifiers': [] # гиперинтенсивный, дорзальная
}
if terms_file:
self.load_from_file(terms_file)
def load_from_file(self, filepath: Path) -> int:
"""
Загрузить термины из файла.
Args:
filepath: Путь к файлу с терминами (разделитель: запятая)
Returns:
Количество загруженных терминов
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read().strip()
# Разделяем по запятым и очищаем
raw_terms = [term.strip() for term in content.split(',')]
for term in raw_terms:
if term:
self.add_term(term)
logger.info(f"Loaded {len(self.terms)} medical terms from {filepath}")
return len(self.terms)
except FileNotFoundError:
logger.error(f"Terms file not found: {filepath}")
return 0
except Exception as e:
logger.error(f"Error loading terms: {e}")
return 0
def add_term(self, term: str) -> None:
"""
Добавить термин в базу знаний.
Args:
term: Медицинский термин
"""
normalized = self.normalize_term(term)
self.terms.add(normalized)
# Автоматическая категоризация
self._categorize_term(normalized)
def normalize_term(self, term: str) -> str:
"""
Нормализовать термин (удалить лишние пробелы, привести к единому формату).
Args:
term: Исходный термин
Returns:
Нормализованный термин
"""
# Убираем лишние пробелы
normalized = ' '.join(term.split())
return normalized
def _categorize_term(self, term: str) -> None:
"""
Автоматическая категоризация термина.
Args:
term: Термин для категоризации
"""
term_lower = term.lower()
# Методы визуализации
if any(x in term_lower for x in ['мрт', 'кт', 'мскт', 'рентген', 'узи']):
self.categories['imaging'].append(term)
# Последовательности МРТ
elif any(x in term_lower for x in ['т1', 'т2', 'flair', 'stir', 'dwi', 'adc']):
self.categories['sequences'].append(term)
# Позвонки и анатомия
elif re.search(r'[cltsl]\d+', term_lower) or any(x in term_lower for x in
['позвонок', 'диск', 'желудочк', 'цистерн', 'паренхима']):
self.categories['anatomy'].append(term)
# Патология
elif any(x in term_lower for x in ['грыжа', 'протрузия', 'стеноз', 'экструзия', 'остеофит']):
self.categories['pathology'].append(term)
# Модификаторы
elif any(x in term_lower for x in ['гипер', 'гипо', 'изо', 'дорзальн', 'вентральн']):
self.categories['modifiers'].append(term)
def search_term(self, query: str) -> List[str]:
"""
Поиск термина в базе.
Args:
query: Поисковый запрос
Returns:
Список найденных терминов
"""
query_lower = query.lower()
matches = [
term for term in self.terms
if query_lower in term.lower()
]
return sorted(matches)
def get_category_terms(self, category: str) -> List[str]:
"""
Получить термины по категории.
Args:
category: Название категории
Returns:
Список терминов категории
"""
return self.categories.get(category, [])
def get_all_terms(self) -> List[str]:
"""
Получить все термины.
Returns:
Список всех терминов
"""
return sorted(list(self.terms))
def get_terms_as_text(self, separator: str = ', ') -> str:
"""
Получить все термины в виде текста.
Args:
separator: Разделитель терминов
Returns:
Строка с терминами
"""
return separator.join(sorted(self.terms))
def validate_transcription(self, text: str) -> Dict[str, any]:
"""
Валидировать транскрипцию на наличие медицинских терминов.
Args:
text: Текст транскрипции
Returns:
Словарь с результатами валидации
"""
found_terms = []
text_lower = text.lower()
for term in self.terms:
if term.lower() in text_lower:
found_terms.append(term)
return {
'found_terms': found_terms,
'count': len(found_terms),
'coverage': len(found_terms) / len(self.terms) if self.terms else 0
}
def get_statistics(self) -> Dict[str, any]:
"""
Получить статистику по базе знаний.
Returns:
Словарь со статистикой
"""
return {
'total_terms': len(self.terms),
'categories': {
cat: len(terms)
for cat, terms in self.categories.items()
}
}