VoiceToWrite / advanced_term_correction.py
Seicas's picture
Update advanced_term_correction.py
4d6e765 verified
raw
history blame
2.73 kB
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)