Upload app.py
Browse files
app.py
CHANGED
@@ -341,213 +341,172 @@ def normalize_text(text):
|
|
341 |
|
342 |
return text
|
343 |
|
344 |
-
def generate_turkish_text(prompt, max_length=
|
345 |
-
"""Türkçe metin üretme fonksiyonu - geliştirilmiş versiyon"""
|
346 |
try:
|
347 |
inputs = tokenizer(prompt, return_tensors="pt")
|
348 |
|
349 |
-
#
|
350 |
output = text_model.generate(
|
351 |
inputs["input_ids"],
|
352 |
max_length=max_length,
|
353 |
-
num_return_sequences=
|
354 |
do_sample=True,
|
355 |
-
temperature=0.
|
356 |
-
top_p=0.
|
357 |
-
top_k=
|
358 |
-
repetition_penalty=1.
|
359 |
-
no_repeat_ngram_size=3, # 3
|
|
|
|
|
360 |
pad_token_id=tokenizer.eos_token_id
|
361 |
)
|
362 |
|
363 |
-
|
364 |
-
|
365 |
-
|
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 |
-
|
391 |
-
|
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 |
-
#
|
399 |
-
if
|
400 |
-
|
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 |
-
|
415 |
-
|
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 |
-
|
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 |
-
|
441 |
-
|
|
|
442 |
|
443 |
-
#
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
|
449 |
-
|
450 |
-
|
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"
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
"""Kullanıcının durumuna uygun uzman önerileri seçer"""
|
467 |
-
text_lower = text.lower()
|
468 |
|
469 |
-
#
|
470 |
-
|
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 |
-
#
|
493 |
-
|
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 |
-
#
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
507 |
|
508 |
-
|
|
|
509 |
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
|
|
|
|
|
|
515 |
|
516 |
-
return
|
517 |
|
518 |
-
def
|
519 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
520 |
|
521 |
-
|
522 |
-
|
523 |
-
return PERSONALITY_PROFILES[DEFAULT_PERSONALITY]
|
524 |
|
525 |
-
|
|
|
|
|
|
|
|
|
|
|
526 |
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
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 -
|
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']}
|
|
|
|
|
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']}
|
|
|
|
|
571 |
|
572 |
-
Ona bir {', '.join(personality['qualities'])} olarak,
|
573 |
-
|
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']}
|
|
|
|
|
584 |
|
585 |
-
Ona bir {', '.join(personality['qualities'])} olarak
|
586 |
-
|
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']}
|
|
|
|
|
597 |
|
598 |
-
Ona bir {', '.join(personality['qualities'])} olarak
|
599 |
-
|
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']}
|
|
|
|
|
610 |
|
611 |
-
Ona bir {', '.join(personality['qualities'])} olarak
|
612 |
-
|
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 -
|
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 -
|
665 |
print("Metin üretiliyor...")
|
666 |
-
response = generate_turkish_text(prompt, max_length=
|
667 |
|
668 |
-
# Eğer yanıt üretilemediyse
|
669 |
-
if not response or len(response) <
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
|
674 |
-
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
682 |
-
|
683 |
-
|
684 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
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]}...")
|