chatbot-backend / src /utils /greeting_handler.py
TalatMasood's picture
Updated code with greeting support
0d1bcfb
# src/utils/greeting_handler.py
import re
import random
from typing import Tuple, Optional
class GreetingHandler:
"""Handler for detecting and responding to greetings"""
# Singleton instance
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(GreetingHandler, cls).__new__(cls)
cls._instance._initialize()
return cls._instance
def _initialize(self):
"""Initialize patterns and responses"""
# Common greeting patterns with word boundaries to match whole words
self.greeting_patterns = [
# English Greetings
r'\b(hi|hello|hey|howdy|greetings|good morning|good afternoon|good evening|good day)\b',
r'\bho+la\b', # Spanish greeting with possible repeated 'o'
r'\bhiy+a\b', # "Hiya" with possible repeated 'y'
r'\bhel+o+\b', # "Hello" with possible repeated letters
r'\bhey+\b', # "Hey" with possible repeated 'y'
r'\bhi+\b', # "Hi" with possible repeated 'i'
r'\byo+\b', # "Yo" with possible repeated 'o'
r'how are you(\s|\?|$)',
r'what\'?s up',
r'nice to (meet|see) you',
r'\bhiya\b',
r'\bsup\b',
r'\bwhat up\b',
r'\bhow\'?s it going\b',
r'\bhow\'?s everything\b',
r'\bhow\'?s life\b',
r'\bhow\'?s your day\b',
r'\bhow\'?ve you been\b',
r'\bwhat\'?s new\b',
r'\bany news\b',
r'\bhowdy partner\b',
r'\bheya\b',
r'\bhallo\b',
r'\bhey there\b',
r'\btop of the morning\b',
# International Greetings
r'\bbonjour\b', # French greeting
r'\bciao\b', # Italian greeting
r'\bnamaste\b', # Hindi greeting
r'\bsalam\b', # Arabic greeting
r'\bassalamu alaikum\b', # Islamic greeting
r'\bshalom\b', # Hebrew greeting
# Russian Greetings (Transliterated)
r'\bprivet\b', # "Privet" - Informal Hello
r'\bzdravstvuyte\b', # "Zdravstvuyte" - Formal Hello
r'\bdobroe utro\b', # "Dobroe utro" - Good morning
r'\bdobryy den\b', # "Dobryy den" - Good afternoon
r'\bdobryy vecher\b', # "Dobryy vecher" - Good evening
r'\bkak dela\b', # "Kak dela" - How are you?
r'\bkak pozhivayesh\b', # "Kak pozhivayesh" - How have you been?
# Arabic Greetings (Transliterated)
r'\bmarhaban\b', # "Marhaban" - Hello
r'\bahlan\b', # "Ahlan" - Informal Hello
r'\bassalamu alaykum\b', # "As-salamu alaykum" - Peace be upon you
r'\bsabah al-khair\b', # "Sabah al-khair" - Good morning
r'\bmasa al-khair\b', # "Masa al-khair" - Good evening
r'\bkayfa halak\b', # "Kayfa halak" (m) - How are you?
r'\bkayfa halik\b', # "Kayfa halik" (f) - How are you?
r'\bkayfa al-umur\b', # "Kayfa al-umur" - How’s everything?
r'\bakhbarak\b', # "Akhbarak" (m) - Any news?
r'\bakhbarik\b', # "Akhbarik" (f) - Any news?
]
self.compiled_patterns = [re.compile(
pattern, re.IGNORECASE) for pattern in self.greeting_patterns]
# List of greeting responses to choose from for variety
self.greeting_responses = [
"Hello! How can I help you today?",
"Hi there! What can I assist you with?",
"Hey! How can I be of service?",
"Greetings! How may I assist you?",
"Hello! I'm here to help. What would you like to know?",
"Hi! I'm your assistant. What can I help you with?",
"Hello there! I'm ready to assist you. What's on your mind?",
"Hey! I'm here to provide information. What are you looking for?",
"Hi! How can I assist you today?"
]
# Special responses for "how are you" type greetings
self.how_are_you_responses = [
"I'm doing great, thanks for asking! How can I help you today?",
"I'm well, thank you! How may I assist you?",
"I'm fine, thanks! What can I help you with?",
"Doing well! I'm ready to help with whatever you need."
]
def is_greeting(self, query: str) -> Tuple[bool, Optional[str]]:
"""
Check if the query is a greeting
Args:
query (str): The user query
Returns:
Tuple[bool, Optional[str]]: (is_greeting, appropriate_response)
"""
# Convert to lowercase for case-insensitive matching
query_lower = query.lower().strip()
# Skip detection for longer queries (likely not just greetings)
word_count = len(query_lower.split())
if word_count > 10:
return False, None
# Check if query matches any greeting pattern
is_how_are_you = False
for pattern in self.compiled_patterns:
if re.search(pattern, query_lower):
# Special case for "how are you" type queries
if "how are you" in query_lower:
is_how_are_you = True
return True, self._get_response(is_how_are_you)
return False, None
def _get_response(self, is_how_are_you: bool = False) -> str:
"""
Get an appropriate greeting response
Args:
is_how_are_you (bool): Whether this is a "how are you" type greeting
Returns:
str: A greeting response
"""
if is_how_are_you:
return random.choice(self.how_are_you_responses)
return random.choice(self.greeting_responses)