信息技术的发展与进步促使“互联网+教育”成为目前教育领域的研究热点,教育教学的各个环节都在向智能化的方向发展。中学数学的命名实体识别任务的研究,可为后续构建中学数学学科知识图谱及自动问答等任务奠定基础,进而满足中学生个性化知识获取的需求,助力新型智能化教育体系的构建。
相对于其他领域来讲,教育领域尤其是学科方面缺乏公开的数据集,故本人及团队从数据筛选到清洗以及标注,构建了中学数学实体识别数据集,数据量仍在充实和标注中,大家可以自由下载,历经磨难与痛苦,本着"授人以鱼不如授人以渔"的态度,本人也将数据构建过程和相关代码进行分享,如果本文提供的开源数据集对您的研究有很大帮助,请在引文引用本博文。
数据相关事项:
一、数据来源于百度文库、百度百科、维基百科等包含学科知识点的语句,以及人教版课本中关于知识点、例题描述等语句,整理成文档部分截图如下图所示。
二、文件中包含训练集train,验证集dev以及测试集test,全部按照BIO标注策略进行标注,数据构建过程如下。
1.文档处理
所有语句文档需要进行拆分,每一句话独立成txt,拆分代码如下:
data = []
for line in open("C:\\Users\\Dell\\Desktop\\math\\all.txt","r",encoding='utf-8-sig'): #设置文件对象并读取每一行文件
data.append(line)
continue
# 创建一个txt文件生成函数,文件名为name + '.txt',并向文件写入msg
def text_create(name, msg):
desktop_path = "C:\\Users\\Dell\\Desktop\\mathtxt\\" # 新创建的txt文件的存放路径
full_path = desktop_path + name + '.txt' # 也可以创建一个.doc的word文档
file = open(full_path, 'w',encoding="utf-8")
file.write(msg) #msg也就是下面的Hello world!
file.close()
#循环将data里的每一个元素写入不同的txt文档
for i in data:
text_create(str(data.index(i)), i)
continue
2.标注
所使用标注软件为精灵标注助手,选定标注文件夹(包含所有语句的txt文件夹),定义好实体即可进行标注,导入截图如下:
标注示意图如下:
3.导出
标注后,导出格式选择brat-ann,导出后的文本格式截图如下。
4.格式转换
ann文件需要转换成BIO格式进行训练,转化代码如下。
def bratann2BIO_format(text, ann_str, fstream):
ann_list = ann_str.strip().split('\n')
label = ['O' for _ in range(len(text))]
for i, line in enumerate(ann_list):
try:
T, typ, word = line.strip().split('\t')
t, s, e = typ.split()
s, e = int(s), int(e)
label[s] = 'B-' + t
while s < e - 1:
s += 1
label[s] = 'I-' + t
except:
continue
for t, l in zip(list(text), label):
line = ' '.join([t, l]) # 可以使用空格代替
fstream.write(line)
fstream.write('\n')
fstream.write('\n')
def gen_NER_training_data():
# 设置标注文件所在文件夹目录
root_dir = 'data/outputs'
# 设置训练样本输出文件路径
stream = open('data/out/test.txt', 'a+', encoding='utf8')
file_list = glob.glob(root_dir + '/*.ann')
for ann_path in file_list:
ann_path = ann_path.replace('\\', '/')
txt_path = ann_path.replace('/outputs', '').replace('ann', 'txt')
try:
ft = open(txt_path, 'r', encoding='utf8')
text = ft.read().strip()
ft.close()
fa = open(ann_path, 'r', encoding='utf8')
ann = fa.read().strip()
fa.close()
if ann == '':
continue
bratann2BIO_format(text, ann, stream)
except Exception as e:
print(ann_path, e)
stream.close()
5.实体描述
共包含两类实体:KNOW和PRIN,其中KNOW表示客观概念类,比如“集合”、“函数”等;PRIN表示法则定理类,比如“辗转相除法”、“韦达定理”等。部分数据展示如下图:
三、数据下载
数据压缩包已于文章顶部展示,内含readme文件解说了文件的数据量和划分标准,数据可以直接拿来训练和测试。
注:因均为手工标注,虽然经过了筛查和检验,部分数据可能仍出现标注错误问题,读者可自行修改,也希望你留言告知我,我将做出进一步调整。
非常感谢本次项目任老师对我的指导,以及师弟师妹们在本次项目中做出的贡献,尤其是昌霖师弟,每天与我忙到寝室门禁才结束工作,希望本博文可以给您的技术研究带来帮助。