shahad altamimi
قراءة .env بمسار صريح + سكربت إضافة مقيّم
9619c69
Raw
History Blame Contribute Delete
4.94 kB
# ============================================================
# 📄 الملف: config.py
# 🎯 الغرض: الإعدادات المركزية للمشروع (المسارات + تعريف النماذج).
#
# هذا الملف هو "لوحة التحكم" لكل المشروع. أي مسار أو إعداد
# تحتاج تغيّره (مكان البيانات، مكان النموذج المحلي، أسماء النماذج،
# عدد النتائج...) تعدّله من هنا فقط — ولا تلمس باقي الملفات.
#
# القيم الحساسة (مثل مسار النموذج المحلي) تُقرأ من ملف .env
# عشان ما نكتبها داخل الكود مباشرة.
# ============================================================
import os
from pathlib import Path
import torch
from dotenv import load_dotenv
# تحميل متغيّرات البيئة من ملف .env بمساره الصريح (backend/.env)
# نحدّد المسار صراحةً حتى يُقرأ مهما كان مجلد التشغيل (CWD) —
# مثلاً عند تشغيل Streamlit من جذر المشروع.
load_dotenv(Path(__file__).resolve().parent / ".env")
# ------------------------------------------------------------
# 📁 المسارات الأساسية
# ------------------------------------------------------------
# BASE_DIR = جذر المشروع (المجلد اللي يحتوي backend/ و frontend/ و data/)
BASE_DIR = Path(__file__).resolve().parent.parent
DATA_DIR = BASE_DIR / "data"
RAW_DATA_PATH = DATA_DIR / "raw" / "lexicalentries.csv" # البيانات الخام
PROCESSED_DATA_PATH = DATA_DIR / "processed" / "data.csv" # البيانات بعد التنظيف
EMBEDDINGS_DIR = DATA_DIR / "embeddings" # ملفات .npy
RATINGS_PATH = DATA_DIR / "ratings.csv" # سجل التقييمات
# مسار النموذج الثالث المحلي (يُقرأ من .env، وله قيمة افتراضية)
MODEL_3_PATH = os.getenv("MODEL_3_PATH", str(BASE_DIR / "models" / "ksaa_custom"))
# مسار النموذج الرابع المحلي (نسخة أحدث من نموذج المعاجم — للمقارنة)
MODEL_4_PATH = os.getenv("MODEL_4_PATH", str(BASE_DIR / "models" / "ksaa_v2"))
# ------------------------------------------------------------
# 🖥️ الجهاز (GPU إن توفّر، وإلا CPU)
# - cuda : كروت NVIDIA
# - mps : معالج Apple الرسومي (أجهزة Apple Silicon — M1/M2/M3...)
# - cpu : الافتراضي
# ------------------------------------------------------------
if torch.cuda.is_available():
DEVICE = "cuda"
elif torch.backends.mps.is_available():
DEVICE = "mps"
else:
DEVICE = "cpu"
# ------------------------------------------------------------
# 🤖 تعريف النماذج الثلاثة
# ------------------------------------------------------------
# كل نموذج له:
# key = اسم داخلي قصير (يُستخدم لتسمية ملف الـ embeddings)
# display_name = الاسم الظاهر للمستخدم في الواجهة
# hf_id = معرّف النموذج في HuggingFace أو مسار محلي
# use_prefix = هل يحتاج بادئة "query:" / "passage:" (خاص بنماذج e5)
# top_k = الحد الأقصى للنتائج (None = بدون حد)
# ------------------------------------------------------------
MODELS = [
{
"key": "model_1_microsoft",
"display_name": "النموذج الأول",
"hf_id": "intfloat/multilingual-e5-large",
"use_prefix": True,
"top_k": 10,
},
{
"key": "model_2_researchers",
"display_name": "النموذج الثاني",
"hf_id": "Omartificial-Intelligence-Space/Arabic-Triplet-Matryoshka-V2",
"use_prefix": False,
"top_k": None,
},
{
"key": "model_3_ksaa",
"display_name": "النموذج الثالث",
"hf_id": MODEL_3_PATH,
"use_prefix": False,
"top_k": None,
},
{
"key": "model_4_ksaa_v2",
"display_name": "النموذج الرابع",
"hf_id": MODEL_4_PATH,
"use_prefix": False,
"top_k": None,
},
]
# ------------------------------------------------------------
# ⚙️ إعدادات عامة
# ------------------------------------------------------------
DEFAULT_THRESHOLD = 0.70 # حد التشابه الافتراضي
BATCH_SIZE = 64 # حجم الدفعة عند بناء الـ embeddings
# الأعمدة المستخدمة في بناء النص المُدمج للـ embedding
TEXT_COLUMNS = ["lemma", "definition", "example"]
def embedding_path(model_key: str) -> Path:
"""يرجّع مسار ملف الـ embeddings (.npy) الخاص بنموذج معيّن."""
return EMBEDDINGS_DIR / f"{model_key}.npy"