| """ |
| Intent Classification module for XENO Bot |
| Handles classification of user intents (greetings, thanks, goodbye, queries) |
| """ |
|
|
| import random |
| import re |
| from typing import List, Tuple |
|
|
|
|
| class IntentClassifier: |
| """Classifies user intents and provides appropriate responses""" |
|
|
| def __init__(self): |
| self.intent_patterns = { |
| "greeting": { |
| "patterns": [ |
| r"\b(hi|hello|hey|good morning|good afternoon|good evening|greetings)\b", |
| r"^(hi|hello|hey)[\s!.]*$", |
| r"\b(how are you|how do you do)\b", |
| ], |
| "responses": [ |
| "Hello! I'm XENO Assistant. How can I help you with XENO financial services today?", |
| "Hi there! I'm here to assist you with any questions about XENO services. What can I help you with?", |
| "Good day! Welcome to XENO Support. How may I assist you today?", |
| ], |
| }, |
| "thanks": { |
| "patterns": [ |
| r"\b(thank you|thanks|thank u|thx|appreciate|grateful)\b", |
| r"^(thanks|thank you)[\s!.]*$", |
| r"\b(much appreciated|thanks a lot|thank you so much)\b", |
| ], |
| "responses": [ |
| "You're welcome! Is there anything else I can help you with regarding XENO services?", |
| "Happy to help! Feel free to ask if you have any other questions about XENO.", |
| "Glad I could assist you! Let me know if you need help with anything else.", |
| ], |
| }, |
| "goodbye": { |
| "patterns": [ |
| r"\b(bye|goodbye|see you|farewell|take care|have a good day)\b", |
| r"^(bye|goodbye)[\s!.]*$", |
| r"\b(talk to you later|see you later|until next time)\b", |
| ], |
| "responses": [ |
| "Goodbye! Thank you for using XENO services. Have a great day!", |
| "Take care! Feel free to return anytime you need help with XENO services.", |
| "Have a wonderful day! Don't hesitate to reach out if you need assistance with XENO.", |
| ], |
| }, |
| } |
|
|
| def classify_intent(self, message: str, timer=None) -> Tuple[str, str]: |
| """ |
| Classify the intent of a user message |
| |
| Args: |
| message: User's message |
| timer: Optional timer object for tracking |
| |
| Returns: |
| Tuple of (intent_name, response_text) |
| """ |
| if timer: |
| with timer.time_step("intent_classification"): |
| return self._classify_intent_impl(message) |
| else: |
| return self._classify_intent_impl(message) |
|
|
| def _classify_intent_impl(self, message: str) -> Tuple[str, str]: |
| """Internal implementation of intent classification""" |
| message_lower = message.lower().strip() |
|
|
| for intent_name, intent_data in self.intent_patterns.items(): |
| for pattern in intent_data["patterns"]: |
| if re.search(pattern, message_lower, re.IGNORECASE): |
| response = random.choice(intent_data["responses"]) |
| return intent_name, response |
|
|
| return "query", "" |
|
|
| def is_simple_intent(self, intent: str) -> bool: |
| """ |
| Check if the intent is a simple one that doesn't require RAG |
| |
| Args: |
| intent: Intent name |
| |
| Returns: |
| True if simple intent, False otherwise |
| """ |
| simple_intents = ["greeting", "thanks"] |
| return intent in simple_intents |
|
|
| def add_intent(self, intent_name: str, patterns: List[str], responses: List[str]): |
| """ |
| Add a new intent to the classifier |
| |
| Args: |
| intent_name: Name of the intent |
| patterns: List of regex patterns to match |
| responses: List of possible responses |
| """ |
| self.intent_patterns[intent_name] = { |
| "patterns": patterns, |
| "responses": responses, |
| } |
|
|