我开源了一款名叫JioNLP的时间语义解析包

2021-09-29 15:48:56 浏览数 (1)

提问:大家在做NLP 任务的时候,有没有遇到解析文本中时间的问题呢?比如,对着智能音箱说:

小爱同学,明天早上7点20叫我起床”。

智能音箱第二天就能准时打响闹钟。这时,我们必须把其中的 “明天早上7点20”这个时间实体准确解析出来,并映射到标准时间轴上,得到 “2021-09-18 07:20:00”这个时间点(假设今天是9月17日)。

JioNLP(https://github.com/dongrixinyu/JioNLP) 这个时间语义解析功能在开源领域效果最好。该工具包基于Python语言,安装简单:

代码语言:javascript复制
pip install jionlp

且已经在JioNLP网页版-时间语义解析(http://182.92.160.94:16666/#/parse_time)网页上,可以直接试用调用。

目前已经支持了绝大部分自然语言的时间表达转换,使用简便,比如以下这些:

代码语言:javascript复制
``` python
import time
import jionlp as jio
res = jio.parse_time('今年9月', time_base={'year': 2021})
print(res)
res = jio.parse_time('零三年元宵节晚上8点半', time_base=time.time())
print(res)
res = jio.parse_time('一万个小时')
print(res)
res = jio.parse_time('100天之后', time.time())
print(res)
res = jio.parse_time('每周五下午4点', time.time())
print(res)
代码语言:javascript复制
# {'type': 'time_span', 'definition': 'accurate', 'time': ['2021-09-01 00:00:00', '2021-09-30 23:59:59']}
# {'type': 'time_point', 'definition': 'accurate', 'time': ['2003-02-15 20:30:00', '2003-02-15 20:30:59']}
# {'type': 'time_delta', 'definition': 'accurate', 'time': {'hour': 10000.0}}
# {'type': 'time_span', 'definition': 'blur', 'time': ['2021-10-22 00:00:00', 'inf']}
# {'type': 'time_period', 'definition': 'accurate', 'time': {'delta': {'day': 7},
#  'point': {'time': ['2021-07-16 16:00:00', '2021-07-16 16:59:59'], 'string': '周五下午4点'}}}

```

平时我们做命名实体识别,往往看见时间字符串,就打上“TIME”标签结束了。从上面的若干例子可以看出,时间实体的划分也分为很多类型,主要有时间点(time_point)、时间范围(time_span)、时间长度(time_delta)、时间周期(time_period)、虚拟时间(time_virtual)、时间问词(time_query)等。每个概念的解释就放在下图:

每一种类型,在时间语义解析说明文档(https://github.com/dongrixinyu/JioNLP/wiki/时间语义解析-说明文档)中都有详细的说明。

根据目前掌握的处理情况看,该工具解析正确率在95%左右,还有进步空间,如果试用过程中遇到无法解析的时间字符串,可以在 Github 上提交报错信息。

对了,还需注意一点,像上面的例子一样,该解析时间工具要求所传入的时间字符串一定是干净的时间实体!这样解析结果才更有保证。有的同学会问,那我还得另外找一个时间类型的实体识别模型吗?

倒也不用~~~JioNLP 还提供了一个基于规则的时间类型的实体识别工具。使用时,直接传入整篇文章即可。使用方式简单如下:

代码语言:javascript复制
``` python
import time
import jionlp as jio
text = '【新华社报2021-9-9】南方都市报今天发布了2021年8月份全国CPI(居民消费价格指数)和PPI(工业生产者出厂价格指数)数据。'
res = jio.ner.extract_time(text, time_base={'year': 2021})
print(res)

# [{'text': '2021-9-9', 'offset': [5, 13], 'type': 'time_point'},
#  {'text': '今天', 'offset': [19, 21], 'type': 'time_point'},
#  {'text': '2021年8月份', 'offset': [24, 32], 'type': 'time_point'}]
```

同样地,该工具也提供了网页版,还不直接进来JioNLP网页版试用一下。

JioNLP网页版-时间实体抽取(http://182.92.160.94:16666/#/extract_time)

这个项目还很年轻,如果在编写代码时遇到解析错误或抽取错误,别急,到Github(https://github.com/dongrixinyu/JioNLP) 上来提问和反馈吧。

0 人点赞