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