148 lines
5.0 KiB
Python
148 lines
5.0 KiB
Python
from flask import Flask, request, jsonify
|
|
from flask_cors import CORS
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
import pandas as pd
|
|
import os
|
|
|
|
app = Flask(__name__)
|
|
CORS(app)
|
|
|
|
|
|
DATASET_FILE = os.path.join(os.path.dirname(__file__), "dataset.xlsx")
|
|
|
|
# Mapping angka ke kategori jawaban
|
|
ANSWER_MAPPING = {
|
|
0: "Tidak Mengandung",
|
|
1: "Sangat Sedikit Mengandung",
|
|
2: "Agak Mengandung",
|
|
3: "Cukup Mengandung",
|
|
4: "Banyak Mengandung",
|
|
5: "Sangat Banyak Mengandung"
|
|
}
|
|
|
|
REVERSE_MAPPING = {v: k for k, v in ANSWER_MAPPING.items()}
|
|
|
|
# Fungsi untuk membaca dataset
|
|
def load_dataset():
|
|
if os.path.exists(DATASET_FILE):
|
|
try:
|
|
data = pd.read_excel(DATASET_FILE)
|
|
|
|
if data.empty:
|
|
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
|
|
data.to_excel(DATASET_FILE, index=False)
|
|
except Exception as e:
|
|
print("Error saat membaca dataset:", e)
|
|
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
|
|
data.to_excel(DATASET_FILE, index=False)
|
|
else:
|
|
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
|
|
data.to_excel(DATASET_FILE, index=False)
|
|
|
|
print("Kolom dalam dataset:", data.columns.tolist())
|
|
|
|
required_columns = ["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"]
|
|
for col in required_columns:
|
|
if col not in data.columns:
|
|
raise ValueError(f"Kolom '{col}' tidak ditemukan dalam dataset!")
|
|
|
|
X = data.iloc[:, 1:-1].values
|
|
y = data.iloc[:, -1].values
|
|
|
|
return X, y, data
|
|
|
|
# Fungsi untuk menambahkan data ke dataset
|
|
def add_to_dataset(name, features, rating):
|
|
data = pd.read_excel(DATASET_FILE)
|
|
|
|
if name not in data['Nama Game'].values:
|
|
new_row = [name] + features + [rating]
|
|
data.loc[len(data)] = new_row
|
|
data.to_excel(DATASET_FILE, index=False)
|
|
|
|
# Endpoint untuk mengecek apakah game sudah ada dalam dataset
|
|
@app.route('/check_game', methods=['POST'])
|
|
def check_game():
|
|
try:
|
|
data = request.json
|
|
game_name = data['game_name']
|
|
|
|
_, _, dataset = load_dataset()
|
|
|
|
if game_name in dataset["Nama Game"].values:
|
|
rating = dataset.loc[dataset["Nama Game"] == game_name, "Rating"].values[0]
|
|
return jsonify({'exists': True, 'rating': rating})
|
|
|
|
return jsonify({'exists': False})
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
# Endpoint untuk menerima jawaban dan memberikan rating
|
|
@app.route('/submit_answers', methods=['POST'])
|
|
def submit_answers():
|
|
try:
|
|
data = request.json
|
|
print("=== DATA DITERIMA DARI FRONTEND ===")
|
|
print(data)
|
|
|
|
game_name = data.get('game_name', '').strip()
|
|
answers = data.get('answers', [])
|
|
|
|
if not game_name or not answers:
|
|
print("❌ ERROR: Data tidak lengkap")
|
|
return jsonify({"error": "Data tidak lengkap"}), 400
|
|
|
|
print("✔ Nama Game:", game_name)
|
|
print("✔ Jawaban:", answers)
|
|
|
|
# Cek apakah jawaban valid
|
|
features = []
|
|
for answer in answers:
|
|
if answer not in REVERSE_MAPPING:
|
|
print(f"❌ ERROR: Jawaban tidak valid -> {answer}")
|
|
return jsonify({"error": f"Jawaban tidak valid: {answer}"}), 400
|
|
features.append(REVERSE_MAPPING[answer])
|
|
|
|
print("✔ Features (dikonversi ke angka):", features)
|
|
|
|
|
|
X, y, dataset = load_dataset()
|
|
|
|
# Jika game sudah ada di dataset, kembalikan rating yang sudah ada
|
|
if game_name in dataset["Nama Game"].values:
|
|
existing_rating = dataset.loc[dataset["Nama Game"] == game_name, "Rating"].values[0]
|
|
print("✔ Game ditemukan dalam dataset. Rating:", existing_rating)
|
|
return jsonify({'rating': existing_rating})
|
|
|
|
# Prediksi rating dengan KNN jika dataset cukup besar
|
|
if len(X) > 3:
|
|
knn = KNeighborsClassifier(n_neighbors=3)
|
|
knn.fit(X, y)
|
|
predicted_rating = knn.predict([features])[0]
|
|
else:
|
|
total_score = sum(features)
|
|
if total_score <= 5:
|
|
predicted_rating = "SU"
|
|
elif total_score <= 10:
|
|
predicted_rating = "3+"
|
|
elif total_score <= 15:
|
|
predicted_rating = "7+"
|
|
elif total_score <= 20:
|
|
predicted_rating = "13+"
|
|
else:
|
|
predicted_rating = "18+"
|
|
|
|
print("✔ Prediksi Rating:", predicted_rating)
|
|
|
|
add_to_dataset(game_name, features, predicted_rating)
|
|
return jsonify({'rating': predicted_rating})
|
|
|
|
except Exception as e:
|
|
print("❌ ERROR di backend:", str(e))
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True)
|