anggars commited on
Commit
dd061e3
·
verified ·
1 Parent(s): 050ab1a

Sync from GitHub Actions: e4b793cd763e8a58bcc2672a46ff73aa77f1a891

Browse files
Files changed (2) hide show
  1. MBTI SAMPLES.md +108 -0
  2. 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: mbti_result = _model_mbti.predict([processed_text])[0]
120
- except: pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)