""" TDK Sözlük veri setini yükleyen ve işleyen modül. Bu modül Hugging Face'den veri setini indirir, temizler ve RAG sistemi için uygun formata dönüştürür. """ from datasets import load_dataset import pandas as pd from tqdm import tqdm import json import os class TDKDataLoader: """TDK Sözlük veri setini yükler ve işler.""" def __init__(self, cache_dir="./data"): """ Args: cache_dir: Veri setinin kaydedileceği klasör """ self.cache_dir = cache_dir self.dataset = None self.processed_data = [] # Klasör yoksa oluştur os.makedirs(cache_dir, exist_ok=True) def load_dataset(self): """ Hugging Face'den TDK Sözlük veri setini yükler. Returns: Dataset objesi """ print("📚 TDK Sözlük veri seti yükleniyor...") try: # Veri setini yükle self.dataset = load_dataset("Ba2han/TDK_Sozluk-Turkish-v2") print(f"Veri seti başarıyla yüklendi!") print(f"Toplam kayıt sayısı: {len(self.dataset['train'])}") return self.dataset except Exception as e: print(f"Veri seti yüklenirken hata: {e}") return None def explore_data(self): """Veri setinin yapısını inceler ve örnek gösterir.""" if self.dataset is None: print("Önce veri setini yüklemelisiniz!") return print("\n" + "=" * 60) print("VERİ SETİ YAPISI") print("=" * 60) # İlk kaydı göster first_item = self.dataset['train'][0] print("\nİlk kayıt örneği:") print("-" * 60) for key, value in first_item.items(): # Uzun metinleri kısalt if isinstance(value, str) and len(value) > 200: print(f"{key}: {value[:200]}...") else: print(f"{key}: {value}") print("\nSütun bilgileri:") print("-" * 60) for key in first_item.keys(): print(f"• {key}") # Birkaç örnek daha göster print("\nÖrnek kelimeler:") print("-" * 60) for i in range(min(10, len(self.dataset['train']))): item = self.dataset['train'][i] madde = item.get('madde', 'N/A') anlam = item.get('anlam', '') # Anlam tipini göster anlam_type = type(anlam).__name__ print(f"{i + 1}. {madde} (anlam tipi: {anlam_type})") # İlk anlamı göster if isinstance(anlam, str) and anlam: try: import json anlam_parsed = json.loads(anlam) if isinstance(anlam_parsed, list) and anlam_parsed: first_anlam = anlam_parsed[0] if isinstance(first_anlam, dict): print(f" → {first_anlam.get('anlam', 'N/A')[:100]}") except: print(f" → {anlam[:100]}") def process_data(self): """ Veri setini RAG için uygun formata dönüştürür. Bu veri setinde her satır tek bir kelime-anlam çifti içeriyor. Çok basit ve düz bir yapı. """ if self.dataset is None: print("Önce veri setini yüklemelisiniz!") return None print("\nVeri işleniyor...") self.processed_data = [] error_count = 0 # Her kelimeyi işle for item in tqdm(self.dataset['train'], desc="İşleniyor"): try: # Alanları al - None değerleri boş string'e çevir kelime = str(item.get('madde', '')).strip() anlam = str(item.get('anlam', '')).strip() ornek = str(item.get('ornek', '') or '').strip() ai_ornek = str(item.get('ai_ornek', '') or '').strip() # Kelime veya anlam boş ise atla if not kelime or not anlam or kelime == 'None' or anlam == 'None': error_count += 1 continue # Tam metin oluştur (RAG için zengin context) full_text = f"Kelime: {kelime}\n\n" full_text += f"Anlam: {anlam}\n" # Örnek varsa ekle if ornek and ornek != 'None': full_text += f"\nÖrnek kullanım: {ornek}\n" # AI örneği varsa ekle (daha detaylı) if ai_ornek and ai_ornek != 'None': full_text += f"\nDetaylı örnek: {ai_ornek}\n" # Doküman oluştur doc = { 'text': full_text.strip(), 'kelime': kelime, 'anlam': anlam, 'ornek': ornek if (ornek and ornek != 'None') else None, 'ai_ornek': ai_ornek if (ai_ornek and ai_ornek != 'None') else None } self.processed_data.append(doc) except Exception as e: error_count += 1 continue print(f"{len(self.processed_data)} doküman oluşturuldu!") if error_count > 0: print(f"{error_count} kayıt işlenirken hata oluştu (atlandı)") return self.processed_data def save_processed_data(self, filename="processed_tdk.json"): """İşlenmiş veriyi JSON olarak kaydeder.""" if not self.processed_data: print("Önce veriyi işlemelisiniz!") return filepath = os.path.join(self.cache_dir, filename) with open(filepath, 'w', encoding='utf-8') as f: json.dump(self.processed_data, f, ensure_ascii=False, indent=2) print(f"Veri kaydedildi: {filepath}") def load_processed_data(self, filename="processed_tdk.json"): """Daha önce kaydedilmiş işlenmiş veriyi yükler.""" filepath = os.path.join(self.cache_dir, filename) if not os.path.exists(filepath): print(f"Dosya bulunamadı: {filepath}") return None with open(filepath, 'r', encoding='utf-8') as f: self.processed_data = json.load(f) print(f"{len(self.processed_data)} doküman yüklendi!") return self.processed_data # Test için main fonksiyonu if __name__ == "__main__": # Veri yükleyiciyi oluştur loader = TDKDataLoader() # Veri setini yükle loader.load_dataset() # Veri yapısını incele loader.explore_data() # Veriyi işle loader.process_data() # İlk 3 dokümanı göster if loader.processed_data: print("\n" + "=" * 60) print("İLK 3 İŞLENMİŞ DOKÜMAN") print("=" * 60) for i, doc in enumerate(loader.processed_data[:3], 1): print(f"\n{i}. Doküman:") print(f"Kelime: {doc['kelime']}") print(f"Text:\n{doc['text']}") # İşlenmiş veriyi kaydet loader.save_processed_data() print("\n✨ İşlem tamamlandı!")