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)