先说背景,之前做教育相关的产品,有一个需求就是学员在app上做题(主要是客观题),习题的来源就是学校、机构各种样式的word文档。
在技术总监的建议下,网上找了很多资料之后,决定使用序列标注来实现解析功能,提取题型、题号、题干、选项标志、选项内容(选择题)、解析。关于序列标注,在网上摘取了一段描述:序列标注模型被广泛应用于文本处理相关领域,例如分词、词性标注、命名实体识别等方面。
使用的技术需要了解几个名词:RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络;LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件;然后双向LSTM相比于LSTM,就有正向和反向的概念,就相当于会考虑上下文。本文当时使用的就是双向LSTM。
使用6个标签abcdef来标注题型、题号、选项标志、答案、解析,文本(题干、选项内容、解析内容),如下图所示:
几个问题:首先是训练数据怎么来,其次是模型用基层,不同的损失函数、激活函数、参数怎么调;最后就是训练时长。
解决第一个问题,数据来源文件服务器拉原始习题,然后爬虫爬一些新闻、小说片段等,自己构造文本-标注对应的训练数据。
解决第二个问题,看资料,不懂的就直接使用控制单一变量,来测试各个不同函数的效果,某个参数是调大还是调小。
解决第三个问题,自己买了一个游戏本,8核16G,显卡GTX1060,当时天梯图上也是数一数二的,使用GPU训练之后,在现有参数下2个多小时就能训练出结果。下面是一个小的测试效果:
整个过程历时三个月左右,在测试时,很多之前正则无法解决的问题,序列标注的版本都能很好识别;而且面对部分新的不识别的规则(有的新规则也能识别,应该是和分词中的新词发现类似),增加新的训练集数据,重新训练,就能达到不错的效果。
参考文章:
https://spaces.ac.cn/
领取专属 10元无门槛券
私享最新 技术干货