canksdi commited on
Commit
8aff53f
·
verified ·
1 Parent(s): ccbee09

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +195 -234
app.py CHANGED
@@ -341,213 +341,172 @@ def normalize_text(text):
341
 
342
  return text
343
 
344
- def generate_turkish_text(prompt, max_length=250):
345
- """Türkçe metin üretme fonksiyonu - geliştirilmiş versiyon"""
346
  try:
347
  inputs = tokenizer(prompt, return_tensors="pt")
348
 
349
- # Üretim parametreleri: daha üretken ve tutarlı yanıtlar için ayarlandı
350
  output = text_model.generate(
351
  inputs["input_ids"],
352
  max_length=max_length,
353
- num_return_sequences=1,
354
  do_sample=True,
355
- temperature=0.85, # Yaratıcılık için yüksek
356
- top_p=0.92, # Geniş kelime dağarcığı
357
- top_k=70, # Daha çeşitli kelimeler
358
- repetition_penalty=1.2, # Tekrarları azaltma
359
- no_repeat_ngram_size=3, # 3 kelimelik grupların tekrarını engelle
 
 
360
  pad_token_id=tokenizer.eos_token_id
361
  )
362
 
363
- generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
364
-
365
- # Başlangıç prompt'unu kaldır ve sadece yeni üretilen kısmı al
366
- if prompt in generated_text:
367
- generated_text = generated_text[len(prompt):].strip()
368
-
369
- # Çeşitli temizleme işlemleri
370
- # HTML/CSS etiketlerini temizle
371
- generated_text = re.sub(r'\[/?vc_\w+\]', '', generated_text)
372
-
373
- # Diğer potansiyel bozuk formatları temizle
374
- generated_text = re.sub(r'<.*?>', '', generated_text)
375
-
376
- # Çoklu boşlukları temizle
377
- generated_text = re.sub(r'\s+', ' ', generated_text).strip()
378
-
379
- # Sistem talimatlarını temizle - genişletilmiş liste
380
- patterns_to_clean = [
381
- r'arkadaşça destek mesajı:', r'dostça destek mesajı:',
382
- r'motive edici arkadaş mesajı:', r'coşkulu ve arkadaşça yanıt:',
383
- r'yanıt:', r'cevap:', r'cevabında şunları yap:',
384
- r'[0-9]\. .*', r'yanıtı:', r'kişinin mesajı:'
385
- ]
386
-
387
- for pattern in patterns_to_clean:
388
- generated_text = re.sub(pattern, '', generated_text, flags=re.IGNORECASE)
389
 
390
- # Son temizleme
391
- generated_text = re.sub(r'\s+', ' ', generated_text).strip()
392
-
393
- # İlk harfi büyük, son noktalama işareti kontrolü
394
- if generated_text:
395
- # İlk harf büyük
396
- generated_text = generated_text[0].upper() + generated_text[1:]
397
 
398
- # Son karakter noktalama işareti değilse, nokta ekle
399
- if not generated_text[-1] in ['.', '!', '?']:
400
- generated_text += '.'
401
-
402
- return generated_text
403
-
404
- except Exception as e:
405
- print(f"Metin üretme hatası: {str(e)}")
406
- return "Şu anda yanıt üretirken bir sorun oluştu. Lütfen daha sonra tekrar deneyin."
407
-
408
- async def create_speech_async(text):
409
- """Edge TTS ile doğal insan sesi üret - iyileştirilmiş hata yönetimi"""
410
- try:
411
- if not text or len(text.strip()) < 1:
412
- return None
413
 
414
- # Ses parametrelerini ayarla - daha doğal bir konuşma için
415
- communicate = edge_tts.Communicate(text, VOICE)
416
- audio_path = "response.mp3"
417
-
418
- # Dosya zaten varsa sil
419
- if os.path.exists(audio_path):
420
- os.remove(audio_path)
421
 
