import re import difflib from typing import Dict, List, Tuple, Any import spacy from fuzzywuzzy import fuzz from medical_terms import load_turkish_medical_terms # .medical_terms -> medical_terms # SpaCy modelini yükle (Türkçe model kurulu olmalı) # pip install https://github.com/explosion/spacy-models/releases/download/tr_core_news_md-3.2.0/tr_core_news_md-3.2.0.tar.gz try: nlp = spacy.load("tr_core_news_md") except: # Eğer model yüklü değilse print("Türkçe SpaCy modeli yüklü değil. Yüklemek için: pip install https://github.com/explosion/spacy-models/releases/download/tr_core_news_md-3.2.0/tr_core_news_md-3.2.0.tar.gz") nlp = spacy.blank("tr") try: import python_Levenshtein # Opsiyonel hızlandırma except ImportError: pass # Olmasa da çalışır class MedicalTermCorrector: def __init__(self, medical_terms: Dict[str, str]): """ Tıbbi terim düzeltme sınıfı Args: medical_terms: Tıbbi terim sözlüğü (İngilizce -> Türkçe) """ self.medical_terms = medical_terms self.term_patterns = self._create_term_patterns() def _create_term_patterns(self) -> List[Tuple[str, str]]: """Terim eşleştirme desenlerini oluşturur""" patterns = [] for eng_term, tr_term in self.medical_terms.items(): # Tam eşleşme için patterns.append((rf'\b{re.escape(eng_term)}\b', tr_term)) # Kısmi eşleşme için (kelime sınırları olmadan) patterns.append((eng_term, tr_term)) return patterns def correct_text(self, text: str) -> str: """ Metindeki tıbbi terimleri düzeltir Args: text: Düzeltilecek metin Returns: Düzeltilmiş metin """ corrected_text = text # Önce tam eşleşmeleri düzelt for pattern, replacement in self.term_patterns: corrected_text = re.sub(pattern, replacement, corrected_text, flags=re.IGNORECASE) # Sonra bulanık eşleşmeleri kontrol et words = corrected_text.split() for i, word in enumerate(words): # En iyi eşleşmeyi bul best_match = None best_score = 0 for eng_term, tr_term in self.medical_terms.items(): score = fuzz.ratio(word.lower(), eng_term.lower()) if score > best_score and score > 80: # 80% eşleşme eşiği best_score = score best_match = tr_term if best_match: words[i] = best_match return ' '.join(words)