File size: 3,363 Bytes
7d616a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
82
83
84
85
86
87
88
89
90
from flask import Flask, request, jsonify
import joblib
import re
from sentence_transformers import SentenceTransformer
from threading import Lock
import os

# Flask uygulamasını başlat (Hugging Face bu uygulamayı otomatik olarak başlatır)
app = Flask(__name__)

# Model yükleme işlemini sadece bir kez yapmak için global değişkenler
MODEL_LOADED = False
MODEL_LOCK = Lock()
classifier = None
embedding_model = None


# Metin ön işleme fonksiyonu
def metin_temizle(metin):
    """Metni küçük harfe dönüştürür, noktalama işaretlerini ve sayıları kaldırır."""
    metin = metin.lower()
    metin = re.sub(r'[^\w\s]', '', metin)
    metin = re.sub(r'\d+', '', metin)
    return metin


# Modeli yükleme fonksiyonu (Sadece bir kez çalışacak)
def load_models():
    global classifier, embedding_model, MODEL_LOADED

    # Kilit mekanizmasını kullanarak, modelin birden fazla kez yüklenmesini engelle
    with MODEL_LOCK:
        if MODEL_LOADED:
            return

        print("Modeller ilk kez yükleniyor...")
        try:
            # 1. SVC sınıflandırma modelini yükle
            classifier = joblib.load('siniflandirma_modeli.pkl')
            print("SVC modeli başarıyla yüklendi.")
        except FileNotFoundError:
            # Bu hata olursa, yüklemede bir sorun var demektir.
            raise FileNotFoundError("siniflandirma_modeli.pkl dosyası bulunamadı.")

        try:
            # 2. Gömme modelini doğrudan internetten indir (Distiluse modeli)
            embedding_model = SentenceTransformer('distiluse-base-multilingual-cased-v2')
            print("Sentence-Transformer modeli başarıyla indirildi/yüklendi.")
        except Exception as e:
            print(f"HATA: Sentence-Transformer modeli yüklenirken bir sorun oluştu: {e}")
            raise Exception(f"Model yükleme hatası: {e}")

        MODEL_LOADED = True
        print("Model yükleme tamamlandı. API hazır.")


# API'nin makale başlığını alıp kategoriyi tahmin edeceği uç nokta (endpoint)
@app.route('/kategorize-et', methods=['POST'])
def kategorize_et_api():
    """Gelen HTTP isteğini işler, makale başlığını kategorize eder ve sonucu JSON olarak döndürür."""

    # Modelleri yükle (Zaten yüklüyse bu adım atlanır)
    load_models()

    # Gelen JSON verisini al
    data = request.get_json(silent=True)

    if not data or 'baslik' not in data:
        return jsonify({"hata": "Makale başlığı (baslik) JSON gövdesinde bulunamadı."}), 400

    makale_basligi = data.get('baslik', '')

    temizlenmis_baslik = metin_temizle(makale_basligi)

    # Başlığı vektöre dönüştür
    tahmin_vektoru = embedding_model.encode([temizlenmis_baslik])

    # Sınıflandırma modelini kullanarak kategoriyi tahmin et
    tahmin_sonucu = classifier.predict(tahmin_vektoru)[0]

    # Sonucu JSON formatında döndür
    return jsonify({"kategori": tahmin_sonucu})


# Uygulama çalıştırma kodu. Hugging Face'de bu satır genellikle gerekmez,
# ancak dosyamızı daha standart tutmak için bırakabiliriz.
if __name__ == '__main__':
    # Hugging Face'de port otomatik olarak verilir. Lokal test için 7860 kullanıyoruz
    port = int(os.environ.get('PORT', 7860))
    app.run(host='0.0.0.0', port=port)