422
- await communicate.save(audio_path)
423
-
424
- # Dosyanın başarıyla oluşturulduğunu kontrol et
425
- if os.path.exists(audio_path) and os.path.getsize(audio_path) > 0:
426
- return audio_path
427
- return None
428
-
429
- except Exception as e:
430
- print(f"Ses oluşturma hatası: {str(e)}")
431
- return None
432
-
433
- def create_speech(text):
434
- """Ana thread'de async fonksiyonu çalıştır - hata yönetimi eklenmiş"""
435
- try:
436
- if not text or len(text.strip()) < 1:
437
- print("Ses oluşturulamadı: Metin boş")
438
- return None
439
 
440
- # Metni normalize et
441
- text = normalize_text(text)
 
442
 
443
- # Async işlemi çalıştır
444
- loop = asyncio.new_event_loop()
445
- asyncio.set_event_loop(loop)
446
- result = loop.run_until_complete(create_speech_async(text))
447
- loop.close()
448
 
449
- if result:
450
- return result
451
-
452
- # Ses oluşturulamazsa boş ses dosyası oluştur
453
- print("Ses dosyası oluşturulamadı, boş dosya döndürülüyor")
454
- with open("empty.mp3", "wb") as f:
455
- f.write(b"")
456
- return "empty.mp3"
457
 
458
  except Exception as e:
459
- print(f"Ses oluşturma hatası: {str(e)}")
460
- # Boş ses dosyası oluştur
461
- with open("empty.mp3", "wb") as f:
462
- f.write(b"")
463
- return "empty.mp3"
464
-
465
- def get_appropriate_expert_recommendations(text, emotion, score):
466
- """Kullanıcının durumuna uygun uzman önerileri seçer"""
467
- text_lower = text.lower()
468
 
469
- # Uygun öneri kategorisini seç
470
- if "uyuyam" in text_lower or "uykus" in text_lower or "uyku" in text_lower:
471
- category = "uyku_problemleri"
472
- elif "stress" in text_lower or "stres" in text_lower or "gergin" in text_lower or "baskı" in text_lower:
473
- category = "stress_yonetimi"
474
- elif "korku" in text_lower or "panik" in text_lower or "endişe" in text_lower or "kaygı" in text_lower:
475
- category = "kaygi_ve_panik"
476
- elif "motivasyon" in text_lower or "istek" in text_lower or "yapmak istemiyorum" in text_lower or "enerjim yok" in text_lower:
477
- category = "motivasyon_eksikligi"
478
- elif "acı" in text_lower or "keder" in text_lower or "üzüntü" in text_lower or "kayıp" in text_lower:
479
- category = "duygusal_acı"
480
- elif "utanç" in text_lower or "sosyal" in text_lower or "insanlar" in text_lower or "topluluk" in text_lower:
481
- category = "sosyal_kaygi"
482
- else:
483
- # Duygu analizi sonucuna göre en uygun kategoriyi seç
484
- if emotion == "üzüntü":
485
- category = "duygusal_acı"
486
- elif emotion == "kötü durum" and score > 0.8:
487
- category = "stress_yonetimi"
488
- else:
489
- # Varsayılan olarak stres yönetimi öneri ver
490
- category = "stress_yonetimi"
491
 
492
- # Seçilen kategoriden 1-2 öneri seç
493
- if category in EXPERT_RECOMMENDATIONS:
494
- recommendations = EXPERT_RECOMMENDATIONS[category]
495
- # Eğer birden fazla öneri varsa, rastgele 1-2 tane seç
496
- if len(recommendations) > 1:
497
- return random.sample(recommendations, min(2, len(recommendations)))
498
- return recommendations
499
 
500
- # Uygun bir kategori bulunamazsa boş liste döndür
501
- return []
502
-
503
- def format_recommendations(recommendations):
504
- """Önerileri okunabilir formatta biçimlendirir"""
505
- if not recommendations:
506
- return ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
 
508
- result = "\n\n**İşte sana yardımcı olabilecek birkaç öneri:**\n\n"
 
509
 
510
- for i, rec in enumerate(recommendations, 1):
511
- result += f"**{i}. {rec['title']}**\n"
512
- result += f"{rec['description']}\n"
513
- result += f"*Ne zaman kullanmalı:* {rec['when_to_use']}\n"
514
- result += f"*Faydası:* {rec['benefit']}\n\n"
 
 
 
515
 
516
- return result
517
 
