本文利用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分']