File size: 3,810 Bytes
d483661
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

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)