File size: 2,732 Bytes
4d6e765
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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)