比如说有一段文本:“下周三去游泳”,如何识别出下周三,并得出具体日期呢?
在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间。
举个简单的例子,我们需要从下面的文本中提取时间:
6月28日,杭州市统计局权威公布《2019年5月月报》,杭州市医保参保人数达到1006万,相比于2月份的989万,三个月暴涨16万人参保,傲视新一线城市。
我们可以从文本有提取6月28日
,2019年5月
, 2月份
这三个有效时间。
通常情况下,较好的解决思路是利用深度学习模型来识别文本中的时间,通过一定数量的标记文本和合适的模型。本文尝试利用现有的NLP工具来解决如何从文本中提取时间。
本文使用的工具为哈工大的pyltp,可以在Python的第三方模块中找到,实现下载好分词模型cws.model
和词性标注pos.model
这两个模型文件。
话不多说,我们直接上Python代码,如下:
# -*- coding: utf-8 -*-
import os
from pyltp import Segmentor
from pyltp import Postagger
class LTP(object):
def __init__(self):
cws_model_path = os.path.join(os.path.dirname(__file__), 'cws.model') # 分词模型路径,模型名称为`cws.model`
pos_model_path = os.path.join(os.path.dirname(__file__), 'pos.model') # 词性标注模型路径,模型名称为`pos.model`
self.segmentor = Segmentor() # 初始化实例
self.segmentor.load(cws_model_path) # 加载模型
self.postagger = Postagger() # 初始化实例
self.postagger.load(pos_model_path) # 加载模型
# 分词
def segment(self, text):
words = list(self.segmentor.segment(text))
return words
# 词性标注
def postag(self, words):
postags = list(self.postagger.postag(words))
return postags
# 获取文本中的时间
def get_time(self, text):
# 开始分词及词性标注
words = self.segment(text)
postags = self.postag(words)
time_lst = []
i = 0
for tag, word in zip(postags, words):
if tag == 'nt':
j = i
while postags[j] == 'nt' or words[j] in ['至', '到']:
j += 1
time_lst.append(''.join(words[i:j]))
i += 1
# 去重子字符串的情形
remove_lst = []
for i in time_lst:
for j in time_lst:
if i != j and i in j:
remove_lst.append(i)
text_time_lst = []
for item in time_lst:
if item not in remove_lst:
text_time_lst.append(item)
# print(text_time_lst)
return text_time_lst
# 释放模型
def free_ltp(self):
self.segmentor.release()
self.postagger.release()
if __name__ == '__main__':
ltp = LTP()
# 输入文本
sent = '6月28日,杭州市统计局权威公布《2019年5月月报》,杭州市医保参保人数达到1006万,相比于2月份的989万,三个月暴涨16万人参保,傲视新一线城市。'
time_lst = ltp.get_time(sent)
ltp.free_ltp()
# 输出文本中提取的时间
print('提取时间: %s' % str(time_lst))
接着,我们测试几个例子。
输入文本为:
今天,央行举行了2019年6月份金融统计数据解读吹风会,发布了2019年6月份金融统计数据并就当前的一些热点问题进行了解读和回应。
文本中提取的时间为:
提取时间: ['今天', '2019年6月份', '2019年6月份', '当前']
输入文本为:
2006年,上海的国内生产总值达到10296.97亿元,是中国内地第一个GDP突破万亿元的城市。2008年,北京GDP破万亿。两年后,广州GDP超过万亿。2011年,深圳、天津、苏州、重庆4城的GDP也进入了万亿行列。武汉、成都在2014年跻身“万亿俱乐部”,杭州、南京和青岛、无锡和长沙的GDP依次在2015年、2016年和2017年过万亿。宁波和郑州则成为2018年万亿俱乐部的新成员。
文本中提取的时间为:
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
我本来以为是个正则问题,后台发现竟然还是个自然语义处理的问题。。这已经超出前端范畴了。。
我想到一个奇葩的方案,比如有很多的智能机器人可以识别自然语义,让这些智能机器人把这段文字添加成 日程, 比如让 siri 提醒你 下周三去游泳,她会在你的日历的下周三加个日程。。。想办法读到最新的日程就可以了。。