用python解析自然语言时间表达式
ctparse的Python项目详细描述
ctparse-在python中解析自然语言时间表达式
" rel="nofollow">此代码处于早期alpha阶段。有可能也有可能 在"master"分支上右断开更改
- 自由软件:麻省理工学院许可证
- 文档:https://ctparse.readthedocs.io rel="nofollow">https://ctparse.readthedocs.io
背景
ctparse包是解析时间的纯python包 来自自然语言(即字符串)的表达式。在很多方面 类似于facebook的duckling软件包 ( https://github.com/facebook/duckling )。不过,就目前而言 只针对时间,只针对德语和英语文本。
原则上,ctparse可以用来检测 然而,文本的主要用例是 表达。首先检测时间表达式可以 经验-使用CRF或 针对此特定任务的其他型号。
ctparse 的设计考虑了用例的解释 的时间表达式是在以下假设下完成的:
- 所有表达式都与一些预定义的参考时间有关
- 除非在时间表达式中明确指定,否则有效的解决方案 在未来相对于参考时间(即 12.5. 将 是5月12日,但 12.5.2012 应正确解决 至2012年5月12日)。
- 如果有疑问,那么在不久的将来解决问题的可能性比 未来的决议(尚未执行,但任何 未来3个月以上的解决方案 不太可能)。
特定的comtravo用例正在解析预订中的时间表达式 几乎总是指向下一个时间点的请求 4-8周。
ctparse 目前不支持语言,支持德语和 英语表达。这可能会在将来得到扩展。主要 原因是在现实世界中,交流比不交流更频繁 使用一种语言(他们的业务语言)编写,但使用构造 基于母语和/或 相信是表达日期的方式目标语言。这个 导致德语文本与英语时间表达,反之亦然。 在完整的原始文本上预先使用语言检测是为了 显然没有解决办法-反而会使问题更糟。
示例
fromctparseimportctparsefromdatetimeimportdatetime# Set reference timets=datetime(2018,3,12,14,30)ctparse('May 5th 2:30 in the afternoon',ts=ts)
这将返回一个表示为 时间[0-29]{2018-05-05 14:30(x/x)} ,表示字符 0-29 用于解析,解析日期时间是 2018年5月5日14:30,本决议既不基于 一周中的一天(第一天 x )或一天中的一部分(第二天 x )。
实施
ctparse -正如 duckling -是规则和正则的混合体 基于表达式的系统+一些概率模型。从这个意义上说 类似于PCFG。
规则
核心的ctparse是 正则表达式和(中间)乘积的序列。
产品可以是 时间型 或 间隔型 并且可以 有特定的谓词(例如a time 是否是一天的一部分 "下午" )。
典型的规则如下:
@rule(predicate('isDate'),dimension(Interval))
也就是说,当中间产品 在有日期的事物中,接着是间隔的事物 (例如,在5月5日的9-10日。)。
实际的产品是具有以下签名的python函数:
@rule(predicate('isDate'),dimension(Interval))defruleDateInterval(ts,d,i):""" param ts: datetime - the current refenrence time d: Time - a time that contains at least a full date i: Interval - some Interval """ifnot(i.t_from.isTODandi.t_to.isTOD):returnNonereturnInterval(t_from=Time(year=d.year,month=d.month,day=d.day,hour=i.t_from.hour,minute=i.t_from.minute),t_to=Time(year=d.year,month=d.month,day=d.day,hour=i.t_to.hour,minute=i.t_to.minute))
此产品将在 谓词('isDate') 跨越在中编码的时间 尺寸(间隔) 。如果后者为 一天中的某个时间(TOD),不返回任何生产,例如匹配的规则 但失败了。
技术背景
关于这个问题的一些看法:
- 每个规则都是正则表达式和乘积的组合。
- 因此,每一个产品都必须产生于 必须匹配(部分)文本的表达式。
- 因此,只有 all 正则表达式的子序列 规则可以导致成功的生产。
为此,算法如下:
- 输入字符串和参考时间
- 从中的所有规则中查找所有正则表达式的所有匹配项 输入字符串。每个正则表达式都分配了一个标识符。
- 查找这些匹配项的所有不同序列,其中两个匹配项没有 重叠或中间没有间隙
- 对于每个这样的子序列,在所有可能的位置应用所有规则 直到不能应用更多的规则-在这种情况下,一个解决方案是 生产
显然,不是所有的匹配表达式序列 应用于顶部的规则序列将导致有意义的结果。这里 p cfg启动:
- 基于示例数据( corpus.py ),模型被校准为 预测一个产品产生正确结果的可能性。 而不是做广度优先的搜索,最有希望的 首先应用产品。
- 在没有更多的决议或 超时。
- 基于所有分辨率的相同模型,最高得分为 返回。
学分
这个包是用cookiecutter和项目模板创建的。