shahad altamimi
معالجة مسبقة: حذف التشكيل + دمج (الكلمة+التعريف) فقط، وتبسيط واجهة السجل
c62252d
Raw
History Blame Contribute Delete
3.43 kB
# ============================================================
# 📄 الملف: scripts/prepare_data.py
# 🎯 الغرض: تنظيف البيانات الخام وبناء النص المُدمج (يُشغّل مرة واحدة).
#
# يقابل خلية "تنظيف البيانات" في النوتبوك. يأخذ ملف البيانات
# الخام (lexicalentries.csv) ويقوم بـ:
# 1. حذف الصفوف بدون تعريف (definition).
# 2. إزالة التكرار حسب sense_id.
# 3. تنظيف خفيف للنصوص (مسافات فقط — مع الحفاظ على التشكيل).
# 4. دمج (الكلمة + التعريف فقط) مع حذف التشكيل في عمود combined_text.
# 5. حفظ النتيجة في data/processed/data.csv.
#
# طريقة التشغيل (من داخل مجلد backend):
# python scripts/prepare_data.py
# ============================================================
import re
import sys
from pathlib import Path
import pandas as pd
# نضيف مجلد backend للمسار عشان نقدر نستورد config
sys.path.append(str(Path(__file__).resolve().parent.parent))
import config
from app.text_utils import strip_diacritics
def clean_text(text: str) -> str:
"""تنظيف خفيف: توحيد المسافات الزائدة فقط (يحافظ على التشكيل والهمزات)."""
if not isinstance(text, str):
return ""
return re.sub(r"\s+", " ", text).strip()
def build_combined_text(row) -> str:
"""دمج الكلمة مع تعريفها فقط (بدون المثال) للـ embedding، مع حذف التشكيل.
الصيغة: "الكلمة: [الكلمة] التعريف: [التعريف]" """
lemma = strip_diacritics(str(row.get("lemma", "") or "").strip())
definition = strip_diacritics(str(row.get("definition", "") or "").strip())
return f"الكلمة: {lemma} التعريف: {definition}"
def main():
if not config.RAW_DATA_PATH.exists():
raise FileNotFoundError(
f"❌ ملف البيانات الخام غير موجود: {config.RAW_DATA_PATH}\n"
"ضع ملف الـ CSV في data/raw/ باسم lexicalentries.csv"
)
print(f"📂 قراءة البيانات من: {config.RAW_DATA_PATH}")
df = pd.read_csv(config.RAW_DATA_PATH)
print(f"📊 عدد الصفوف الأصلية: {len(df)}")
# 1) حذف الصفوف بدون تعريف
df = df.dropna(subset=["definition"]).copy()
df = df[df["definition"].astype(str).str.strip() != ""]
# 2) إزالة التكرار حسب sense_id
df = df.drop_duplicates(subset=["sense_id"]).reset_index(drop=True)
# 3) تنظيف خفيف للأعمدة النصّية
for col in config.TEXT_COLUMNS:
if col in df.columns:
df[col] = df[col].apply(clean_text)
# 4) بناء النص المُدمج
df["combined_text"] = df.apply(build_combined_text, axis=1)
# 5) الحفظ
config.PROCESSED_DATA_PATH.parent.mkdir(parents=True, exist_ok=True)
df.to_csv(config.PROCESSED_DATA_PATH, index=False, encoding="utf-8-sig")
print(f"✅ بعد التنظيف: {len(df)} سجل")
print(f"💾 حُفظ في: {config.PROCESSED_DATA_PATH}")
print("\n🔎 عينة من النص المُدمج:")
for t in df["combined_text"].head(3):
print(" •", t)
if __name__ == "__main__":
main()