成分分解¶
由于教育资源是一种多模态数据,包含了诸如文本、图片、公式等数据结构; 同时在语义上也可能包含不同组成部分,例如题干、选项等,因此我们首先需要对教育资源的不同组成成分进行识别并进行分解:
语义成分分解
结构成分分解
主要处理内容¶
1.将字典输入形式的选择题通过 语法解析 转换为符合条件的item;
2.将输入的item按照元素类型进行切分、分组。
语义成分分解¶
由于选择题是以字典的形式给出,故需要将其在保留数据类型关系的情况下转换为文本格式。dict2str4sif函数就是实现此功能的一个模块,该模块可以将选择题形式的item转换为字符格式,并将题干和选项、各选项之间分割开来。
导入库¶
from EduNLP.utils import dict2str4sif
基础使用方法¶
>>> item = {
... "stem": r"若复数$z=1+2 i+i^{3}$,则$|z|=$",
... "options": ['0', '1', r'$\sqrt{2}$', '2'],
... }
>>> dict2str4sif(item)
'$\\SIFTag{stem_begin}$若复数$z=1+2 i+i^{3}$,则$|z|=$$\\SIFTag{stem_end}$$\\SIFTag{options_begin}$$\\SIFTag{list_0}$0$\\SIFTag{list_1}$1$\\SIFTag{list_2}$$\\sqrt{2}$$\\SIFTag{list_3}$2$\\SIFTag{options_end}$'
可选的的额外参数/接口¶
1.add_list_no_tag:当此参数为True较False时区别在于是否需要将选项部分的标签计数
>>> dict2str4sif(item, add_list_no_tag=True)
'$\\SIFTag{stem_begin}$若复数$z=1+2 i+i^{3}$,则$|z|=$$\\SIFTag{stem_end}$$\\SIFTag{options_begin}$$\\SIFTag{list_0}$0$\\SIFTag{list_1}$1$\\SIFTag{list_2}$$\\sqrt{2}$$\\SIFTag{list_3}$2$\\SIFTag{options_end}$'
>>> dict2str4sif(item, add_list_no_tag=False)
'$\\SIFTag{stem_begin}$若复数$z=1+2 i+i^{3}$,则$|z|=$$\\SIFTag{stem_end}$$\\SIFTag{options_begin}$0$\\SIFSep$1$\\SIFSep$$\\sqrt{2}$$\\SIFSep$2$\\SIFTag{options_end}$'
2.tag_mode:此参数为选择标签所在位置,delimiter为头尾都加标签,head为仅头部加标签,tail为仅尾部加标签
>>> dict2str4sif(item, tag_mode="head")
'$\\SIFTag{stem}$若复数$z=1+2 i+i^{3}$,则$|z|=$$\\SIFTag{options}$$\\SIFTag{list_0}$0$\\SIFTag{list_1}$1$\\SIFTag{list_2}$$\\sqrt{2}$$\\SIFTag{list_3}$2'
>>> dict2str4sif(item, tag_mode="tail")
'若复数$z=1+2 i+i^{3}$,则$|z|=$$\\SIFTag{stem}$$\\SIFTag{list_0}$0$\\SIFTag{list_1}$1$\\SIFTag{list_2}$$\\sqrt{2}$$\\SIFTag{list_3}$2$\\SIFTag{options}$'
3.key_as_tag:当其为False时则不区分切分标签的类型,而是仅在选项之间加入$SIFSep$
>>> dict2str4sif(item, key_as_tag=False)
'若复数$z=1+2 i+i^{3}$,则$|z|=$0$\\SIFSep$1$\\SIFSep$$\\sqrt{2}$$\\SIFSep$2'
结构成分分解¶
对切片后的item中的各个元素进行分词,提供深度选项,可以按照需求选择所有地方切分或者在部分标签处切分(比如SIFSep、SIFTag处);对标签添加的位置也可以进行选择,可以在头尾处添加或仅在头或尾处添加。
具有两种模式:
linear模式,用于对文本进行处理(使用jieba库进行分词);
ast模式,用于对公式进行解析。
基础分解流程:
使用正则匹配方法匹配出各个组成成分
对特殊结构的成分进行处理,如将base64编码的图片转为numpy形式
将当前元素分类放入各个元素组中
按照需求输入相应的参数得到筛选后的结果
导入库¶
from EduNLP.SIF.segment import seg
from EduNLP.SIF import sif4sci
基础使用方法¶
>>> test_item = r"如图所示,则$\bigtriangleup ABC$的面积是$\SIFBlank$。$\FigureID{1}$"
>>> seg(test_item)
>>> ['如图所示,则', '\\bigtriangleup ABC', '的面积是', '\\SIFBlank', '。', \FigureID{1}]
可选的的额外参数/接口¶
1.describe:可以统计出各种类型元素的数量
>>> s.describe()
{'t': 3, 'f': 1, 'g': 1, 'm': 1}
2.filter:可以选择性的筛除某种或几种类型的元素
此接口可传入keep参数来选择需要保留的元素类型,也可直接传入特殊字符来筛除特定元素类型
各字母所代表的元素类型:
“t”: text
“f”: formula
“g”: figure
“m”: question mark
“a”: tag
“s”: sep tag
>>> with s.filter("f"):
... s
['如图所示,则', '的面积是', '\\SIFBlank', '。', \FigureID{1}]
>>> with s.filter(keep="t"):
... s
['如图所示,则', '的面积是', '。']
3.symbol:选择性的将部分类型的数据转换为特殊符号遮掩起来
symbol所代表的元素类型:
“t”: text
“f”: formula
“g”: figure
“m”: question mark
>>> seg(test_item, symbol="fgm")
['如图所示,则', '[FORMULA]', '的面积是', '[MARK]', '。', '[FIGURE]']
>>> seg(test_item, symbol="tfgm")
['[TEXT]', '[FORMULA]', '[TEXT]', '[MARK]', '[TEXT]', '[FIGURE]']
此外,当前还提供了sif4sci函数,其可以很方便的将item转换为结构成分分解后的结果
>>> segments = sif4sci(item["stem"], figures=figures, tokenization=False)
>>> segments
['如图来自古希腊数学家希波克拉底所研究的几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形', 'ABC', '的斜边', 'BC', ', 直角边', 'AB', ', ', 'AC', '.', '\\bigtriangleup ABC', '的三边所围成的区域记为', 'I', ',黑色部分记为', 'II', ', 其余部分记为', 'III', '.在整个图形中随机取一点,此点取自', 'I,II,III', '的概率分别记为', 'p_1,p_2,p_3', ',则', '\\SIFChoice', \FigureID{1}]
调用此函数时,可以按照需求选择性的输出某一类型的数据
>>> segments.formula_segments
['ABC',
'BC',
'AB',
'AC',
'\\bigtriangleup ABC',
'I',
'II',
'III',
'I,II,III',
'p_1,p_2,p_3']
与seg函数类似,sif4sci也提供了标记化切分选项通过修改
symbol参数来将不同的成分转化成特定标记,方便您的研究
>>> sif4sci(item["stem"], figures=figures, tokenization=False, symbol="tfgm")
['[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[FORMULA]', '[TEXT]', '[MARK]', '[FIGURE]']