Layla055 commited on
Commit
68a3dce
·
verified ·
1 Parent(s): e20e33d

Update models/ai_models.py

Browse files
Files changed (1) hide show
  1. models/ai_models.py +107 -42
models/ai_models.py CHANGED
@@ -1,17 +1,57 @@
1
  # ============================================
2
  # AI_MODELS.PY - نظام الذكاء الجديد
 
3
  # ============================================
4
 
5
- import numpy as np
6
- import pandas as pd
7
- from sentence_transformers import SentenceTransformer
8
- import joblib
9
  import os
10
  import json
11
  from datetime import datetime
12
- import tensorflow as tf
13
- from tensorflow.keras.models import Sequential, load_model
14
- from tensorflow.keras.layers import Dense, Dropout
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  # ============================================
17
  # 📦 1. مشفر النص (Text Encoder)
@@ -19,28 +59,33 @@ from tensorflow.keras.layers import Dense, Dropout
19
 
20
  class TextEncoder:
21
  """تحويل النص إلى متجهات رقمية"""
22
-
23
  def __init__(self):
24
  self.model = None
25
  self.available = False
26
  self.load_model()
27
-
28
  def load_model(self):
29
  """تحميل نموذج التشفير بأمان"""
 
 
 
 
30
  try:
31
  self.model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
32
  self.available = True
33
  print("✅ نموذج تشفير النص جاهز")
34
  except Exception as e:
35
  print(f"⚠️ نموذج تشفير النص غير متوفر: {str(e)}")
36
-
 
37
  def encode(self, text):
38
  """تحويل النص إلى متجه"""
39
- if not self.available:
40
  return None
41
  try:
42
  return self.model.encode(text)
43
- except:
44
  return None
45
 
46
 
@@ -50,14 +95,16 @@ class TextEncoder:
50
 
51
  class SDGPredictor:
52
  """يتنبأ بالأهداف المناسبة من النص"""
53
-
54
  def __init__(self):
55
  self.model = None
56
  self.available = False
57
  self.load_model()
58
-
59
  def create_model(self):
60
  """إنشاء هيكل النموذج"""
 
 
61
  model = Sequential([
62
  Dense(256, activation='relu', input_shape=(384,)),
63
  Dropout(0.3),
@@ -68,46 +115,51 @@ class SDGPredictor:
68
  ])
69
  model.compile(optimizer='adam', loss='binary_crossentropy')
70
  return model
71
-
72
  def load_model(self):
73
  """تحميل نموذج مدرب أو إنشاء جديد"""
 
 
 
 
74
  try:
75
  if os.path.exists('saved_models/ai_sdg_model_trained.h5'):
76
  self.model = load_model('saved_models/ai_sdg_model_trained.h5')
77
  self.available = True
78
  print("✅ نموذج التنبؤ بالأهداف جاهز (مدرب على 18000 مشروع)")
79
  else:
80
- # نموذج تجريبي بسيط للبداية
81
  self.model = self.create_model()
82
  self.available = True
83
  print("✅ نموذج تجريبي للتنبؤ بالأهداف جاهز")
84
  except Exception as e:
85
  print(f"⚠️ نموذج التنبؤ بالأهداف غير متوفر: {str(e)}")
86
-
 
87
  def predict(self, text_vector):
88
  """التنبؤ بالأهداف من متجه النص"""
89
- if not self.available or text_vector is None:
90
  return []
91
  try:
92
  pred = self.model.predict(np.array([text_vector]), verbose=0)[0]
93
- return [i+1 for i, p in enumerate(pred) if p > 0.5]
94
- except:
95
  return []
96
 
97
 
98
  # ============================================
99
  # 💡 3. نموذج التوصيات (Recommendation Generator)
 
100
  # ============================================
101
 
102
  class RecommendationGenerator:
103
  """يولد توصيات بناءً على المشاريع السابقة"""
104
-
105
  def __init__(self):
106
  self.data_file = "projects_data.json"
107
  self.patterns = {}
108
  self.available = False
109
  self.load_patterns()
110
-
111
  def load_patterns(self):
112
  """تحميل أنماط المشاريع السابقة"""
113
  try:
@@ -115,47 +167,52 @@ class RecommendationGenerator:
115
  with open(self.data_file, 'r', encoding='utf-8') as f:
116
  data = json.load(f)
117
  projects = data.get('projects', [])
118
-
119
  for p in projects:
120
  text = f"{p.get('project_name', '')} {p.get('project_desc', '')}".lower()
