Spaces:
Running
Running
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) |