背景
之前做问答机器人的时候需要一个定闹钟的场景,比如:
明早7点半叫我起床
下午2点的闹钟
每天8点半叫我起床
…
之类的,要根据该文字描述让后台创建一个定时任务来叫我起床,需要用到cron表达式,但是文本转换成cron是个头大的事情,竟然没找到合适的工具,尝试过提取时间,也最终被堆积的if else打败—是在下输了!
整理了一下思路:我要做的是 输入一段文字 然后转换成cron表达式,可以理解为翻译,基于这个思考,想到了序列生成模型seq2seq:输入文字进行向量编码->解码得到另外一个语种的表述!
另外,cron表达式无非就是就是年周月日时分秒
七个变量倒过来,解码的长度是固定的,模型还简单了不少!
原理
一个正常的seq2seq原理图如下(图片来源:https://zhuanlan.zhihu.com/p/65591919,借用一下,如有侵权请联系删除):
考虑到本人使用场景的局限性,和序列的长度限制,做了一下简化:
简化一下seq2seq如下:
1.先通过一个RNN作为编码器将文字信息编码一个全局词向量context_vec,以及一个状态信息e5_h
2.使用另外一个RNN作为解码器,以e5_h作为初始状态,开始对context_vec进行解码
3.使解码的时候看做一个多标签分类问题,让RNN分别输出七个类别(cron的七个变量)
4.将七个类别组合成一个完整的cron表达式
1.直接使用全局向量编码进行预测
2.解码阶段假设状态h中已经包含了输出信息,不再使用上一个词的输出作为下一个词预测数输入(还有一个原因是我偷懒,然后我发现这样效果也不错!)
3.为了简化模型,加快收敛,解码和编码统一使用GRU,放弃LSTM
在线体验
经过训练发布了一个简单版本:
注:训练样本局限,本人一行一行瞎编的,无法全部覆盖,目前仅支持时分秒的控制
如何使用
有用的话支持点个Star
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:Huoyoooooo,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply