#nlp #parser #language #rules #date-time #natural #pluggable

when

'when'解析自然语言日期和时间,生成计算机友好的输出结构

2个版本

0.1.4 2020年8月1日
0.1.3 2019年6月25日

#2015 in 算法

MIT许可协议

105KB
2.5K SLoC

when 构建状态 codecov

具有可插拔规则的天然语言日期/时间解析器

灵感来自https://github.com/olebedev/when

https://risboo6909.org/when/https://tarpaha.github.io/when/查看其交互式工作方式

示例

  • 今晚11:10 p.m.
  • 星期五下午
  • 截止日期是下个星期二14:00
  • 下个星期三下午2:25给我发信息
  • 可以在星期二之后上午11点完成

作为演示,请查看一个简单的HTTP Web 服务器,它使用这个库解析自然语言日期和时间。

关键特性

  • 规则定义中不使用正则表达式。所有规则都使用rust宏定义。
  • 有两种模式,一种具有拼写识别,另一种仅进行精确匹配。

用法

use chrono_tz;
use when;

fn main() {
    let parser = when::parser::Parser::new(chrono_tz::Europe::Moscow)
        .parser(Box::new(when::en))
        .max_dist(3)
        .fuzzy_parse(true);
    println!("{:?}", parser.parse("today 18p.m."));
}

目前仅支持英语。未来可能添加更多语言。

它是如何工作的?

When使用Nom解析库来解析输入字符串。

有一个rules文件夹,其中包含各种语言的规则。解析器将尝试为给定语言应用所有可用的规则,直到找到第一个匹配项。如果多个规则匹配字符串的同一部分,则认为这是一个错误。

该库还能够通过Damerau-Levenshtein距离理解单词中的拼写错误。距离在规则定义中定义。较长的单词允许更大的距离。要禁用模糊解析,将解析器构造函数的最后一个参数设置为true,这将切换解析器到仅精确匹配模式。

每个规则都有自己的开始和结束匹配边界以及合并距离。如果两个匹配项彼此之间小于阈值,则它们将合并在一起。

例如

Today 21:50 and tomorrow 22:00
-----------     --------------

前两个术语今天21:50将合并在一起,因为它们之间的距离小于或等于5。因此,最终结果将好像有一个匹配项捕获了整个术语今天 21:50。同样的事情也会发生在下一个两个术语(明天22:00)上,尽管它们通过不同的规则匹配,但匹配结果将合并在一起,因为匹配之间的距离小于或等于5。

最后说明

这是我谦卑地尝试创建一个Rust库。虽然我尽力而为,但我深知其中有很多未发现的错误,我的代码远非完美,所以我将非常感激任何帮助使它更稳定和更好的建议。

依赖项

约3.5–5MB
约90K SLoC