kumar4372's picture
initial commit
2d2c435
import re
from typing import Dict, Any, Tuple
import dateparser
import pytz
import datetime
def parse_amount_and_currency(text: str) -> Tuple[str, float]:
"""Simple parser: looks for yen amounts like "¥30000" or "30000 yen" or numbers.
Returns tuple (currency, amount)
"""
# look for ¥ symbol
m = re.search(r"¥\s?([0-9,]+)", text)
if m:
amt = float(m.group(1).replace(',', ''))
return ("JPY", amt)
m = re.search(r"([0-9,]+)\s*(yen|JPY)\b", text, flags=re.I)
if m:
amt = float(m.group(1).replace(',', ''))
return ("JPY", amt)
# fallback: any number
m = re.search(r"([0-9,]+)", text)
if m:
return ("JPY", float(m.group(1).replace(',', '')))
return ("", 0.0)
def extract_intent_and_slots(text: str) -> Dict[str, Any]:
text_l = text.lower()
result = {
'intent': 'other',
'nlu_confidence': 0.5,
'slots': {}
}
# detect request for human
if any(kw in text_l for kw in ['operator', 'human', 'representative', 'staff', 'talk to']):
result['intent'] = 'request_human_operator'
result['nlu_confidence'] = 0.9
return result
# detect payment commitment
if any(kw in text_l for kw in ['pay', 'payment', 'i will pay', 'i can pay']):
result['intent'] = 'payment_commitment'
result['nlu_confidence'] = 0.85
# amount
currency, amount = parse_amount_and_currency(text)
if amount > 0:
result['slots']['amount'] = f"{int(amount)}"
# date: use dateparser with Japan timezone
settings = {'TIMEZONE': 'Asia/Tokyo', 'RETURN_AS_TIMEZONE_AWARE': True}
# try to parse phrases like 'by next Friday' or 'by 2025-10-10'
m = re.search(r"by\s+(.+)$", text, flags=re.I)
parsed = None
if m:
parsed = dateparser.parse(m.group(1).strip(), settings=settings)
if not parsed:
# try to parse full sentence for a date
parsed = dateparser.parse(text, settings=settings)
if parsed:
# normalize to Asia/Tokyo and isoformat
tz = pytz.timezone('Asia/Tokyo')
if parsed.tzinfo is None:
parsed = tz.localize(parsed)
else:
parsed = parsed.astimezone(tz)
result['slots']['date_by_when'] = parsed.isoformat()
return result