518
- def get_personality_profile(text=None, emotion=None):
519
- """Kullanıcının durum ve ifadesine göre en uygun kişilik profilini seç"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
520
 
521
- # Eğer metin veya duygu belirtilmediyse varsayılan kişilik kullan
522
- if not text or not emotion:
523
- return PERSONALITY_PROFILES[DEFAULT_PERSONALITY]
524
 
525
- text_lower = text.lower()
 
 
 
 
 
526
 
527
- # Kişilik seçimi için ipuçları ara
528
- if any(word in text_lower for word in ["motivasyon", "isteksiz", "enerjim yok", "yapamıyorum", "başaramıyorum"]):
529
- return PERSONALITY_PROFILES["motive_edici_koc"]
530
- elif any(word in text_lower for word in ["anlamıyorum", "karmaşık", "kafam karıştı", "ne yapmam gerekiyor", "tavsiye"]):
531
- return PERSONALITY_PROFILES["bilge_danisman"]
532
- elif any(word in text_lower for word in ["üzgün", "mutsuz", "kötü", "yalnız", "anlaşılmıyorum"]):
533
- return PERSONALITY_PROFILES["anlayisli_dost"]
534
- elif any(word in text_lower for word in ["mutlu", "sevinçli", "heyecanlı", "neşeli"]):
535
- return PERSONALITY_PROFILES["pozitif_arkadas"]
536
-
537
- # Duygulara göre en uygun kişiliği seç
538
- if emotion == "üzüntü":
539
- return PERSONALITY_PROFILES["anlayisli_dost"]
540
- elif emotion == "mutluluk":
541
- return PERSONALITY_PROFILES["pozitif_arkadas"]
542
- elif emotion == "kötü durum":
543
- # Kötü durum için bilge veya motivasyon arasında rastgele seç
544
- return random.choice([PERSONALITY_PROFILES["bilge_danisman"], PERSONALITY_PROFILES["motive_edici_koc"]])
545
-
546
- # Varsayılan olarak anlayışlı dost modelini kullan
547
- return PERSONALITY_PROFILES[DEFAULT_PERSONALITY]
548
 
549
  def create_better_prompts(text, label, score):
550
- """Daha samimi, dostça ve arkadaşça promptlar oluştur - Genişletilmiş versiyon"""
551
 
552
  # Metni normalize et
553
  text = normalize_text(text)
@@ -556,9 +515,20 @@ def create_better_prompts(text, label, score):
556
  emotion, _ = detect_emotion_from_text(text, label, score)
557
  personality = get_personality_profile(text, emotion)
558
 
 
 
 
 
 
 
 
 
 
559
  # Soru veya komut kontrol et
560
  if is_question_or_command(text):
561
- return f"""{personality['prompt_prefix']}Bu kişiye bir {', '.join(personality['qualities'])} olarak yanıt ver.
 
 
562
 
563
  Kişinin mesajı: '{text}'
564
 
@@ -567,62 +537,46 @@ Yanıt:"""
567
  # Duygu durumuna göre prompt oluştur - daha detaylı şekilde ve kişilik özelliklerine göre
568
  if label == "NEGATIVE":
569
  if score > 0.85: # Çok olumsuz
570
- prompt = f"""{personality['prompt_prefix']}Kişi çok üzgün ve olumsuz bir durumda: '{text}'
 
 
571
 
572
- Ona bir {', '.join(personality['qualities'])} olarak, içten bir şekilde destek ol. Cevabında:
573
- - Önce derin bir empati göster, nasıl hissettiğini gerçekten anladığını hissettir
574
- - Kendi hayatından benzer bir zorluktan nasıl geçtiğini kısaca paylaş (veya başkalarının benzer durumları nasıl aştığından bahset)
575
- - Ona özel birkaç somut öneri sun, ama dayatmadan yap
576
- - Bu zorlu dönemin geçici olduğunu hatırlat
577
- - Yanında olduğunu ve birlikte üstesinden geleceğinizi vurgula
578
- - {personality['qualities'][0]} ve {personality['qualities'][2]} bir yaklaşım sergile
579
- - Olumlu bir notla bitir, ona olan güvenini belirt
580
 
