• NLP入门(十一)从文本中提取时间


      在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间。
      举个简单的例子,我们需要从下面的文本中提取时间:

    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年万亿俱乐部的新成员。

    文本中提取的时间为:

    提取时间: ['2006年', '2008年', '2011年', '2014年', '2015年', '2016年', '2018年']
    

    输入文本为:

    此后,6月28日、7月9日和7月11日下午,武威市政协、市人大、市政府分别召开坚决全面彻底肃清火荣贵流毒和影响专题民主生活会。

    文本中提取的时间为:

    提取时间: ['此后', '6月28日', '7月9日', '7月11日下午']
    

    输入文本为:

    姜保红出生于1974年4月,她于2016年11月至2018年9月任武威市副市长,履新时,武威市的一把手正是火荣贵。

    文本中提取的时间为:

    提取时间: ['1974年4月', '2016年11月至2018年9月']
    

      本次分享到此结束,欢迎大家批评指正。

    注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注~

  • 相关阅读:
    那些年,学swift踩过的坑
    JAVA经BigDecimal圆角的解决方案及注意事项
    Jquery简介选择的
    Oracle性能优化顺序表名称来选择最有效的学习笔记
    jQuery Validate插入 reomte使用详细的说明
    公钥私人 ssh避password登陆
    Telnet,SSH1,SSH2,Telnet/SSL,Rlogin,Serial,TAPI,RAW
    mysqlbackup 还原特定的表
    OpenJDK 阅读源代码 Java 实现字节流输入类
    Android Application Thread CPU GC Operatiing and OOM Question 0603-随手笔记
  • 原文地址:https://www.cnblogs.com/jclian91/p/11185364.html
Copyright © 2020-2023  润新知