121
  sdgs = tuple(p.get('detected_sdgs', []))
122
  impact = p.get('impact_level', '')
123
-
124
  if sdgs not in self.patterns:
125
  self.patterns[sdgs] = {'count': 0, 'impacts': []}
126
  self.patterns[sdgs]['count'] += 1
127
  self.patterns[sdgs]['impacts'].append(impact)
128
-
129
  self.available = True
130
  print(f"✅ تم تحليل {len(projects)} مشروع سابق")
 
 
 
 
131
  except Exception as e:
132
  print(f"⚠️ تحليل الأنماط غير متوفر: {str(e)}")
133
-
 
134
  def generate(self, text, detected_sdgs, groups):
135
  """توليد توصيات ذكية"""
136
  if not self.available:
137
  return []
138
-
139
  recommendations = []
140
  sdgs_key = tuple(sorted(detected_sdgs))
141
-
142
  if sdgs_key in self.patterns:
143
  pattern = self.patterns[sdgs_key]
144
  if pattern['count'] > 2:
145
  recommendations.append(f"📊 نمط ناجح مكرر {pattern['count']} مرة")
146
-
147
- text_lower = text.lower()
148
-
149
  if 'طفل' in text_lower or 'أطفال' in text_lower:
150
  if 'حرف' in text_lower or 'يدوية' in text_lower:
151
  recommendations.append("🎨 دمج التعليم بالحرف اليدوية للأطفال يعزز الإبداع")
152
-
153
  if 'ذوي دخل محدود' in text_lower or 'فقر' in text_lower:
154
  recommendations.append("💰 ربط التدريب بفرص تمويل صغيرة يضمن استدامة الأثر")
155
-
156
  if 'حرف' in text_lower or 'يدوية' in text_lower:
157
  recommendations.append("🛍️ إنشاء منصة تسويق إلكتروني للمنتجات يفتح أسواق جديدة")
158
-
159
  return list(set(recommendations))
160
 
161
 
@@ -165,42 +222,50 @@ class RecommendationGenerator:
165
 
166
  class AIModels:
167
  """يدير جميع النماذج الذكية بشكل آمن"""
168
-
169
  def __init__(self):
170
  self.encoder = None
171
  self.sdg_predictor = None
172
  self.recommender = None
173
  self.available = False
174
  self.load_models()
175
-
176
  def load_models(self):
177
  """تحميل جميع النماذج بأمان"""
178
  try:
179
  self.encoder = TextEncoder()
180
  self.sdg_predictor = SDGPredictor()
181
  self.recommender = RecommendationGenerator()
182
-
 
183
  if self.encoder.available and self.sdg_predictor.available:
184
  self.available = True
185
  print("✅ جميع النماذج الذكية جاهزة للعمل")
186
  else:
187
- print("⚠️ بعض النماذج الذكية غير متوفرة")
 
188
  except Exception as e:
189
  print(f"❌ فشل تحميل النماذج الذكية: {str(e)}")
190
-
 
191
  def analyze(self, text, project_data=None):
192
  """تحليل النص باستخدام جميع النماذج"""
193
  if not self.available:
 
 
 
 
 
194
  return None, [], []
195
-
196
  vector = self.encoder.encode(text)
197
  if vector is None:
198
  return None, [], []
199
-
200
  predicted_sdgs = self.sdg_predictor.predict(vector)
201
  groups = project_data.get('groups', []) if project_data else []
202
  recommendations = self.recommender.generate(text, predicted_sdgs, groups)
203
-
204
  return predicted_sdgs, recommendations, vector
205
 
206
 
 
1
  # ============================================
2
  # AI_MODELS.PY - نظام الذكاء الجديد
3
+ # (نسخة آمنة: تعمل دون sentence_transformers أو tensorflow)
4
  # ============================================
5
 
 
 
 
 
6
  import os
7
  import json
8
  from datetime import datetime