581
  Yanıt:"""
582
  else: # Orta derecede olumsuz
583
- prompt = f"""{personality['prompt_prefix']}Kişi biraz moral bozukluğu yaşıyor: '{text}'
 
 
584
 
585
- Ona bir {', '.join(personality['qualities'])} olarak:
586
- - Duygularını anladığını ve değer verdiğini göster
587
- - Yaşadığı zorluğu küçümsemeden anlayışla karşıla
588
- - Bu durumun üstesinden nasıl gelebileceğine dair kişiselleştirilmiş öneriler sun
589
- - Umut ve motivasyon ver
590
- - Birlikte bir şeyler yapmayı teklif et veya somut çözümler öner
591
- - Konuşmaya devam etmesini teşvik et
592
- - {personality['qualities'][0]} ve {personality['qualities'][1]} bir yaklaşım sergile
593
 
594
  Yanıt:"""
595
  elif label == "POSITIVE" and score < 0.6: # Hafif olumlu
596
- prompt = f"""{personality['prompt_prefix']}Kişi olumlu ama motivasyona ihtiyacı var: '{text}'
 
 
597
 
598
- Ona bir {', '.join(personality['qualities'])} olarak:
599
- - Olumlu duygularını takdir et ve daha da güçlendir
600
- - Başarılarını kutla ve bunları nasıl sürdürebileceğine dair ipuçları ver
601
- - Gelecek için heyecan verici olasılıklardan bahset
602
- - Potansiyelini hatırlat ve ona olan inancını belirt
603
- - Beraber yapabileceğiniz keyifli aktiviteler öner veya bu enerjiyi nasıl koruyacağına dair tavsiyeler ver
604
- - {personality['qualities'][2]} ve {personality['qualities'][3]} bir yaklaşım sergile
605
- - Sohbete devam etmeye teşvik et
606
 
607
  Yanıt:"""
608
  else: # Çok olumlu
609
- prompt = f"""{personality['prompt_prefix']}Kişi çok mutlu ve coşkulu: '{text}'
 
 
610
 
611
- Ona bir {', '.join(personality['qualities'])} olarak:
612
- - Mutluluğunu kutla ve bu sevinci paylaş
613
- - Bu güzel anın tadını nasıl çıkarabileceğine dair öneriler sun
614
- - Başarısını veya mutluluğunu öv, bu başarıyı nasıl elde ettiğini sorup daha da derinleştir
615
- - Bu olumlu duyguları nasıl sürdürebileceğine dair ipuçları ver
616
- - Gelecekteki diğer güzel olasılıklardan bahset
617
- - {personality['qualities'][0]} ve {personality['qualities'][3]} bir yaklaşım sergile
618
- - Bu mutluluğu birlikte kutlamayı teklif et veya bu mutlulukla neler yapabileceğine dair fikirler paylaş
619
 
