File size: 2,850 Bytes
8da6361
0ab7ba4
8da6361
0ab7ba4
 
 
 
3d2d155
 
0ab7ba4
 
8da6361
3d2d155
0ab7ba4
 
3d2d155
0ab7ba4
3d2d155
0ab7ba4
 
 
 
 
 
3d2d155
0ab7ba4
 
3d2d155
8da6361
0ab7ba4
8da6361
 
 
0ab7ba4
8da6361
3d2d155
8da6361
 
 
 
 
 
 
 
 
 
 
 
3d2d155
8da6361
 
3d2d155
8da6361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d2d155
8da6361
 
 
 
 
 
 
3d2d155
8da6361
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from joblib import dump, load
import firebase_admin
from firebase_admin import credentials, firestore
import logging
import datetime
import re
import pandas as pd
import os
from flask import Flask, request, jsonify

# إعداد السجلات
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")

# Firebase Initialization
try:
    cred_path = r"D:\app-sentinel-7qnr19-firebase-adminsdk-kjmbe-533749ec1a.json"
    if not firebase_admin._apps:
        cred = credentials.Certificate(cred_path)
        firebase_admin.initialize_app(cred)
    db = firestore.client()
    logging.info("Firebase initialized successfully.")
except Exception as e:
    logging.error(f"Error initializing Firebase: {e}")
    db = None

# Load or Train Model with Pipeline
try:
    model_path = os.path.join(os.getcwd(), "model_pipeline.joblib")
    model_pipeline = load(model_path)
    logging.info("Model pipeline loaded successfully.")
except Exception as e:
    logging.warning(f"Model pipeline not found. Training new one. Error: {e}")
    try:
        # Train new model and vectorizer as part of pipeline
        messages = ["example message 1", "example message 2"]
        labels = ["label1", "label2"]
        model_pipeline = Pipeline([
            ('vectorizer', TfidfVectorizer()),  # تحويل النصوص إلى تمثيل رقمي
            ('classifier', MultinomialNB())      # تصنيف باستخدام Naive Bayes
        ])
        model_pipeline.fit(messages, labels)
        dump(model_pipeline, model_path)
        logging.info("New model pipeline trained and saved.")
    except Exception as e:
        logging.error(f"Error training new model: {e}")

# Flask API
app = Flask(__name__)

@app.route('/classify', methods=['POST'])
def classify_message():
    data = request.json
    message = data.get("message", "")
    
    # التصنيف باستخدام الـ pipeline
    if message.strip() == "":
        return jsonify({"error": "Message cannot be empty"}), 400
    
    classification = model_pipeline.predict([message])[0]
    
    # تخزين الرسالة في Firestore
    message_data = {
        "text": message,
        "classification": classification,
        "timestamp": datetime.datetime.now(),
    }

    if db:
        db.collection("all_messages").add(message_data)
        logging.info(f"Message classified as {classification} and stored in Firestore.")
    else:
        logging.warning("Firestore is not initialized. Data not stored.")
    
    return jsonify({"classification": classification})

if __name__ == "__main__":
    app.run(debug=True)