如何使用Python通过NLP技术提取提醒语句中的任务标题
问题解答
技术方向通用名称
这个功能属于信息提取(Information Extraction, IE) 领域的典型应用,具体落地时会用到「意图识别」+「命名实体识别(NER)」+「槽位填充(Slot Filling)」技术栈,是任务型对话语义解析模块的核心能力之一。
核心实现逻辑
- 第一步:意图分类。先对用户输入的文本做分类,判定当前请求是否属于「创建提醒」的意图,过滤掉其他无关请求。
- 第二步:槽位提取。针对「创建提醒」意图预设两类核心槽位:
- 时间槽:提取触发提醒的时间实体,比如示例中的「明天下午6点」
- 任务内容槽:提取用户要执行的核心动作内容,也就是所需的任务标题,比如示例中的「浇花」
- 第三步:槽值规整。把提取到的时间转换为标准可存储的时间戳或日期格式,对任务内容做冗余词过滤(比如去掉「帮我」「记得」这类无意义的修饰前缀),输出结构化的提醒数据。
Python环境实现方案
完全可以实现,根据场景规模可以选择不同方案:
轻量无训练成本方案:用规则+开源工具组合实现
- 时间提取:用
dateparser、cn2an等工具配合简单正则,可以覆盖90%以上的中文日常时间表达 - 任务提取:先剔除指令前缀(如「提醒我」「帮我设置提醒」)和提取到的时间实体,剩余的核心内容就是任务标题,搭配
jieba分词和词性标注过滤掉虚词,结果会更精准
最简实现参考代码:
import dateparser import re def extract_reminder(query: str): # 匹配并剔除指令前缀 prefix_pattern = r"^(提醒我|帮我提醒|设置提醒)\s*" query_clean = re.sub(prefix_pattern, "", query) # 提取时间(演示用简化规则,实际可替换为更完善的时间提取工具) time_match = re.search(r"((明天|后天|大后天|下[周一二三四五六日])?\s*(上午|下午|晚上|早上)?\s*\d{1,2}[:点]\d{0,2})", query_clean) if time_match: time_str = time_match.group() remind_time = dateparser.parse(time_str, languages=["zh"]) # 剔除时间后剩余内容为任务标题 task_title = query_clean.replace(time_str, "").strip() return { "task_title": task_title, "remind_time": remind_time } return None # 功能测试 print(extract_reminder("提醒我明天下午6点浇花")) # 输出示例:{'task_title': '浇花', 'remind_time': datetime.datetime(2024, 6, 15, 18, 0)}- 时间提取:用
高精度场景方案:如果场景存在大量自定义表达,可以标注少量专属数据集,微调
bert-base-chinese等预训练模型做联合意图分类和槽位填充,准确率可以达到商用级别。
内容的提问来源于stack exchange,提问作者Nahid Khan
相关产品推荐
相关产品推荐