620
  Yanıt:"""
621
 
622
  return prompt
623
 
624
  def process_input(text, personality_choice=None):
625
- """Kullanıcı girdisini işle - geliştirilmiş, kapsamlı versiyon"""
626
  start_time = time.time()
627
 
628
  try:
@@ -661,27 +615,34 @@ def process_input(text, personality_choice=None):
661
  # Geliştirilmiş promptlar oluştur
662
  prompt = create_better_prompts(text, label, score)
663
 
664
- # Türkçe metin üret - kişiliğe göre ayarlanmış parametrelerle
665
  print("Metin üretiliyor...")
666
- response = generate_turkish_text(prompt, max_length=300)
667
 
668
- # Eğer yanıt üretilemediyse
669
- if not response or len(response) < 5:
670
- response = "Üzgünüm, şu anda yanıt üretirken bir sorun yaşadım. Lütfen daha sonra tekrar deneyin."
671
-
672
- # Cevap çok uzunsa kısalt, ama anlamlı bir şekilde
673
- if len(response) > 350:
674
- sentences = re.split(r'(?<=[.!?])\s+', response)
675
- shortened_response = ""
676
- for sentence in sentences:
677
- if len(shortened_response) + len(sentence) <= 350:
678
- shortened_response += sentence + " "
679
- else:
680
- break
681
- response = shortened_response.strip()
682
-
683
- # Uzman önerileri ekle - belirli şartlara göre
684
- if label == "NEGATIVE" and score > 0.7 and random.random() < 0.7: # %70 ihtimalle olumsuz durumlarda öneri ekle
 
 
 
 
 
 
 
685
  recommendations = get_appropriate_expert_recommendations(text, emotion, score)
686
  if recommendations:
687
  formatted_recs = format_recommendations(recommendations)
@@ -689,7 +650,7 @@ def process_input(text, personality_choice=None):
689
  response += formatted_recs
690
 
691
  # Emoji ekle - duygu durumuna göre
692
- if random.random() < 0.7: # %70 ihtimalle emoji ekle
693
  response = add_emojis(response, emotion, emoji_count)
694
 
695
  print(f"Üretilen yanıt: {response[:50]}...")
 
341
 
342
  return text
343
 
344
+ def generate_turkish_text(prompt, max_length=300):
345
+ """Türkçe metin üretme fonksiyonu - geliştirilmiş kalite kontrollü versiyon"""
346
  try:
347
  inputs = tokenizer(prompt, return_tensors="pt")
348
 
349
+ # Parametreler - daha tutarlı ve anlamlı yanıtlar için optimize edildi
350
  output = text_model.generate(
351
  inputs["input_ids"],
352
  max_length=max_length,
353
+ num_return_sequences=3, # Birden fazla yanıt üret, en iyisini seç
354
  do_sample=True,
355
+ temperature=0.75, # Daha tutarlı yanıtlar için düşürüldü
356
+ top_p=0.88, # Daha az rastgele, daha anlamlı
357
+ top_k=50, # Daha az seçenek, daha tutarlı
358
+ repetition_penalty=1.3, # Tekrarları daha sert cezalandır
359
+ no_repeat_ngram_size=3, # 3 kelime tekrarını engelle
360
+ num_beam_groups=3, # Çeşitlilik için beam grupları
361
+ diversity_penalty=1.0, # Çeşitlilik için
362
  pad_token_id=tokenizer.eos_token_id
363
  )
364
 
365
+ # Birden fazla yanıt üretildi, en anlamlı olanı seç
366
+ best_response = ""
367
+ best_score = 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
 
369
+ for i in range(min(3, len(output))):
370
+ candidate = tokenizer.decode(output[i], skip_special_tokens=True)
 
 
 
 
 
371
 
372
+ # Prompt'tan sonraki kısmı al
373
+ if prompt in candidate:
374
+ candidate = candidate[len(prompt):].strip()
 
 
 
 
 
 
 
 
 
 
 
 
375
 
376
+ # Temizlik işlemleri
377
+ candidate = clean_response(candidate)
 
 
 
 
 
378
 
379
+ # Yanıt kalitesini ölç
380
+ score = score_response_quality(candidate)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
 
382
+ if score > best_score:
383
+ best_score = score
384
+ best_response = candidate
385
 
386
+ # En iyi yanıt çok kısaysa, tekrar dene
387
+ if len(best_response) < 20 and best_score < 0.5:
388
+ print("Yanıt kalitesi düşük, tekrar deneniyor...")
389
+ # Farklı sıcaklık parametresi ile tekrar dene
390
+ return generate_turkish_text(prompt + " Lütfen detaylı yanıt ver.", max_length)
391
 
392
+ print(f"En iyi yanıt kalite skoru: {best_score:.2f}")
393
+ return best_response
 
 
 
 
 
 
394
 
395
  except Exception as e:
396
+ print(f"Metin üretme hatası: {str(e)}")
397
+ return "Şu anda yanıt üretirken bir sorun oluştu. Lütfen daha sonra tekrar deneyin."
398
+
399
+ def clean_response(text):
400
+ """Yanıtı temizle ve kalitesini artır"""
401
+ # HTML/CSS etiketlerini temizle
402
+ text = re.sub(r'\[/?vc_\w+\]', '', text)
 
 
403
 
404
+ # Diğer potansiyel bozuk formatları temizle
405
+ text = re.sub(r'<.*?>', '', text)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
 
407
+ # Çoklu boşlukları temizle
408
+ text = re.sub(r'\s+', ' ', text).strip()
 
 
 
 
 
409
 
410
+ # Sistem talimatlarını temizle - genişletilmiş ve daha kapsamlı liste
411
+ patterns_to_clean = [
412
+ r'arkadaşça destek mesajı:', r'dostça destek mesajı:',
413
+ r'motive edici arkadaş mesajı:', r'coşkulu ve arkadaşça yanıt:',
414
+ r'yanıt:', r'cevap:', r'cevabında şunları yap:', r'cevabımda:',
415
+ r'[0-9]\. .*?:', r'yanıtı:', r'kişinin mesajı:', r'yapmalısın:',
416
+ r'Şunları yapmalısın:', r'Şöyle cevap ver:', r'Böyle cevap ver:',
417
+ r'Adımlar:', r'Şunları yap:', r'Bu kişiye .*? olarak:',
418
+ r'Ona bir .*? olarak:', r'Bir .*? olarak yanıt veriyorum:',
419
+ r'Sana .*? olarak yanıt veriyorum:'
420
+ ]
421
+
422
+ for pattern in patterns_to_clean:
423
+ text = re.sub(pattern, '', text, flags=re.IGNORECASE)
424
+
425
+ # Maddeli liste yapıları kaldır
426
+ text = re.sub(r'^\s*[\*\-\•]\s*', '', text, flags=re.MULTILINE)
427
+
428
+ # Başlangıç klişelerini kaldır
429
+ cliche_starts = [
430
+ "Anlıyorum", "Anladım", "Seni anlıyorum", "Seni çok iyi anlıyorum",
431
+ "Üzgünüm", "Üzüldüm", "Haklısın", "Kesinlikle haklısın",
432
+ "Merhaba", "Selam", "Öncelikle", "İşte", "Tabii"
433
+ ]
434
+
435
+ for start in cliche_starts:
436
+ if text.startswith(start):
437
+ text = text[len(start):].strip()
438
+ # Noktalama kaldır
439
+ if text and text[0] in [',', '.', ':', ';', '!']:
440
+ text = text[1:].strip()
441
 
442
+ # Son temizleme
443
+ text = re.sub(r'\s+', ' ', text).strip()
444
 
445
+ # İlk harfi büyük, son noktalama işareti kontrolü
446
+ if text:
447
+ # İlk harf büyük
448
+ text = text[0].upper() + text[1:]
449
+
450
+ # Son karakter noktalama işareti değilse, nokta ekle
451
+ if not text[-1] in ['.', '!', '?']:
452
+ text += '.'
453
 
454
+ return text
455
 
456
+ def score_response_quality(text):
457
+ """Yanıt kalitesini değerlendir"""
458
+ score = 0.5 # Başlangıç skoru
459
+
460
+ # Uzunluk - çok kısa veya çok uzun olmamalı
461
+ length = len(text)
462
+ if 20 <= length <= 300:
463
+ score += 0.2
464
+ elif length < 20:
465
+ score -= 0.3
466
+
467
+ # Tekrar eden kelime veya ifadeler
468
+ words = text.lower().split()
469
+ unique_words = set(words)
470
+ word_variety = len(unique_words) / len(words) if words else 0
471
+
472
+ if word_variety > 0.7: # Yüksek çeşitlilik
473
+ score += 0.15
474
+ elif word_variety < 0.5: # Düşük çeşitlilik
475
+ score -= 0.2
476
+
477
+ # Kopya-yapıştır yapılar
478
+ if any(text.count(phrase) > 1 for phrase in [word for word in words if len(word) > 5]):
479
+ score -= 0.15
480
+
481
+ # Konu bütünlüğü - noktalama işaretleri ile cümle yapısını kontrol et
482
+ sentences = re.split(r'[.!?]', text)
483
+ if 2 <= len(sentences) <= 5:
484
+ score += 0.1
485
+
486
+ # Klişe veya genel ifadeler - samimiyeti azaltır
487
+ cliches = [
488
+ "her şey güzel olacak", "sorunlar geçici", "mutlu olmaya bak",
489
+ "hayat kısa", "kendine iyi bak", "herkesin sorunları var",
490
+ "zaman her şeyin ilacı", "yarın başka bir gün"
491
+ ]
492
 
493
+ if any(cliche in text.lower() for cliche in cliches):
494
+ score -= 0.1
 
495
 
496
+ # Daha semantik ve spesifik ifadeler kullanma
497
+ specific_phrases = [
498
+ "hissettiğin", "yaşadığın", "deneyimin", "düşüncelerin",
499
+ "gelecek", "geçmiş", "bugün", "yarın", "adım", "strateji",
500
+ "önerim", "deneyebilirsin", "hatırla", "unutma", "farket"
501
+ ]
502
 
503
+ if any(phrase in text.lower() for phrase in specific_phrases):
504
+ score += 0.2
505
+
506
+ return min(1.0, max(0.0, score)) # 0 ile 1 arasında sınırla
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
 
508
  def create_better_prompts(text, label, score):
509
+ """Daha samimi, dostça ve arkadaşça promptlar oluştur - Kalite odaklı versiyon"""
510
 
511
  # Metni normalize et
512
  text = normalize_text(text)
 
515
  emotion, _ = detect_emotion_from_text(text, label, score)
516
  personality = get_personality_profile(text, emotion)
517
 
518
+ # Ortak kılavuz ilkeler - kaliteli ve kişiselleştirilmiş yanıtlar için
519
+ common_guide = f"""Önemli: Verdiğin yanıt tamamen doğal, samimi ve içten olmalı. Yapay ve genelgeçer ifadelerden, klişelerden kaçın.
520
+ Bu kişinin mesajına özel bir yanıt oluştur, başka birine yazılmış gibi olmasın.
521
+ Kısa, öz ve ÇOKLU boşluklar/satır atlamalar olmadan yanıt ver.
522
+ Asla şablonlar veya listeler kullanma.
523
+ Mesajın özüne odaklan ve gerçekten yardımcı olmaya çalış.
524
+ Şu konu ve duygular üzerine odaklan: '{text}'
525
+ """
526
+
527
  # Soru veya komut kontrol et
528
  if is_question_or_command(text):
529
+ return f"""{personality['prompt_prefix']}
530
+ {common_guide}
531
+ Bu kişi sana bir soru sormuş veya bir istekte bulunmuş. Ona bir {', '.join(personality['qualities'])} olarak cevap ver.
532
 
