Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| import os | |
| import logging | |
| from datetime import datetime | |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
| class DataHandler: | |
| def __init__(self, quality_scorer=None, toxicity_scorer=None): | |
| """ | |
| Veri işleme sınıfını başlatır. | |
| Args: | |
| quality_scorer: Metin kalitesi değerlendirme nesnesi | |
| toxicity_scorer: Zararlılık skoru değerlendirme nesnesi | |
| """ | |
| self.quality_scorer = quality_scorer | |
| self.toxicity_scorer = toxicity_scorer | |
| def load_data(self, file_path, text_column=None): | |
| """ | |
| CSV veya Excel dosyasını yükler. | |
| Args: | |
| file_path: Yüklenecek dosyanın yolu | |
| text_column: Metin sütunu adı (belirtilmezse otomatik tespit edilir) | |
| Returns: | |
| pd.DataFrame: Yüklenen veri | |
| """ | |
| try: | |
| # Dosya uzantısını kontrol et | |
| if file_path.endswith('.csv'): | |
| df = pd.read_csv(file_path) | |
| elif file_path.endswith(('.xls', '.xlsx')): | |
| df = pd.read_excel(file_path) | |
| else: | |
| raise ValueError("Desteklenmeyen dosya formatı. Lütfen CSV veya Excel dosyası yükleyin.") | |
| # Metin sütununu belirle | |
| if text_column is None: | |
| # En çok metin içeriği olan sütunu bul | |
| text_lengths = {} | |
| for col in df.columns: | |
| if df[col].dtype == object: # Sadece metin sütunlarını kontrol et | |
| # Ortalama metin uzunluğunu hesapla | |
| avg_len = df[col].astype(str).str.len().mean() | |
| text_lengths[col] = avg_len | |
| if text_lengths: | |
| # En uzun ortalama metne sahip sütunu seç | |
| text_column = max(text_lengths.items(), key=lambda x: x[1])[0] | |
| else: | |
| # Hiçbir metin sütunu bulunamazsa ilk sütunu kullan | |
| text_column = df.columns[0] | |
| logging.info(f"Otomatik tespit edilen metin sütunu: {text_column}") | |
| return df, text_column | |
| except Exception as e: | |
| logging.error(f"Veri yükleme hatası: {str(e)}") | |
| raise e | |
| def process_data(self, df, text_column, quality_threshold=0.5, toxicity_threshold=0.5, batch_size=8): | |
| """ | |
| Veriyi işler, kalite ve zararlılık skorlarını hesaplar. | |
| Args: | |
| df: İşlenecek veri çerçevesi | |
| text_column: Metin sütunu adı | |
| quality_threshold: Kalite eşik değeri | |
| toxicity_threshold: Zararlılık eşik değeri | |
| batch_size: İşlenecek grup boyutu | |
| Returns: | |
| pd.DataFrame: İşlenmiş veri | |
| """ | |
| try: | |
| # Boş veya NaN değerli satırları kontrol et | |
| df = df.copy() | |
| df[text_column] = df[text_column].astype(str) | |
| df = df[df[text_column].str.strip() != ""] | |
| df = df.reset_index(drop=True) | |
| texts = df[text_column].tolist() | |
| # Kalite skorlarını hesapla | |
| if self.quality_scorer: | |
| logging.info("Kalite skorları hesaplanıyor...") | |
| quality_scores, quality_features = self.quality_scorer.batch_score(texts, batch_size=batch_size) | |
| df['quality_score'] = quality_scores | |
| # Kalite özelliklerini ekle | |
| for i, features in enumerate(quality_features): | |
| for feat_name, feat_value in features.items(): | |
| if i == 0: # İlk satır için sütun oluştur | |
| df[feat_name] = np.nan | |
| df.at[i, feat_name] = feat_value | |
| # Zararlılık skorlarını hesapla | |
| if self.toxicity_scorer: | |
| logging.info("Zararlılık skorları hesaplanıyor...") | |
| toxicity_scores = self.toxicity_scorer.batch_score(texts, batch_size=batch_size) | |
| df['toxicity_score'] = toxicity_scores | |
| # Eşik değerlerine göre etiketle | |
| if 'quality_score' in df.columns: | |
| df['low_quality'] = df['quality_score'] < quality_threshold | |
| if 'toxicity_score' in df.columns: | |
| df['is_toxic'] = df['toxicity_score'] > toxicity_threshold | |
| # Genel değerlendirme | |
| if 'quality_score' in df.columns and 'toxicity_score' in df.columns: | |
| df['acceptable'] = (df['quality_score'] >= quality_threshold) & ( | |
| df['toxicity_score'] <= toxicity_threshold) | |
| logging.info("Veri işleme tamamlandı.") | |
| return df | |
| except Exception as e: | |
| logging.error(f"Veri işleme hatası: {str(e)}") | |
| raise e | |
| def filter_data(self, df, quality_threshold=0.5, toxicity_threshold=0.5): | |
| """ | |
| Veriyi belirlenen eşik değerlerine göre filtreler. | |
| Args: | |
| df: Filtrelenecek veri çerçevesi | |
| quality_threshold: Kalite eşik değeri | |
| toxicity_threshold: Zararlılık eşik değeri | |
| Returns: | |
| pd.DataFrame: Filtrelenmiş veri | |
| """ | |
| filtered_df = df.copy() | |
| # Kalite filtreleme | |
| if 'quality_score' in filtered_df.columns: | |
| filtered_df = filtered_df[filtered_df['quality_score'] >= quality_threshold] | |
| # Zararlılık filtreleme | |
| if 'toxicity_score' in filtered_df.columns: | |
| filtered_df = filtered_df[filtered_df['toxicity_score'] <= toxicity_threshold] | |
| return filtered_df | |
| def save_data(self, df, output_path=None): | |
| """ | |
| İşlenmiş veriyi kaydeder. | |
| Args: | |
| df: Kaydedilecek veri çerçevesi | |
| output_path: Çıktı dosyası yolu (belirtilmezse otomatik oluşturulur) | |
| Returns: | |
| str: Kaydedilen dosyanın yolu | |
| """ | |
| if output_path is None: | |
| # Varsayılan çıktı yolunu oluştur | |
| timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | |
| output_dir = "data/processed" | |
| # Klasörü oluştur | |
| os.makedirs(output_dir, exist_ok=True) | |
| output_path = os.path.join(output_dir, f"processed_data_{timestamp}.csv") | |
| # Veriyi kaydet | |
| df.to_csv(output_path, index=False) | |
| logging.info(f"Veri başarıyla kaydedildi: {output_path}") | |
| return output_path |