Spaces:
Runtime error
Runtime error
| 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) | |
| 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) |