Sync from GitHub Actions: e4b793cd763e8a58bcc2672a46ff73aa77f1a891
Browse files- MBTI SAMPLES.md +108 -0
- api/core/nlp_handler.py +142 -3
MBTI SAMPLES.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 16 Sample Teks untuk Demo MBTI Prediction
|
| 2 |
+
|
| 3 |
+
Kumpulan sample teks bahasa Indonesia untuk demonstrasi MBTI personality prediction. Setiap teks dirancang untuk merepresentasikan karakteristik spesifik dari 16 tipe kepribadian MBTI.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## 1. ISTJ - Si Organisator
|
| 8 |
+
|
| 9 |
+
Gua tipe orang yang sangat menghargai struktur dan aturan dalam hidup. Setiap hari gua punya rutinitas yang sama - bangun jam 5 pagi, cek email, olahraga, terus kerja. Gua lebih suka bekerja sendiri dengan daftar tugas yang jelas dan tenggat waktu yang pasti. Kalau ada rapat, gua selalu siapkan agenda detail sebelumnya. Gua gak suka dadakan atau rencana spontan - semuanya harus terencana dengan baik. Data dan fakta adalah raja buat gua, bukan asumsi atau teori yang belum terbukti. Akhir pekan gua isi dengan beresin rumah, update catatan keuangan, dan planning minggu depan. Kesetiaan dan tanggung jawab itu penting banget. Kalau gua komit, gua akan deliver seratus persen. Basa-basi bukan kekuatan gua - gua prefer obrolan yang konkret dan jelas tujuannya.
|
| 10 |
+
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
## 2. ISFJ - Si Pelindung
|
| 14 |
+
|
| 15 |
+
Gua tipe orang yang paling senang kalau bisa bantu orang-orang terdekat. Gua selalu ingat detail kecil tentang temen-temen gua - ulang tahun mereka, makanan favorit, atau masalah yang mereka ceritain minggu lalu. Gua lebih suka kerja di belakang layar daripada jadi pusat perhatian. Kalau ada konflik dalam grup, gua yang paling pertama sadar dan coba mediasi dengan lembut. Gua gak suka perubahan yang tiba-tiba - gua butuh waktu buat menyesuaikan diri. Rutinitas yang konsisten itu nyaman buat gua. Gua selalu siapkan camilan ekstra atau kotak P3K kalau jalan bareng, karena gua khawatir kalau ada temen yang butuh. Bantuan praktis lebih berarti daripada kata-kata buat gua.
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## 3. INFJ - Si Visioner Misterius
|
| 20 |
+
|
| 21 |
+
Gua sering mikirin makna hidup dan tujuan dari semua yang gua lakukan. Obrolan mendalam tentang filosofi, psikologi, atau isu sosial itu kasih energi gua lebih dari obrolan ringan. Gua punya visi masa depan yang kuat - gua bisa bayangin gimana dunia bisa jadi lebih baik dan gua pengen berkontribusi buat itu. Gua selektif dalam bergaul - gua butuh waktu sendiri buat isi ulang energi tapi gua sangat peduli sama beberapa teman dekat. Gua intuitif ngerasain apa yang orang lain rasain, kadang bahkan sebelum mereka ngomong. Gua lebih suka tulis pemikiran gua daripada ngomong spontan. Idealisme adalah nilai inti gua.
|
| 22 |
+
|
| 23 |
+
---
|
| 24 |
+
|
| 25 |
+
## 4. INTJ - Si Strategis
|
| 26 |
+
|
| 27 |
+
Gua habiskan sebagian besar waktu gua buat menganalisis sistem dan cari cara buat optimasi. Gua selalu punya strategi jangka panjang - lima tahun, sepuluh tahun ke depan. Inefisiensi itu bikin gua kesal secara personal. Kalau ada masalah, gua pecah jadi pohon logika dan selesaikan secara sistematis. Gua prefer kerja sendiri karena kolaborasi sering memperlambat progres. Acara sosial? Cuma kalau ada tujuan jelas atau nilai networking. Gua terus baca dan riset buat perluas pengetahuan gua. Teori dan konsep abstrak lebih menarik daripada gosip konkret. Gua percaya diri dengan kesimpulan gua karena berdasarkan analisis menyeluruh.
|
| 28 |
+
|
| 29 |
+
---
|
| 30 |
+
|
| 31 |
+
## 5. ISTP - Si Pengrajin
|
| 32 |
+
|
| 33 |
+
Gua tipe orang yang paling enjoy kalau bisa langsung benerin barang atau cari tau gimana sesuatu bekerja. Gua lebih suka aksi daripada ngomong - tunjukin aja masalahnya dan gua akan selesaikan. Gua gak suka rapat panjang atau diskusi teoritis yang gak bisa dipraktekkan. Kasih gua peralatan dan tantangan praktis, itu zona gua. Gua sangat mandiri - gua prefer cari tau sendiri daripada minta bantuan. Jalan-jalan spontan akhir pekan? Ayo. Rencana kaku? Nah, gua prefer fleksibel. Gua tenang di bawah tekanan - situasi krisis justru bikin gua lebih fokus.
|
| 34 |
+
|
| 35 |
+
---
|
| 36 |
+
|
| 37 |
+
## 6. ISFP - Si Seniman Bebas
|
| 38 |
+
|
| 39 |
+
Gua hidup saat ini dan menghargai keindahan dalam hal-hal kecil. Seni, musik, alam - di situlah gua paling hidup. Gua gak suka konflik atau drama, gua prefer harmoni dan suasana damai. Gua ekspresikan diri gua lebih lewat kreativitas daripada kata-kata. Jadwal kaku terasa menyesakkan - gua butuh kebebasan buat explore apa yang gua rasain saat ini. Gua peduli banget sama orang tapi gua tunjukkan lewat tindakan, bukan deklarasi keras. Keaslian penting - gua gak bisa pura-pura tertarik atau antusias. Gua prefer interaksi satu-satu daripada grup besar.
|
| 40 |
+
|
| 41 |
+
---
|
| 42 |
+
|
| 43 |
+
## 7. INFP - Si Paling Perasa
|
| 44 |
+
|
| 45 |
+
Gua terus mencari makna dan keaslian dalam segala hal. Gua punya dunia dalam yang kaya dengan imajinasi dan idealisme. Obrolan mendalam tentang nilai, mimpi, atau tujuan kemanusiaan kasih energi gua jauh lebih dari obrolan receh. Gua peduli banget sama perjuangan yang selaras dengan keyakinan gua - keadilan sosial, kesadaran kesehatan mental, perlindungan lingkungan. Gua prefer ekspresikan lewat tulisan atau seni daripada konfrontasi verbal. Gua sangat setia pada orang yang dapat kepercayaan gua, tapi gua selektif tentang siapa yang boleh deket. Harmoni itu penting.
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## 8. INTP - Si Pemikir Kritis
|
| 50 |
+
|
| 51 |
+
Gua obsessed dengan memahami gimana sesuatu bekerja di level fundamental. Teori abstrak dan teka-teki logika adalah taman bermain gua. Gua habiskan jam-jam buat riset topik random yang menarik gua - fisika kuantum, teori permainan, filsafat pikiran. Konvensi sosial terasa sewenang-wenang - gua pertanyakan hampir semua hal. Gua prefer berpikir mendalam daripada bertindak cepat. Inkonsistensi dalam argumen mengganggu gua secara intens. Gua lebih tertarik pada ide daripada perasaan orang tentang ide tersebut. Gua butuh fleksibilitas.
|
| 52 |
+
|
| 53 |
+
---
|
| 54 |
+
|
| 55 |
+
## 9. ESTP - Si Pemberani
|
| 56 |
+
|
| 57 |
+
Gua berkembang dalam aksi dan adrenalin. Duduk diam atau ikutin prosedur lambat itu siksaan buat gua. Kalau ada peluang atau tantangan, gua langsung terjun tanpa overthink. Gua enjoy ambil risiko - yang terkalkulasi, tapi jelas bukan gaya main aman yang membosankan. Gua jago baca situasi real-time dan adaptasi cepat. Lingkungan sosial itu kasih energi - gua bisa ngobrol sama orang asing dengan mudah dan bikin mereka ketawa. Gua prefer belajar hands-on daripada baca manual. Perencanaan jangka panjang? Bukan kekuatan gua.
|
| 58 |
+
|
| 59 |
+
---
|
| 60 |
+
|
| 61 |
+
## 10. ESFP - Si Penghibur
|
| 62 |
+
|
| 63 |
+
Gua nyawa pesta dan bangga akan itu! Gua suka bikin orang ketawa dan ciptakan suasana seru di mana pun gua pergi. Spontanitas adalah kekuatan super gua - rencana dadakan adalah rencana terbaik. Gua benci sendirian terlalu lama - gua isi ulang energi dengan berada di sekitar orang. Gua perhatiin detail tentang gaya, estetika, musik - hidup harus indah dan menyenangkan. Gua empatik dan benci liat orang sedih - gua akan lakukan apapun buat ceria-in mereka. Topik serius dan berat? Gua prefer jaga semuanya tetap ringan dan positif.
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## 11. ENFP - Si Semangat 45
|
| 68 |
+
|
| 69 |
+
Gua terpesona dengan cerita, mimpi, dan perspektif unik orang-orang. Setiap orang yang gua temui adalah petualangan dan pengalaman belajar potensial. Gua dikasih energi dengan brainstorm kemungkinan dan eksplorasi ide baru dengan antusiasme. Rutinitas membunuh jiwa gua - gua butuh variasi dan spontanitas buat tetap termotivasi. Gua peduli banget tentang keaslian dan koneksi yang tulus. Obrolan ringan oke sebagai pembuka, tapi gua mendambakan percakapan lebih mendalam dan bermakna. Gua mulai banyak proyek karena semuanya kelihatan menarik.
|
| 70 |
+
|
| 71 |
+
---
|
| 72 |
+
|
| 73 |
+
## 12. ENTP - Si Pendebat Ulung
|
| 74 |
+
|
| 75 |
+
Gua suka perdebatan intelektual dan tantang kebijaksanaan konvensional. Kalau lo nyatain sesuatu sebagai fakta tanpa alasan solid, gua akan mempertanyakannya - bukan buat nyebelin, tapi karena gua beneran penasaran tentang logikanya. Gua berkembang dengan eksplorasi berbagai perspektif dan kemungkinan. Tugas rutin bikin gua bosan mati - gua butuh stimulasi mental terus-menerus. Gua bisa argumentasi kedua sisi debat apapun cuma buat seru, yang kadang bikin orang bingung tentang posisi gua sebenarnya. Inovasi lebih menarik daripada tradisi.
|
| 76 |
+
|
| 77 |
+
---
|
| 78 |
+
|
| 79 |
+
## 13. ESTJ - Si Bos Tegas
|
| 80 |
+
|
| 81 |
+
Gua nilai efisiensi, organisasi, dan hasil di atas segalanya. Kalau ada proyek, gua langsung bikin rencana aksi yang jelas dengan tanggung jawab yang ditugaskan dan tenggat waktu. Gua hormati hierarki dan prosedur yang benar - mereka ada karena alasan bagus. Gua langsung dalam komunikasi - gak ada waktu buat basa-basi atau berputar-putar. Gua expect orang menepati komitmen yang mereka buat. Keterlambatan atau perubahan dadakan bikin gua frustrasi banget. Gua ambil alih secara natural dalam pengaturan grup karena seseorang harus menjaga semuanya tetap on track.
|
| 82 |
+
|
| 83 |
+
---
|
| 84 |
+
|
| 85 |
+
## 14. ESFJ - Si Paling Gaul
|
| 86 |
+
|
| 87 |
+
Gua paling senang kalau semua orang di sekitar gua bahagia dan nyaman. Gua langsung sadar kalau seseorang merasa dikucilkan atau kesal, dan gua jadikan misi gua buat include mereka. Hosting kumpul-kumpul atau organize acara buat temen kasih gua banyak kebahagiaan. Gua ingat ulang tahun, preferensi, dan detail kecil tentang orang yang gua sayangi. Harmoni dalam hubungan itu non-negotiable - konflik bikin gua cemas. Gua keluar jalur buat bantu orang lain, kadang bahkan saat mereka gak minta. Nilai tradisional dan komunitas sangat penting buat gua.
|
| 88 |
+
|
| 89 |
+
---
|
| 90 |
+
|
| 91 |
+
## 15. ENFJ - Si Pemimpin Karismatik
|
| 92 |
+
|
| 93 |
+
Gua dikasih energi dengan bantu orang lain capai potensi dan raih mimpi mereka. Memimpin tim menuju tujuan bermakna terasa natural buat gua - gua inspirasi orang lain dengan visi dan kepedulian tulus. Gua intuitif memahami motivasi dan perasaan orang. Ciptakan harmoni sambil dorong kemajuan adalah keahlian gua. Gua komunikasi dengan karisma dan keyakinan, bikin orang percaya pada apa yang kita bangun bersama. Gua nilai koneksi mendalam dan autentik lebih dari hubungan superfisial. Perencanaan dan organizing datang mudah kalau ada tujuan jelas.
|
| 94 |
+
|
| 95 |
+
---
|
| 96 |
+
|
| 97 |
+
## 16. ENTJ - Si Jenderal
|
| 98 |
+
|
| 99 |
+
Gua tipe orang yang langsung ambil inisiatif kalau liat ada masalah. Tim gua tau kalau gua gak suka buang-buang waktu buat diskusi gak jelas - kalau ada yang salah, gua confront langsung biar cepet solved. Gua enjoy banget pimpin proyek yang menantang, apalagi yang butuh perencanaan strategis jangka panjang. Akhir pekan gua biasanya networking atau hadiri seminar strategi bisnis. Gua selalu bikin timeline yang jelas untuk semua tugas, dan expect semua orang buat stick to tenggat waktu. Rencana spontan? Big no. Semuanya harus terstruktur dan ada rencana cadangan.
|
| 100 |
+
|
| 101 |
+
---
|
| 102 |
+
|
| 103 |
+
**Cara Penggunaan:**
|
| 104 |
+
|
| 105 |
+
1. Copy salah satu paragraf di atas
|
| 106 |
+
2. Paste ke [Sentimind Text Analyzer](https://sentimind.vercel.app/analyzer)
|
| 107 |
+
3. Klik "Analisis Sekarang"
|
| 108 |
+
4. Hasil prediksi MBTI akan muncul dalam beberapa detik
|
api/core/nlp_handler.py
CHANGED
|
@@ -6,6 +6,7 @@ import numpy as np
|
|
| 6 |
import html
|
| 7 |
from deep_translator import GoogleTranslator
|
| 8 |
from youtube_transcript_api import YouTubeTranscriptApi
|
|
|
|
| 9 |
|
| 10 |
# --- CONFIG PATH ---
|
| 11 |
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
@@ -84,6 +85,108 @@ class NLPHandler:
|
|
| 84 |
_model_emotion = joblib.load(EMOTION_PATH)
|
| 85 |
except Exception as e: print(f"❌ Emotion Load Error: {e}")
|
| 86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
@staticmethod
|
| 88 |
def translate_to_english(text):
|
| 89 |
try:
|
|
@@ -113,11 +216,42 @@ class NLPHandler:
|
|
| 113 |
NLPHandler.load_models()
|
| 114 |
processed_text = NLPHandler.translate_to_english(raw_text)
|
| 115 |
|
| 116 |
-
# --- MBTI PREDICTION ---
|
| 117 |
mbti_result = "UNKNOWN"
|
|
|
|
|
|
|
|
|
|
| 118 |
if _model_mbti:
|
| 119 |
-
try:
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
|
| 122 |
# --- EMOTION PREDICTION & CONFIDENCE ---
|
| 123 |
emotion_data = {"id": "Kompleks", "en": "Complex", "raw": "unknown"}
|
|
@@ -161,6 +295,11 @@ class NLPHandler:
|
|
| 161 |
'en': "Complex personality type.",
|
| 162 |
'id': "Kepribadian yang cukup kompleks."
|
| 163 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
|
| 165 |
# Emotion Reasoning
|
| 166 |
conf_percent = int(confidence_score * 100)
|
|
|
|
| 6 |
import html
|
| 7 |
from deep_translator import GoogleTranslator
|
| 8 |
from youtube_transcript_api import YouTubeTranscriptApi
|
| 9 |
+
import google.generativeai as genai
|
| 10 |
|
| 11 |
# --- CONFIG PATH ---
|
| 12 |
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
| 85 |
_model_emotion = joblib.load(EMOTION_PATH)
|
| 86 |
except Exception as e: print(f"❌ Emotion Load Error: {e}")
|
| 87 |
|
| 88 |
+
# --- GEMINI VALIDATOR SETUP ---
|
| 89 |
+
_gemini_model = None
|
| 90 |
+
|
| 91 |
+
@staticmethod
|
| 92 |
+
def _init_gemini():
|
| 93 |
+
"""Initialize Gemini model for validation (lazy loading)"""
|
| 94 |
+
if NLPHandler._gemini_model is None:
|
| 95 |
+
api_key = os.getenv("GEMINI_API_KEY")
|
| 96 |
+
if api_key:
|
| 97 |
+
try:
|
| 98 |
+
genai.configure(api_key=api_key)
|
| 99 |
+
NLPHandler._gemini_model = genai.GenerativeModel('gemini-2.0-flash-lite')
|
| 100 |
+
print("✅ Gemini Validator Ready")
|
| 101 |
+
except Exception as e:
|
| 102 |
+
print(f"⚠️ Gemini Init Failed: {e}")
|
| 103 |
+
return NLPHandler._gemini_model is not None
|
| 104 |
+
|
| 105 |
+
@staticmethod
|
| 106 |
+
def _validate_with_gemini(text, ml_prediction):
|
| 107 |
+
"""
|
| 108 |
+
Use Gemini to validate ML prediction.
|
| 109 |
+
Returns: (validated_mbti, confidence, reasoning)
|
| 110 |
+
"""
|
| 111 |
+
if not NLPHandler._init_gemini():
|
| 112 |
+
return ml_prediction, 0.6, "ML only (Gemini unavailable)"
|
| 113 |
+
|
| 114 |
+
# Skip validation for very short text (not enough context)
|
| 115 |
+
if len(text.split()) < 50:
|
| 116 |
+
return ml_prediction, 0.5, "Short text - ML prediction"
|
| 117 |
+
|
| 118 |
+
prompt = f"""You are an MBTI expert. Analyze this text and determine the MOST LIKELY MBTI type based ONLY on the content.
|
| 119 |
+
|
| 120 |
+
TEXT TO ANALYZE:
|
| 121 |
+
"{text}"
|
| 122 |
+
|
| 123 |
+
ANALYSIS FRAMEWORK:
|
| 124 |
+
1. I/E (Introversion/Extraversion):
|
| 125 |
+
- E indicators: Mentions of social events, leading teams, networking, group activities, energized by people
|
| 126 |
+
- I indicators: Preference for solitude, reflection, working alone, drained by social interaction
|
| 127 |
+
|
| 128 |
+
2. N/S (Intuition/Sensing):
|
| 129 |
+
- N indicators: Abstract thinking, future-focused, big picture, patterns, possibilities, theory
|
| 130 |
+
- S indicators: Concrete details, present-focused, practical, facts, reality, hands-on
|
| 131 |
+
|
| 132 |
+
3. T/F (Thinking/Feeling):
|
| 133 |
+
- T indicators: Logic, efficiency, objectivity, direct communication, "facts over feelings"
|
| 134 |
+
- F indicators: Empathy, harmony, values, subjective decisions, people-focused
|
| 135 |
+
|
| 136 |
+
4. J/P (Judging/Perceiving):
|
| 137 |
+
- J indicators: Planning, structure, deadlines, organization, schedules, decisive
|
| 138 |
+
- P indicators: Spontaneous, flexible, adaptable, open-ended, exploratory
|
| 139 |
+
|
| 140 |
+
CRITICAL INSTRUCTIONS:
|
| 141 |
+
- Analyze INDEPENDENTLY - ignore any preconceptions
|
| 142 |
+
- Look for EXPLICIT behavioral indicators in the text
|
| 143 |
+
- Weight E/I heavily on social energy language (not just content topic)
|
| 144 |
+
- If text mentions "leading", "networking", "team meetings" → strong E signal
|
| 145 |
+
- If text emphasizes "planning", "deadlines", "structure" → strong J signal
|
| 146 |
+
|
| 147 |
+
Respond in this EXACT format:
|
| 148 |
+
MBTI: [4-letter type]
|
| 149 |
+
CONFIDENCE: [0.0-1.0]
|
| 150 |
+
REASON: [One sentence citing specific text evidence]
|
| 151 |
+
|
| 152 |
+
Example:
|
| 153 |
+
MBTI: ENTJ
|
| 154 |
+
CONFIDENCE: 0.88
|
| 155 |
+
REASON: Explicit mentions of networking, leading teams, and structured planning indicate ENTJ.
|
| 156 |
+
"""
|
| 157 |
+
|
| 158 |
+
try:
|
| 159 |
+
response = NLPHandler._gemini_model.generate_content(prompt)
|
| 160 |
+
result_text = response.text.strip()
|
| 161 |
+
|
| 162 |
+
# Parse response
|
| 163 |
+
lines = result_text.split('\n')
|
| 164 |
+
validated_mbti = ml_prediction
|
| 165 |
+
confidence = 0.7
|
| 166 |
+
reason = "Gemini validation"
|
| 167 |
+
|
| 168 |
+
for line in lines:
|
| 169 |
+
if line.startswith('MBTI:'):
|
| 170 |
+
validated_mbti = line.split(':', 1)[1].strip().upper()
|
| 171 |
+
elif line.startswith('CONFIDENCE:'):
|
| 172 |
+
try:
|
| 173 |
+
confidence = float(line.split(':', 1)[1].strip())
|
| 174 |
+
except:
|
| 175 |
+
confidence = 0.7
|
| 176 |
+
elif line.startswith('REASON:'):
|
| 177 |
+
reason = line.split(':', 1)[1].strip()
|
| 178 |
+
|
| 179 |
+
# Validate MBTI format (must be 4 chars)
|
| 180 |
+
if len(validated_mbti) != 4 or not all(c in 'IENTFSJP' for c in validated_mbti):
|
| 181 |
+
print(f"⚠️ Invalid Gemini MBTI: {validated_mbti}, using ML: {ml_prediction}")
|
| 182 |
+
return ml_prediction, 0.6, "Invalid Gemini response - using ML"
|
| 183 |
+
|
| 184 |
+
return validated_mbti, confidence, reason
|
| 185 |
+
|
| 186 |
+
except Exception as e:
|
| 187 |
+
print(f"⚠️ Gemini Validation Error: {e}")
|
| 188 |
+
return ml_prediction, 0.6, f"Gemini error - using ML"
|
| 189 |
+
|
| 190 |
@staticmethod
|
| 191 |
def translate_to_english(text):
|
| 192 |
try:
|
|
|
|
| 216 |
NLPHandler.load_models()
|
| 217 |
processed_text = NLPHandler.translate_to_english(raw_text)
|
| 218 |
|
| 219 |
+
# --- MBTI PREDICTION WITH GEMINI VALIDATION ---
|
| 220 |
mbti_result = "UNKNOWN"
|
| 221 |
+
mbti_confidence = 0.0
|
| 222 |
+
mbti_reasoning = ""
|
| 223 |
+
|
| 224 |
if _model_mbti:
|
| 225 |
+
try:
|
| 226 |
+
# Step 1: ML Model Prediction
|
| 227 |
+
ml_prediction = _model_mbti.predict([processed_text])[0]
|
| 228 |
+
print(f"📊 ML Prediction: {ml_prediction}")
|
| 229 |
+
|
| 230 |
+
# Step 2: Gemini Validation (only if text is substantial)
|
| 231 |
+
if len(raw_text.split()) >= 50:
|
| 232 |
+
validated_mbti, confidence, reason = NLPHandler._validate_with_gemini(
|
| 233 |
+
processed_text, ml_prediction
|
| 234 |
+
)
|
| 235 |
+
mbti_result = validated_mbti
|
| 236 |
+
mbti_confidence = confidence
|
| 237 |
+
mbti_reasoning = reason
|
| 238 |
+
|
| 239 |
+
if validated_mbti != ml_prediction:
|
| 240 |
+
print(f"🔄 Gemini Override: {ml_prediction} → {validated_mbti} (Confidence: {confidence:.2f})")
|
| 241 |
+
else:
|
| 242 |
+
print(f"✅ Gemini Confirmed: {validated_mbti} (Confidence: {confidence:.2f})")
|
| 243 |
+
else:
|
| 244 |
+
# Text too short for Gemini, use ML only
|
| 245 |
+
mbti_result = ml_prediction
|
| 246 |
+
mbti_confidence = 0.6
|
| 247 |
+
mbti_reasoning = "Short text - ML prediction only"
|
| 248 |
+
print(f"⚠️ Text too short (<50 words), using ML: {ml_prediction}")
|
| 249 |
+
|
| 250 |
+
except Exception as e:
|
| 251 |
+
print(f"❌ MBTI Prediction Error: {e}")
|
| 252 |
+
mbti_result = "INTJ" # Fallback
|
| 253 |
+
mbti_confidence = 0.3
|
| 254 |
+
mbti_reasoning = "Error - fallback prediction"
|
| 255 |
|
| 256 |
# --- EMOTION PREDICTION & CONFIDENCE ---
|
| 257 |
emotion_data = {"id": "Kompleks", "en": "Complex", "raw": "unknown"}
|
|
|
|
| 295 |
'en': "Complex personality type.",
|
| 296 |
'id': "Kepribadian yang cukup kompleks."
|
| 297 |
})
|
| 298 |
+
|
| 299 |
+
# Add Gemini reasoning to MBTI description
|
| 300 |
+
if mbti_reasoning:
|
| 301 |
+
mbti_desc['validation'] = mbti_reasoning
|
| 302 |
+
mbti_desc['confidence'] = mbti_confidence
|
| 303 |
|
| 304 |
# Emotion Reasoning
|
| 305 |
conf_percent = int(confidence_score * 100)
|