Spaces:
Running
Running
| from fastapi import FastAPI | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from pydantic import BaseModel | |
| import torch | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoConfig | |
| app = FastAPI() | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=False, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| class AnalyzeRequest(BaseModel): | |
| text: str | |
| # --------------------------------------------------------- | |
| # BERTurk Duygu Analizi / Sınıflandırma Modeli | |
| # --------------------------------------------------------- | |
| MODEL_PATH = "sentence_best_model 2.bin" | |
| BASE_MODEL_NAME = "dbmdz/bert-base-turkish-cased" | |
| print("Model yükleniyor, lütfen bekleyin...") | |
| try: | |
| tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_NAME) | |
| # Modelinizi eğitirken kelime dağarcığına (vocab) 30 adet yeni token eklemişsiniz. | |
| # Orijinal BERTurk'ün vocab boyutu 32000 iken, sizin modelinizinki 32030 olmuş. | |
| # Bu yüzden konfigürasyonda bunu belirtmemiz gerekiyor, yoksa çöker ve Nötr döner! | |
| config = AutoConfig.from_pretrained(BASE_MODEL_NAME, num_labels=3, vocab_size=32030) | |
| # Konfigürasyonla iskeleti oluşturuyoruz | |
| model = AutoModelForSequenceClassification.from_config(config) | |
| # Kendi eğittiğiniz ağırlıkları (.bin) içine yüklüyoruz | |
| model.load_state_dict(torch.load(MODEL_PATH, map_location=torch.device('cpu'), weights_only=False)) | |
| model.eval() | |
| print("Model başarıyla yüklendi!") | |
| except Exception as e: | |
| print(f"Model yüklenirken hata oluştu: {e}") | |
| model = None | |
| tokenizer = None | |
| async def predict_sentiment(request: AnalyzeRequest): | |
| """ | |
| Frontend'den gelen günlüğü okur ve duygu durumunu sınıflandırır. | |
| """ | |
| if not model or not tokenizer: | |
| return {"sentiment": "Neutral"} | |
| inputs = tokenizer(request.text, return_tensors="pt", truncation=True, padding=True) | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| predictions = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
| predicted_class = torch.argmax(predictions, dim=-1).item() | |
| # Sınıf numaralarını metne çevirme (Örnek: 0: Negative, 1: Neutral, 2: Positive) | |
| # NOT: Kendi modelinizin label mapping'ine göre burayı değiştirebilirsiniz! | |
| sentiment_map = {0: "Negative", 1: "Neutral", 2: "Positive"} | |
| detected_sentiment = sentiment_map.get(predicted_class, "Neutral") | |
| return {"sentiment": detected_sentiment} | |
| async def health_check(): | |
| """ | |
| Konteynerin ve modelin durumunu kontrol etmek için health endpoint. | |
| """ | |
| if model and tokenizer: | |
| return {"status": "healthy", "model_loaded": True} | |
| return {"status": "degraded", "model_loaded": False, "message": "Model not loaded. Using fallback responses."} | |