533
  Kişinin mesajı: '{text}'
534
 
 
537
  # Duygu durumuna göre prompt oluştur - daha detaylı şekilde ve kişilik özelliklerine göre
538
  if label == "NEGATIVE":
539
  if score > 0.85: # Çok olumsuz
540
+ prompt = f"""{personality['prompt_prefix']}
541
+ {common_guide}
542
+ Kişi çok üzgün ve zor bir durumda. '{text}' ifadesinden anlaşıldığı üzere duygusal destek ve anlayışa ihtiyacı var.
543
 
544
+ Ona bir {', '.join(personality['qualities'])} olarak yardım et. Standart tavsiyeler vermek yerine, onun özgün durumuna ve duygularına odaklan.
545
+ Örnek cevap tarzı: '{personality['example']}'
 
 
 
 
 
 
546
 
547
  Yanıt:"""
548
  else: # Orta derecede olumsuz
549
+ prompt = f"""{personality['prompt_prefix']}
550
+ {common_guide}
551
+ Kişi biraz olumsuz hissediyor. '{text}' ifadesinden anlaşıldığı üzere bazı zorluklar yaşıyor olabilir.
552
 
553
+ Ona bir {', '.join(personality['qualities'])} olarak anlayış göster. Basmakalıp tavsiyeler vermek yerine, durumuna özel yaklaşımlar düşün.
554
+ Örnek cevap tarzı: '{personality['example']}'
 
 
 
 
 
 
555
 
556
  Yanıt:"""