9
+
10
+ # ============================================
11
+ # 🔒 استيرادات محمية (لا تُفشل الملف عند الغياب)
12
+ # ============================================
13
+
14
+ try:
15
+ import numpy as np
16
+ _NP_AVAILABLE = True
17
+ except Exception:
18
+ np = None
19
+ _NP_AVAILABLE = False
20
+
21
+ try:
22
+ import pandas as pd
23
+ _PD_AVAILABLE = True
24
+ except Exception:
25
+ pd = None
26
+ _PD_AVAILABLE = False
27
+
28
+ try:
29
+ from sentence_transformers import SentenceTransformer
30
+ _ST_AVAILABLE = True
31
+ except Exception:
32
+ SentenceTransformer = None
33
+ _ST_AVAILABLE = False
34
+
35
+ try:
36
+ import joblib
37
+ _JOBLIB_AVAILABLE = True
38
+ except Exception:
39
+ joblib = None
40
+ _JOBLIB_AVAILABLE = False
41
+
42
+ try:
43
+ import tensorflow as tf
44
+ from tensorflow.keras.models import Sequential, load_model
45
+ from tensorflow.keras.layers import Dense, Dropout
46
+ _TF_AVAILABLE = True
47
+ except Exception:
48
+ tf = None
49
+ Sequential = None
50
+ load_model = None
51
+ Dense = None
52
+ Dropout = None
53
+ _TF_AVAILABLE = False
54
+
55
 
56
  # ============================================
57
  # 📦 1. مشفر النص (Text Encoder)
 
59
 
60
  class TextEncoder:
61
  """تحويل النص إلى متجهات رقمية"""
62
+
63
  def __init__(self):
64
  self.model = None
65
  self.available = False
66
  self.load_model()
67
+
68
  def load_model(self):
69
  """تحميل نموذج التشفير بأمان"""
70
+ if not _ST_AVAILABLE:
71
+ print("⚠️ sentence_transformers غير مثبتة → TextEncoder معطّل")
72
+ self.available = False
73
+ return
74
  try:
75
  self.model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
76
  self.available = True
77
  print("✅ نموذج تشفير النص جاهز")
78
  except Exception as e:
79
  print(f"⚠️ نموذج تشفير النص غير متوفر: {str(e)}")
80
+ self.available = False
81
+
82
  def encode(self, text):
83
  """تحويل النص إلى متجه"""
84
+ if not self.available or self.model is None:
85
  return None
86
  try:
87
  return self.model.encode(text)
88
+ except Exception:
89
  return None
90
 
91
 
 
95
 
96
  class SDGPredictor:
97
  """يتنبأ بالأهداف المناسبة من النص"""
98
+
99
  def __init__(self):
100
  self.model = None
101
  self.available = False
102
  self.load_model()
103
+
104
  def create_model(self):
105
  """إنشاء هيكل النموذج"""
106
+ if not _TF_AVAILABLE:
107
+ return None
108
  model = Sequential([
109
  Dense(256, activation='relu', input_shape=(384,)),
110
  Dropout(0.3),
 
115
  ])
116
  model.compile(optimizer='adam', loss='binary_crossentropy')
117
  return model
118
+
119
  def load_model(self):
120
  """تحميل نموذج مدرب أو إنشاء جديد"""
121
+ if not _TF_AVAILABLE:
122
+ print("⚠️ tensorflow غير مثبتة → SDGPredictor معطّل")
123
+ self.available = False
124
+ return
125
  try:
126
  if os.path.exists('saved_models/ai_sdg_model_trained.h5'):
127
  self.model = load_model('saved_models/ai_sdg_model_trained.h5')
128
  self.available = True
129
  print("✅ نموذج التنبؤ بالأهداف جاهز (مدرب على 18000 مشروع)")
130
  else:
 
131
  self.model = self.create_model()
132
  self.available = True
133
  print("✅ نموذج تجريبي للتنبؤ بالأهداف جاهز")
134
  except Exception as e:
135
  print(f"⚠️ نموذج التنبؤ بالأهداف غير متوفر: {str(e)}")
136
+ self.available = False
137
+
138
  def predict(self, text_vector):
139
  """التنبؤ بالأهداف من متجه النص"""
140
+ if not self.available or text_vector is None or self.model is None:
141
  return []
142
  try:
143
  pred = self.model.predict(np.array([text_vector]), verbose=0)[0]
144
+ return [i + 1 for i, p in enumerate(pred) if p > 0.5]
145
+ except Exception:
146
  return []
147
 
148
 
149
  # ============================================
150
  # 💡 3. نموذج التوصيات (Recommendation Generator)
151
+ # ← هذا هو الوحيد المطلوب فعّالاً
152
  # ============================================
153
 
154
  class RecommendationGenerator:
155
  """يولد توصيات بناءً على المشاريع السابقة"""
156
+
157
  def __init__(self):
158
  self.data_file = "projects_data.json"
159
  self.patterns = {}
160
  self.available = False
161
  self.load_patterns()
162
+
163
  def load_patterns(self):
164
  """تحميل أنماط المشاريع السابقة"""
