AMAZON.DATE槽类型自定义处理仅识别过去日期的问题咨询
解决方案
核心优化思路
你现有方案的核心缺陷是仅依赖槽位解析后的日期结果做判断,没有结合用户输入的原始文本语义,所以无法区分「明确要未来日期」和「模糊指代过去日期」的场景,也没法解决周几/几号的输入歧义。你需要额外获取AMAZON.DATE槽对应的用户原始输入文本(Amazon Lex/Alxea的槽返回结果都包含原始输入字段),用语义判断先解决两类歧义,再配合原来的日期差值逻辑处理。
具体修改后的代码
import datetime import re # 提前定义规则集,可根据业务场景扩展 # 明确的未来时间修饰词,匹配到直接报错 FUTURE_KEYWORDS = {"明天", "后天", "下周", "下个月", "明年", "下周一", "下周二", "下周三", "下周四", "下周五", "下周六", "下周日", "下个"} # 周几表述正则 WEEKDAY_PATTERN = re.compile(r'周[一二三四五六七日天]|礼拜[一二三四五六七日天]|星期[一二三四五六七日天]') # 日期表述正则(几号/几日) MONTH_DAY_PATTERN = re.compile(r'\d+[号日]|^\d+$') def getArticleDate(input_date: datetime.date, raw_date_input: str): today = datetime.date.today() diff = (input_date - today).days # ========== 第一层判断:先筛明确要未来的请求 ========== # 情况1:原始输入包含未来修饰词 if any(keyword in raw_date_input for keyword in FUTURE_KEYWORDS): raise ValueError(f"无法查询未来日期({input_date.isoformat()})的新闻,请选择过去日期") # 情况2:原始输入包含大于当前年份的完整年份 year_match = re.search(r'20\d{2}', raw_date_input) if year_match and int(year_match.group()) > today.year: raise ValueError(f"无法查询未来日期({input_date.isoformat()})的新闻,请选择过去日期") # ========== 第二层判断:日期是过去的直接返回 ========== if diff <= 0: return input_date # ========== 第三层判断:处理未来日期的修正 ========== # 先判断输入类型是周几还是几号,解决7天内的优先级冲突 is_weekday_input = bool(WEEKDAY_PATTERN.search(raw_date_input)) is_month_day_input = bool(MONTH_DAY_PATTERN.search(raw_date_input)) # 情况1:用户输入的是周几,7天内的减7天 if diff <=7 and is_weekday_input: return input_date - datetime.timedelta(days=7) # 情况2:用户输入的是当月日期,找最近的过去的同天 if input_date.month == today.month and input_date.year == today.year: end_of_month = today while end_of_month.day < input_date.day: end_of_month = end_of_month.replace(day=1) - datetime.timedelta(days=1) return end_of_month.replace(day=input_date.day) # 情况3:输入是月日但没带年份,减1年 if input_date.replace(year=input_date.year -1) < today: return input_date.replace(year=input_date.year -1) # 其他超过1年的未来日期直接报错 raise ValueError(f"{input_date.isoformat()} 超出可查询范围,仅支持查询过去日期的新闻")
适配你提到的异常场景
- 用户明确要未来日期的场景:比如输入「明天」、「2022年1月30日」,会在第一层判断就被捕获,直接返回报错,不会进入后面的修正逻辑。
- 当月日期和周几的优先级冲突:比如11月14日输入「17号的新闻」,会先判定为日期类输入,不走周几的减7天逻辑,直接进入当月日期处理分支,返回10月17日;如果输入「周三的新闻」,判定为周几输入,减7天返回11月10日,完全符合预期。
可扩展优化点
如果业务场景更复杂,你可以继续扩展规则集:
- 补充更多未来修饰词,比如方言、网络用语的未来表述
- 针对「上个月」、「去年」这类明确过去的修饰词,可以直接跳过修正逻辑
- 增加用户澄清逻辑,比如修正后日期距离当前超过半年,可以询问用户是否为对应日期,进一步降低错误率
内容的提问来源于stack exchange,提问作者Sam Tuson
相关产品推荐
相关产品推荐

