用python解析自然语言时间表达式

ctparse的Python项目详细描述


ctparse-在python中解析自然语言时间表达式

traviscoveragepypi " rel="nofollow"> updatesdocumentation status

此代码处于早期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 正则表达式的子序列 规则可以导致成功的生产。

为此,算法如下:

  1. 输入字符串和参考时间
  2. 从中的所有规则中查找所有正则表达式的所有匹配项 输入字符串。每个正则表达式都分配了一个标识符。
  3. 查找这些匹配项的所有不同序列,其中两个匹配项没有 重叠或中间没有间隙
  4. 对于每个这样的子序列,在所有可能的位置应用所有规则 直到不能应用更多的规则-在这种情况下,一个解决方案是 生产

显然,不是所有的匹配表达式序列 应用于顶部的规则序列将导致有意义的结果。这里 p cfg启动:

  • 基于示例数据( corpus.py ),模型被校准为 预测一个产品产生正确结果的可能性。 而不是做广度优先的搜索,最有希望的 首先应用产品。
  • 在没有更多的决议或 超时。
  • 基于所有分辨率的相同模型,最高得分为 返回。

学分

这个包是用cookiecutter和项目模板创建的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SpringWeb中的java更新/通知其他用户   java Lambda性能测试   java Bukkit插件:空白符号   java在按下按钮后改变彩色正方形的大小   javajavac相当于“D”?   java序列化接口   属性无法从属性文件返回值   java我应该使用什么查询来使用Jsoup从html页面提取符号?   java Android Studio项目结构问题   JAVA方法和返回值/公共变量(基础)   java将NativeQuery映射到POJO   java如何在下面的程序中消除NumberFormatException?   在java中获取链表与数组中的对象   java Android Firebase将用户发送到聊天室