165
  try:
 
167
  with open(self.data_file, 'r', encoding='utf-8') as f:
168
  data = json.load(f)
169
  projects = data.get('projects', [])
170
+
171
  for p in projects:
172
  text = f"{p.get('project_name', '')} {p.get('project_desc', '')}".lower()
173
  sdgs = tuple(p.get('detected_sdgs', []))
174
  impact = p.get('impact_level', '')
175
+
176
  if sdgs not in self.patterns:
177
  self.patterns[sdgs] = {'count': 0, 'impacts': []}
178
  self.patterns[sdgs]['count'] += 1
179
  self.patterns[sdgs]['impacts'].append(impact)
180
+
181
  self.available = True
182
  print(f"✅ تم تحليل {len(projects)} مشروع سابق")
183
+ else:
184
+ # لا يوجد ملف بيانات → المحرك يعمل لكن بدون أنماط
185
+ self.available = True
186
+ print("ℹ️ projects_data.json غير موجود → توصيات ذكية محدودة")
187
  except Exception as e:
188
  print(f"⚠️ تحليل الأنماط غير متوفر: {str(e)}")
189
+ self.available = False
190
+
191
  def generate(self, text, detected_sdgs, groups):
192
  """توليد توصيات ذكية"""
193
  if not self.available:
194
  return []
195
+
196
  recommendations = []
197
  sdgs_key = tuple(sorted(detected_sdgs))
198
+
199
  if sdgs_key in self.patterns:
200
  pattern = self.patterns[sdgs_key]
201
  if pattern['count'] > 2:
202
  recommendations.append(f"📊 نمط ناجح مكرر {pattern['count']} مرة")
203
+
204
+ text_lower = text.lower() if text else ""
205
+
206
  if 'طفل' in text_lower or 'أطفال' in text_lower:
207
  if 'حرف' in text_lower or 'يدوية' in text_lower:
208
  recommendations.append("🎨 دمج التعليم بالحرف اليدوية للأطفال يعزز الإبداع")
209
+
210
  if 'ذوي دخل محدود' in text_lower or 'فقر' in text_lower:
211
  recommendations.append("💰 ربط التدريب بفرص تمويل صغيرة يضمن استدامة الأثر")
212
+
213
  if 'حرف' in text_lower or 'يدوية' in text_lower:
214
  recommendations.append("🛍️ إنشاء منصة تسويق إلكتروني للمنتجات يفتح أسواق جديدة")
215
+
216
  return list(set(recommendations))
217
 
218
 
 
222
 
223
  class AIModels:
224
  """يدير جميع النماذج الذكية بشكل آمن"""
225
+
226
  def __init__(self):
227
  self.encoder = None
228
  self.sdg_predictor = None
229
  self.recommender = None
230
  self.available = False
231
  self.load_models()
232
+
233
  def load_models(self):
234
  """تحميل جميع النماذج بأمان"""
235
  try:
236
  self.encoder = TextEncoder()
237
  self.sdg_predictor = SDGPredictor()
238
  self.recommender = RecommendationGenerator()
239
+
240
+ # المتاح فقط ما نجح تحميله فعلاً
241
  if self.encoder.available and self.sdg_predictor.available:
242
  self.available = True
243
  print("✅ جميع النماذج الذكية جاهزة للعمل")
244
  else:
245
+ self.available = False
246
+ print("⚠️ بعض النماذج الذكية غير متوفرة (RecommendationGenerator فقط يعمل)")
247
  except Exception as e:
248
  print(f"❌ فشل تحميل النماذج الذكية: {str(e)}")
249
+ self.available = False
250
+
251
  def analyze(self, text, project_data=None):
252
  """تحليل النص باستخدام جميع النماذج"""
253
  if not self.available:
254
+ # حتى لو AIModels غير متاح، نحاول استخدام RecommendationGenerator وحده
255
+ if self.recommender and self.recommender.available:
256
+ groups = project_data.get('groups', []) if project_data else []
257
+ recs = self.recommender.generate(text, [], groups)
258
+ return [], recs, None
259
  return None, [], []
260
+
261
  vector = self.encoder.encode(text)
262
  if vector is None:
263
  return None, [], []
264
+
265
  predicted_sdgs = self.sdg_predictor.predict(vector)
266
  groups = project_data.get('groups', []) if project_data else []
267
  recommendations = self.recommender.generate(text, predicted_sdgs, groups)
268
+
269
  return predicted_sdgs, recommendations, vector
270
 
271