Spaces:
Build error
Build error
| import re | |
| from sentence_transformers import SentenceTransformer, util | |
| from typing import Dict, Any | |
| model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2') | |
| # Define the Intent Rules | |
| dataset = { | |
| "data": [ | |
| { | |
| "intent": "request_money", | |
| "utterances": [ | |
| {"text": "I need to request money for project 223 to buy some tools, the amount I need is 500 riyals"}, | |
| {"text": "Please add a money request for the project Abha University for 300 riyals"}, | |
| {"text": "I need 1000 riyals for project 445 to purchase some equipment"}, | |
| {"text": "Can you initiate a money request for project 678 with an amount of 250 riyals for team activities?"}, | |
| {"text": "Requesting 800 riyals for the project Green Energy for office supplies"} | |
| ] | |
| }, | |
| { | |
| "intent": "submit_task", | |
| "utterances": [ | |
| {"text": "I have completed the task 1025, please mark it as done"}, | |
| {"text": "Mark task 3054 as finished in the system"}, | |
| {"text": "Task 8899 has been completed, update its status"}, | |
| {"text": "Please mark task 1122 as done, I just finished it"}, | |
| {"text": "Set the status of task 4500 to finished"} | |
| ] | |
| }, | |
| { | |
| "intent": "get_project_status", | |
| "utterances": [ | |
| {"text": "Can you tell me the status of project 223?"}, | |
| {"text": "What is the current progress on project Abha University?"}, | |
| {"text": "I need an update on project 445. What is its status?"}, | |
| {"text": "Could you check and let me know the status of the Smart City project?"}, | |
| {"text": "What’s the progress on the renewable energy project?"} | |
| ] | |
| } | |
| ] | |
| } | |
| def extract_amount_with_context(text: str) -> Dict[str, Any]: | |
| """Extract the amount (in currency) along with the currency term and context using regex.""" | |
| # Adjust the regex to capture the amount and surrounding words | |
| match = re.search(r'(\d+)\s*(riyals?|reels?|rils?|reel?|dollars?|money|amount|usd|euro|pounds?)\s*(\w{1,20})?(\w{1,20})?', text.lower()) | |
| if match: | |
| # Extract the amount and the currency type | |
| amount = match.group(1) | |
| currency = match.group(2) | |
| additional_info = f"{match.group(3)} {match.group(4)}".strip() if match.group(3) or match.group(4) else None | |
| return {"amount": amount, "currency": currency, "context": additional_info} | |
| return None | |
| def get_intent_and_amount(text: str) -> Dict[str, Any]: | |
| """ | |
| Extract intent and amount (if present) from a given text using a similarity model. | |
| """ | |
| best_match = None | |
| best_score = 0 | |
| intent = "unknown" | |
| amount_data = extract_amount_with_context(text) | |
| # Now, let's detect the intent from the dataset | |
| for intent_data in dataset["data"]: | |
| for utterance in intent_data["utterances"]: | |
| # Compute similarity | |
| similarity_score = util.pytorch_cos_sim( | |
| model.encode(text, convert_to_tensor=True), | |
| model.encode(utterance["text"], convert_to_tensor=True) | |
| ).item() | |
| if similarity_score > best_score: | |
| best_score = similarity_score | |
| best_match = utterance | |
| intent = intent_data["intent"] | |
| return {"intent": intent, "amount_data": amount_data, "score": best_score} | |
| # Example test | |
| user_text = "Hey, I need to request money for a project name Abha University and id is 123 and the amount is 500 riyals" | |
| result = get_intent_and_amount(user_text) | |
| print(result) | |