Upload 11 files
Browse files
app.py
CHANGED
|
@@ -6,13 +6,13 @@ from flask_login import LoginManager, login_user, logout_user, login_required, c
|
|
| 6 |
from models import db, User, Feedback
|
| 7 |
from forms import RegistrationForm, LoginForm
|
| 8 |
from PhoBERTMultiTask import PhoBERTMultiTask
|
|
|
|
| 9 |
|
| 10 |
app = Flask(__name__)
|
| 11 |
|
| 12 |
# Cấu hình
|
| 13 |
-
|
| 14 |
-
app.config[
|
| 15 |
-
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
| 16 |
|
| 17 |
# Khởi tạo extensions
|
| 18 |
db.init_app(app)
|
|
@@ -29,7 +29,7 @@ def load_user(user_id):
|
|
| 29 |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 30 |
|
| 31 |
# === Load tokenizer & model ===
|
| 32 |
-
MODEL_REPO =
|
| 33 |
|
| 34 |
print("🔄 Đang tải tokenizer và model từ Hugging Face...")
|
| 35 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_REPO, use_fast=False)
|
|
@@ -158,8 +158,8 @@ def predict():
|
|
| 158 |
topic = torch.argmax(logits_topic, dim=1).item()
|
| 159 |
|
| 160 |
# Mapping
|
| 161 |
-
SENTIMENT_MAP =
|
| 162 |
-
TOPIC_MAP =
|
| 163 |
|
| 164 |
sentiment = SENTIMENT_MAP[sent]
|
| 165 |
topic_result = TOPIC_MAP[topic]
|
|
@@ -200,5 +200,12 @@ with app.app_context():
|
|
| 200 |
print("✅ Database đã sẵn sàng!")
|
| 201 |
|
| 202 |
if __name__ == "__main__":
|
| 203 |
-
# Hugging Face
|
| 204 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
from models import db, User, Feedback
|
| 7 |
from forms import RegistrationForm, LoginForm
|
| 8 |
from PhoBERTMultiTask import PhoBERTMultiTask
|
| 9 |
+
from config import config
|
| 10 |
|
| 11 |
app = Flask(__name__)
|
| 12 |
|
| 13 |
# Cấu hình
|
| 14 |
+
config_name = os.environ.get('FLASK_ENV', 'default')
|
| 15 |
+
app.config.from_object(config[config_name])
|
|
|
|
| 16 |
|
| 17 |
# Khởi tạo extensions
|
| 18 |
db.init_app(app)
|
|
|
|
| 29 |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 30 |
|
| 31 |
# === Load tokenizer & model ===
|
| 32 |
+
MODEL_REPO = app.config['MODEL_REPO']
|
| 33 |
|
| 34 |
print("🔄 Đang tải tokenizer và model từ Hugging Face...")
|
| 35 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_REPO, use_fast=False)
|
|
|
|
| 158 |
topic = torch.argmax(logits_topic, dim=1).item()
|
| 159 |
|
| 160 |
# Mapping
|
| 161 |
+
SENTIMENT_MAP = app.config['SENTIMENT_MAP']
|
| 162 |
+
TOPIC_MAP = app.config['TOPIC_MAP']
|
| 163 |
|
| 164 |
sentiment = SENTIMENT_MAP[sent]
|
| 165 |
topic_result = TOPIC_MAP[topic]
|
|
|
|
| 200 |
print("✅ Database đã sẵn sàng!")
|
| 201 |
|
| 202 |
if __name__ == "__main__":
|
| 203 |
+
# Hugging Face Spaces configuration
|
| 204 |
+
port = int(os.environ.get("PORT", 7860))
|
| 205 |
+
debug = os.environ.get("FLASK_ENV") != "production"
|
| 206 |
+
|
| 207 |
+
print(f"🚀 Starting Flask app on port {port}")
|
| 208 |
+
print(f"🔧 Debug mode: {debug}")
|
| 209 |
+
print(f"🌐 Environment: {os.environ.get('FLASK_ENV', 'default')}")
|
| 210 |
+
|
| 211 |
+
app.run(host="0.0.0.0", port=port, debug=debug)
|
config.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
|
| 3 |
+
class Config:
|
| 4 |
+
"""Cấu hình cơ bản"""
|
| 5 |
+
SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key-change-this-in-production'
|
| 6 |
+
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///feedback_analysis.db'
|
| 7 |
+
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
| 8 |
+
|
| 9 |
+
# Hugging Face Spaces configuration
|
| 10 |
+
MODEL_REPO = "Ptul2x5/Student_Feedback_Sentiment"
|
| 11 |
+
|
| 12 |
+
# Sentiment và Topic mapping
|
| 13 |
+
SENTIMENT_MAP = {0: "negative", 1: "neutral", 2: "positive"}
|
| 14 |
+
TOPIC_MAP = {0: "lecturer", 1: "training_program", 2: "facility", 3: "others"}
|
| 15 |
+
|
| 16 |
+
class ProductionConfig(Config):
|
| 17 |
+
"""Cấu hình cho production"""
|
| 18 |
+
SECRET_KEY = os.environ.get('SECRET_KEY')
|
| 19 |
+
if not SECRET_KEY:
|
| 20 |
+
raise ValueError("SECRET_KEY environment variable must be set in production")
|
| 21 |
+
|
| 22 |
+
class DevelopmentConfig(Config):
|
| 23 |
+
"""Cấu hình cho development"""
|
| 24 |
+
DEBUG = True
|
| 25 |
+
|
| 26 |
+
# Chọn config dựa trên environment
|
| 27 |
+
config = {
|
| 28 |
+
'development': DevelopmentConfig,
|
| 29 |
+
'production': ProductionConfig,
|
| 30 |
+
'default': DevelopmentConfig
|
| 31 |
+
}
|