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

26次阅读

共计 2404 个字符,预计需要花费 7 分钟才能阅读完成。

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

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),欢迎大家关注~

正文完
 0