利用pyltp从文本中提取时间信息

本文利用pyltp,对文本中的时间词进行提取。

参考山阴少年

import pyltp
import os
from pyltp import Segmentor
from pyltp import Postagger

简单提取

def extract_time(text):
    dir_path = 'E:\\zym_test\\test\\nlp\\pyltp\\ltp_data_v3.4.0'
    cws_model_path = os.path.join(dir_path, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
    pos_model_path = os.path.join(dir_path, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
    segmentor = Segmentor()  # 初始化实例
    segmentor.load(cws_model_path)  # 加载模型
    postagger = Postagger()  # 初始化实例
    postagger.load(pos_model_path)  # 加载模型

    words = list(segmentor.segment(text))
    postags = list(postagger.postag(words))
    
    # 提取时间
    time_words_list = []
    for tag, word in zip(postags, words):
        if tag ==  'nt':
            time_words_list.append(word)
    return time_words_list
    
text = '今天,央行举行了2019年6月份金融统计数据解读吹风会,发布了2019年6月份金融统计数据并就当前的一些热点问题进行了解读和回应。'
extract_time(text)

可以发现,提取出的时间信息有的应该连续但是没有连续。

['今天', '2019年', '6月份', '2019年', '6月份', '当前']

将连续的时间词合并

def extract_time_1(text):
    dir_path = 'E:\\zym_test\\test\\nlp\\pyltp\\ltp_data_v3.4.0'
    cws_model_path = os.path.join(dir_path, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
    pos_model_path = os.path.join(dir_path, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
    segmentor = Segmentor()  # 初始化实例
    segmentor.load(cws_model_path)  # 加载模型
    postagger = Postagger()  # 初始化实例
    postagger.load(pos_model_path)  # 加载模型

    words = list(segmentor.segment(text))
    postags = list(postagger.postag(words))
    
    # 提取时间(连续多个时间合并) 
    time_words_list = []
    i = 0
    for tag, word in zip(postags, words):
        if tag ==  'nt':
            j = i
            while postags[j] == 'nt':
                j += 1
            time_words_list.append(''.join(words[i:j]))
        i += 1
    return time_words_list
extract_time_1(text)

可以发现出现了重复

['今天', '2019年6月份', '6月份', '2019年6月份', '6月份', '当前']

去除提取信息中的重复值

def extract_time_2(text):
    dir_path = 'E:\\zym_test\\test\\nlp\\pyltp\\ltp_data_v3.4.0'
    cws_model_path = os.path.join(dir_path, 'cws.model')  # 分词模型路径,模型名称为`cws.model`
    pos_model_path = os.path.join(dir_path, 'pos.model')  # 词性标注模型路径,模型名称为`pos.model`
    segmentor = Segmentor()  # 初始化实例
    segmentor.load(cws_model_path)  # 加载模型
    postagger = Postagger()  # 初始化实例
    postagger.load(pos_model_path)  # 加载模型

    words = list(segmentor.segment(text))
    postags = list(postagger.postag(words))
    
    # 提取时间(连续多个时间合并) 
    time_words_list = []
    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_words_list.append(''.join(words[i:j]))
        i += 1
        
    # 去重
    remove_list = []
    for i in time_words_list:
        for j in time_words_list:
            if i != j and i in j:
                remove_list.append(i)

    time_words_list_1 = []
    for item in time_words_list:
        if item not in remove_list:
            time_words_list_1.append(item)
    return time_words_list_1
    
extract_time_2(text)
['今天', '2019年6月份', '2019年6月份', '当前']
text_1 = '目前,美国国内疫情形势严峻。根据美国约翰斯·霍普金斯大学公布的实时疫情数据,截至北京时间18日早上7时30分,美国累计确诊病例达到6420例,死亡病例108例。全美50个州均已出现新冠肺炎病例。'
extract_time_2(text_1)
['目前', '18日早上7时30分']
发布了35 篇原创文章 · 获赞 3 · 访问量 2479

猜你喜欢

转载自blog.csdn.net/Smile_mingm/article/details/104940861