在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间。
举个简单的例子,我们需要从下面的文本中提取时间:
6月28日,杭州市统计局权威公布《2019年5月月报》,杭州市医保参保人数达到1006万,相比于2月份的989万,三个月暴涨16万人参保,傲视新一线城市。
我们可以从文本有提取6月28日
,2019年5月
,
2月份
这三个有效时间。
通常情况下,较好的解决思路是利用深度学习模型来识别文本中的时间,通过一定数量的标记文本和合适的模型。本文尝试利用现有的NLP工具来解决如何从文本中提取时间。
本文使用的工具为哈工大的pyltp,可以在Python的第三方模块中找到,实现下载好分词模型cws.model
和词性标注pos.model
这两个模型文件。
话不多说,我们直接上Python代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import osfrom pyltp import Segmentorfrom pyltp import Postaggerclass LTP (object ): def __init__ (self ): cws_model_path = os.path.join(os.path.dirname(__file__), 'cws.model' ) pos_model_path = os.path.join(os.path.dirname(__file__), '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) 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月份金融统计数据并就当前的一些热点问题进行了解读和回应。
文本中提取的时间为:
1 提取时间: ['今天', '2019 年6月份', '2019 年6月份', '当前']
输入文本为:
2006年,上海的国内生产总值达到10296.97亿元,是中国内地第一个GDP突破万亿元的城市。2008年,北京GDP破万亿。两年后,广州GDP超过万亿。2011年,深圳、天津、苏州、重庆4城的GDP也进入了万亿行列。武汉、成都在2014年跻身“万亿俱乐部”,杭州、南京和青岛、无锡和长沙的GDP依次在2015年、2016年和2017年过万亿。宁波和郑州则成为2018年万亿俱乐部的新成员。
文本中提取的时间为:
1 提取时间: ['2006 年', '2008 年', '2011 年', '2014 年', '2015 年', '2016 年', '2018 年']
输入文本为:
此后,6月28日、7月9日和7月11日下午,武威市政协、市人大、市政府分别召开坚决全面彻底肃清火荣贵流毒和影响专题民主生活会。
文本中提取的时间为:
1 提取时间: ['此后' , '6月28日' , '7月9日' , '7月11日下午' ]
输入文本为:
姜保红出生于1974年4月,她于2016年11月至2018年9月任武威市副市长,履新时,武威市的一把手正是火荣贵。
文本中提取的时间为:
1 提取时间: ['1974 年4月', '2016 年11月至2018 年9月']
本次分享到此结束,欢迎大家批评指正。
欢迎关注我的公众号
NLP奇幻之旅 ,原创技术文章第一时间推送。
欢迎关注我的知识星球“自然语言处理奇幻之旅 ”,笔者正在努力构建自己的技术社区。