557
  elif label == "POSITIVE" and score < 0.6: # Hafif olumlu
558
+ prompt = f"""{personality['prompt_prefix']}
559
+ {common_guide}
560
+ Kişi olumlu ama daha fazla motivasyona ihtiyacı var. '{text}' ifadesinden anlaşıldığı üzere iyi bir durumda ama daha iyiye gitmek istiyor olabilir.
561
 
562
+ Ona bir {', '.join(personality['qualities'])} olarak enerji ver. Klişelerden kaçın ve onun bu olumlu enerjisini nasıl sürdüreceğine dair özgün fikirler sun.
563
+ Örnek cevap tarzı: '{personality['example']}'
 
 
 
 
 
 
564
 
565
  Yanıt:"""
566
  else: # Çok olumlu
567
+ prompt = f"""{personality['prompt_prefix']}
568
+ {common_guide}
569
+ Kişi çok mutlu ve coşkulu. '{text}' ifadesinden anlaşıldığı üzere harika bir durum veya başarı yaşamış olabilir.
570
 
571
+ Ona bir {', '.join(personality['qualities'])} olarak bu mutluluğu paylaş. Sıradan tebrikler yerine, bu özel anın nasıl daha anlamlı olabileceğine dair düşünceler ekle.
572
+ Örnek cevap tarzı: '{personality['example']}'
 
 
 
 
 
 
573
 
574
  Yanıt:"""
