NLP(十五)让模型来告诉你文本中的时间
背景介绍
在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词、词性标注的方法从文本中获取时间。当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别效果并不太好。比如以下的两个例子:
原文1:
苏北大量农村住房建于上世纪80年代之前。去年9月,江苏省决定全面改善苏北农民住房条件,计划3年内改善30万户,作为决胜全面建成小康社会补短板的重要举措。
用笔者之前的代码,提取的时间结果为:
提取时间: ['去年9月']
但实际上,我们提取的时间应该是:
上世纪80年代之前, 去年9月,3年内
原文2:
南宋绍兴十年,金分兵两路向陕西和河南大举进攻,在很快夺回了河南、陕西之后,又率大军向淮南大举进攻。
用笔者之前的代码,提取的时间结果为:
提取时间: ['南宋']
但实际上,我们提取的时间应该是:
南宋绍兴十年
因此,利用简单的词性标注功能来提取文本中的时间会存在漏提、错提的情况,鉴于此,笔者想到能否用深度学习模型来实现文本中的时间提取呢?
该功能类似于命名实体识别(NER)功能,只不过NER是识别文本中的人名、地名、组织机构名,而我们这次需要识别文本中的时间。但是,它们背后的算法原理都是一样的,即采用序列标注模型来解决。
项目
在文章NLP(十四)自制序列标注平台中,笔者提出了一种自制的序列标注平台,利用该标注平台,笔者从新闻网站中标注了大约2000份语料,标注出文本中的时间,其中75%作为训练集(time.train文件),10%作为验证集(time.dev文件),15%作为测试集(time.test文件)。
虽然我们现在已经有了深度学习框架方便我们来训练模型,比如TensorFlow, Keras, PyTorch等,但目前已有某大神开源了一个序列标注和文本分类的模块,名称为kashgari-tf,它能够方便快速地用几行命令就可以训练一个序列标注或文本分类的模型,容易上手,而且集中了多种模型(BiGRU,CNN, BiLSTM,CRF)以及多种预训练模型(BERT,ERNIE,wwm-ext),对于用户来说算是十分友好了。该模块的参考网址为:https://kashgari.bmio.net/ 。
笔者自己花了几天的时间来标注数据,目前已累计标注2000+数据 ,后续将放到Github供大家参考。我们训练的数据,比如time.train的前几行如下:(每一行中间用空格隔开)
1 B-TIME
6 I-TIME
0 I-TIME
9 I-TIME
年 I-TIME
, O
日 O
本 O
萨 O
摩 O
藩 O
入 O
侵 O
琉 O
球 O
国 O
, O
并 O
在 O
一 O
个 O
时 O
期 O
内 O
控 O
制 O
琉 O
球 O
国 O
...
接着是模型这块,我们采用经典的BERT+Bi-LSTM+CRF模型,训练1个epoch,batch_size为16,代码如下:
# -*- coding: utf-8 -*-
# time: 2019-08-09 16:47
# place: Zhichunlu Beijing
import kashgari
from kashgari.corpus import DataReader
from kashgari.embeddings import BERTEmbedding
from kashgari.tasks.labeling import BiLSTM_CRF_Model
train_x, train_y = DataReader().read_conll_format_file('./data/time.train')
valid_x, valid_y = DataReader().read_conll_format_file('./data/time.dev')
test_x, test_y = DataReader().read_conll_format_file('./data/time.test')
bert_embedding = BERTEmbedding('chinese_L-12_H-768_A-12',
task=kashgari.LABELING,
sequence_length=128)
model = BiLSTM_CRF_Model(bert_embedding)
model.fit(train_x, train_y, valid_x, valid_y, batch_size=16, epochs=1)
model.save('time_ner.h5')
model.evaluate(test_x, test_y)
模型训练完后,得到的效果如下:
| 数据集 | accuracy | loss |
|---|---|---|
| 训练集 | 0.9814 | 6.7295 |
| 验证集 | 0.6868 | 150.8513 |
在测试集上的结果如下:
| 数据集 | precision | recall | f1 |
|---|---|---|---|
| 测试集 | 0.8547 | 0.8934 | 0.8736 |
由于是小标注量,因此我们选择了用BERT预训练模型。如果不采用BERT预训练模型,在同样的数据集上,即使训练100个epoch,虽然在训练集上的准确率超过95%,但是在测试集上却只有大约50%的准确率,效果不行,因此,需要采用预训练模型。
测试效果
在训练完模型后,会在当前目录下生成time_ner.h5模型文件,接着我们需要该模型文件来对新的文件进行预测,提取出文本中的时间。模型预测的代码如下:
# Load saved model
import kashgari
loaded_model = kashgari.utils.load_model('time_ner.h5')
while True:
text = input('sentence: ')
t = loaded_model.predict([[char for char in text]])
print(t)
接着我们在几条新的数据上进行预测,看看该模型的表现效果:
"原文": "继香港市民10日到“乱港头目”黎智英住所外抗议后,13日,“祸港四人帮”中的另一人李柱铭位于半山的住所外,也有香港市民自发组织前来抗议。",
"预测时间": [
"10日",
"13日"
]
"原文": "绿地控股2018年年度年报显示,截至2018年12月31日,万科金域中央项目的经营状态为“住宅、办公、商业”,项目用地面积18.90万平方米,规划计容建筑面积79.38万平方米,总建筑面积为105.78万平方米,已竣工面积32.90万平方米,总投资额95亿元,报告期实际投资额为10.18亿元。",
"预测时间": [
"2018年年度",
"2018年12月31日"
]
"原文": "经过工作人员两天的反复验证、严密测算,记者昨天从上海中心大厦得到确认:被誉为上海中心大厦“定楼神器”的阻尼器,在8月10日出现自2016年正式启用以来的最大摆幅。",
"预测时间": [
"两天",
"昨天",
"8月10日",
"2016年"
]
"原文": "不幸的是,在升任内史的同年九月,狄仁杰就在洛阳私宅离世。",
"预测时间": [
"同年九月"
]
"原文": "早上9点25分到达北京火车站,火车站在北京市区哦,地铁很方便到达酒店,我们定了王府井大街的锦江之星,409元一晚,有点小贵。下午去了天坛公园,傍晚去了天安门广场。",
"预测时间": [
"早上9点25分",
"下午",
"傍晚"
],
总结
利用深度学习模型,在小标注量数据上,我们对时间识别取得了不错的效果。后续如果我们想要提高时间识别的准确率,可以再多增加标注数据,目前还只有2000+数据~
本项目已经开源,Github的地址为:https://github.com/percent4/Chinese_Time_Recogniztion 。
另外,强烈推荐kashgari-tf模块,它能够让你在几分钟内搭建一个序列标注模型,而且方便加载各种预训练模型。
注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注~
NLP(十五)让模型来告诉你文本中的时间的更多相关文章
- 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)
解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- NLP入门(十一)从文本中提取时间
在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间. 举个简单的例子,我们需要从下面的文本中提取时间: 6月28日,杭州市统计局权 ...
- 读书笔记_Effective_C++_条款十五:在资源类管理类中提供对原始资源的访问
void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十五)Structured Streaming:同一个topic中包含一组数据的多个部分,按照key它们拼接为一条记录(以及遇到的问题)。
需求: 目前kafka的topic上有一批数据,这些数据被分配到9个不同的partition中(就是发布时key:{m1,m2,m3,m4...m9},value:{records items}),m ...
- 第十五篇:关于TCP通信程序中数据的传递格式
前言 在之前的回射程序中,实现了字符串的传递与回射.幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题.在客户端和服务器使用不同的字节序 ...
- 十五 web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础
在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块,然后将网页数据通过lxml下的etree转化为treedata的形式 urllib库中使用xpath表 ...
- NeHe OpenGL教程 第三十五课:播放AVI
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1)一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件. 创建一个新的JAR文件应 ...
随机推荐
- Linux 安装 lanmp
Lanmp介绍 lanmp一键安装包是wdlinux官网2010年底开始推出的web应用环境的快速简易安装包. 执行一个脚本,整个环境就安装完成就可使用,快速,方便易用,安全稳定 lanmp一键安装包 ...
- 《转载黑马教程》HTML&&CSS讲义0,,包含教程_仅供参考
今日内容 1. web概念概述 2. HTML web概念概述 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务 ...
- 用MATLB仿真一个单闭环控制量,同时还存在两个开环控制变量的阶跃响应曲线。(自动控制方法是PID中的P控制。通过查表法直接给开环参数稳态最佳的大小)
实际项目背景:甘肃省,航天510所的LIPS100电推力器.一共有三个控制变量,开环控制变量是:Ia(阳极电流).mmrf(阳极主流率) 这个阳极主流率是阀门变量,不能够突变,模拟用(大学一年级课,电 ...
- MFC开发--截图工具
近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...
- UVA1103 古代象形符号 Ancient Messages 题解
题目链接: https://www.luogu.org/problemnew/show/UVA1103 题目分析: 我们可以先进行矩阵的还原 for(int k=1;k<=4;k++) { a[ ...
- AT649 自由研究
这道题有些水... 我们观察到,这是一道彻底离线的题目,连输入也没有,我们可以发现1<=n<=401<=n<=401<=n<=40 于是,我们就可以考虑n=1n=1 ...
- 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇
最近看到PowerBI圈子在讨论最大连续区间段的问题,即某人最大的全勤时间,某人的最长的连续打卡时间等问题的计算,佐罗老师给出了10万倍性能的答案.这个问题也引发了笔者一些兴趣,隐约记得以前看过Sql ...
- Excel催化剂开源第16波-VSTO开发之脱离传统COM交互以提升性能
在VSTO开发或其他COM技术开发过程中,甚至VBA也是,在和Excel交互中,难免会遇到性能瓶颈问题,COM技术的交互实在太慢,对大量数据读写等操作,耗时太长,容易卡用户界面以为是程序死机等等. 在 ...
- PTA L2-031 深入虎穴 非dfs的一点想法
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...
- 【译】宣告推出.NET Core 3.0 Preview 7(英雄的黎明)
今天,我们宣布推出.NET Core 3.0 Preview 7.我们已经从创建新特性阶段过渡到了完善版本阶段.对于其余的预览版,我们将把重点放在质量(改进)上. 在Windows,macOS和Lin ...