575
 
576
  return prompt
577
 
578
  def process_input(text, personality_choice=None):
579
+ """Kullanıcı girdisini işle - Geliştirilmiş yanıt kalitesi"""
580
  start_time = time.time()
581
 
582
  try:
 
615
  # Geliştirilmiş promptlar oluştur
616
  prompt = create_better_prompts(text, label, score)
617
 
618
+ # Türkçe metin üret - kalite kontrolü ile
619
  print("Metin üretiliyor...")
620
+ response = generate_turkish_text(prompt, max_length=350)
621
 
622
+ # Eğer yanıt üretilemediyse veya çok kısaysa
623
+ if not response or len(response) < 10:
624
+ # Daha basit bir prompt ile tekrar dene
625
+ simple_prompt = f"Şu konuda yardımcı ve dost cevap ver: '{text}'"
626
+ response = generate_turkish_text(simple_prompt, max_length=200)
627
+
628
+ if not response or len(response) < 10:
629
+ response = "Üzgünüm, şu anda anlamlı bir yanıt üretirken sorun yaşıyorum. Lütfen mesajınızı farklı bir şekilde ifade ederek tekrar deneyin."
630
+
631
+ # Son temizlik ve kalite kontrolü
632
+ response = clean_response(response)
633
+
634
+ # Yanıt kalitesi çok düşükse, yedek yanıtlar kullan
635
+ if score_response_quality(response) < 0.4:
636
+ fallback_responses = [
637
+ f"Mesajını aldım. '{text}' konusunda seninle tamamen aynı fikirdeyim. Bunu biraz daha açabilir misin?",
638
+ f"'{text}' hakkında ne hissettiğini anlıyorum. Bu konuda daha fazla konuşmak ister misin?",
639
+ f"Bu durumu yaşamak gerçekten zor olmalı. Seninle daha fazla konuşmak ve nasıl yardımcı olabileceğimi bulmak isterim.",
640
+ f"Düşüncelerini paylaştığın için teşekkür ederim. Bu konuda seni daha iyi anlamak istiyorum. Detaylı anlatır mısın?"
641
+ ]
642
+ response = random.choice(fallback_responses)
643
+
644
+ # Uzman önerileri ekle - belirli şartlara göre ve kalite kontrolü ile
645
+ if label == "NEGATIVE" and score > 0.7 and random.random() < 0.6: # %60 ihtimalle olumsuz durumlarda öneri ekle
646
  recommendations = get_appropriate_expert_recommendations(text, emotion, score)
647
  if recommendations:
648
  formatted_recs = format_recommendations(recommendations)
 
650
  response += formatted_recs
651
 
652
  # Emoji ekle - duygu durumuna göre
653
+ if random.random() < 0.5: # %50 ihtimalle emoji ekle (fazla emoji kullanımı azaltıldı)
654
  response = add_emojis(response, emotion, emoji_count)
655
 
656
  print(f"Üretilen yanıt: {response[:50]}...")