令牌化

本模块提供题目的令牌化解析,将带公式、图片的句子切分为若干标记的过程。每个标记为一个“令牌”(token),方便后续向量化表征试题。

此模块实际上是将 成分分解 得到的不同成分(文本、公式、图片等)的 语法解析 结果做进一步处理,得到最终的多模态的令牌序列。

Note

在自然语言处理中,令牌化通常指分词,即将一个句子转化为词序列。针对多模态的教育资源,我们定义令牌化为:将含有不同成分的教育资源(如题目)转化为 含有不同类型令牌的令牌序列

令牌化函数

底层接口

此功能对应的实现函数为 EduNLP.SIF.tokenize ,将已经经过结构成分分解后的item传入其中即可得到所需结果。

Note

此部分仅用于告知用户令牌化的涉及的操作(成分分解、语法解析),若用户不需要修改相关底层接口,建议直接学习 标准接口 或更加方便的 令牌化容器

::
>>> from EduNLP.SIF.tokenization import tokenize
>>> items = "如图所示,则三角形$ABC$的面积是$\\SIFBlank$。$\\FigureID{1}$"
>>> tokenize(seg(items))
['如图所示', '三角形', 'ABC', '面积', '\\\\SIFBlank', \\FigureID{1}]
>>> tokenize(seg(items), formula_params={"method": "ast"})
['如图所示', '三角形', <Formula: ABC>, '面积', '\\\\SIFBlank', \\FigureID{1}]

标准接口

标准接口将标准化检验、成分分解、语法解析封装为一个整体,含有三个步骤的所有功能, 且提供多种参数以满足个性化使用需求。 具体使用方法见示例:

令牌化容器

我们提供了多种已经封装好的令牌化容器供用户便捷调用,通过查看 EduNLP.TokenizerEduNLP.Pretrain 可以查看更多令牌化器。下面是一个完整的令牌化器列表:

通用化的基础令牌化容器

  • TextTokenizer

  • PureTextTokenizer

  • GensimSegTokenizer

  • GensimWordTokenizer

适配特定模型的令牌化容器

  • ElmoTokenizer

  • BertTokenizer

  • DisenQTokenizer

  • QuesNetTokenizer

Note

“适配特定模型的令牌化容器” 需要与相应的T2V容器配合使用,本节仅介绍 “通用化的基础令牌化容器” 的使用方法。 如需查询ElmoTokenizer等令牌化容器,请前往预训练或向量化部分进行学习。

TextTokenizer

即文本令牌解析器,此令牌解析器同一般的文本分词器一样,采用线性解析方法得到令牌序列。其中,公式成分被视为文本,不关心公式的语法结构,作线性解析处理;而图片、标签、分隔符、题目空缺符等成分被转换成特殊字符,作符号化处理。此外,提供key参数用于选择传入的item中待处理的内容。

>>> tokenizer = TextTokenizer()

>>> items = ["已知集合$A=\\left\\{x \\mid x^{2}-3 x-4<0\\right\\}, \\quad B=\\{-4,1,3,5\\}, \\quad$ 则 $A \\cap B=$"]
>>> tokens = tokenizer(items)
>>> next(tokens)  
['已知', '集合', 'A', '=', '\\left', '\\{', 'x', '\\mid', 'x', '^', '{', '2', '}', '-', '3', 'x', '-', '4', '<',
'0', '\\right', '\\}', ',', '\\quad', 'B', '=', '\\{', '-', '4', ',', '1', ',', '3', ',', '5', '\\}', ',',
'\\quad', 'A', '\\cap', 'B', '=']

>>> items = [{
... "stem": "已知集合$A=\\left\\{x \\mid x^{2}-3 x-4<0\\right\\}, \\quad B=\\{-4,1,3,5\\}, \\quad$ 则 $A \\cap B=$",
... "options": ["1", "2"]
... }]
>>> tokens = tokenizer(items, key=lambda x: x["stem"])
>>> next(tokens)  
['已知', '集合', 'A', '=', '\\left', '\\{', 'x', '\\mid', 'x', '^', '{', '2', '}', '-', '3', 'x', '-', '4', '<',
'0', '\\right', '\\}', ',', '\\quad', 'B', '=', '\\{', '-', '4', ',', '1', ',', '3', ',', '5', '\\}', ',',
'\\quad', 'A', '\\cap', 'B', '=']

>>> items = ["有公式$\\FormFigureID{1}$,如图$\\FigureID{088f15ea-xxx}$,若$x,y$满足约束条件公式$\\FormFigureBase64{2}$,$\\SIFSep$,则$z=x+7 y$的最大值为$\\SIFBlank$"]
>>> tokenizer = get_tokenizer("text") # tokenizer = TextTokenizer()
>>> tokens = tokenizer(items)
>>> print(next(tokens))
['公式', '[FORMULA]', '如图', '[FIGURE]', 'x', ',', 'y', '约束条件', '公式', '[FORMULA]', '[SEP]', 'z', '=', 'x', '+', '7', 'y', '最大值', '[MARK]']

PureTextTokenizer

功能同 TextTokenizer , 且它会过滤掉经特殊处理的公式(例如:$\FormFigureID{…}$$\FormFigureBase64{…}$ ),仅保留文本格式的公式。

>>> tokenizer = PureTextTokenizer()

>>> items = ["有公式$\\FormFigureID{1}$,如图$\\FigureID{088f15ea-xxx}$,若$x,y$满足约束条件公式$\\FormFigureBase64{2}$,$\\SIFSep$,则$z=x+7 y$的最大值为$\\SIFBlank$"]

>>> tokenizer = get_tokenizer("pure_text") # tokenizer = PureTextTokenizer()
>>> tokens = tokenizer(items)
>>> print(next(tokens))
['公式', '如图', '[FIGURE]', 'x', ',', 'y', '约束条件', '公式', '[SEP]', 'z', '=', 'x', '+', '7', 'y', '最大值', '[MARK]']

GensimWordTokenizer

此令牌解析器默认对文本均采用线性的解析方法,而对公式采用抽象语法树的解析方法。此外,也可自定义符号化成分,将制定的成分(文本、公式、图片、标签、分隔符、题目空缺符等)转换成特殊字符,获得最终的令牌化序列,

若item不符合SIF标准格式,可通过制定参数 general=False 使用一般的文本处理方法来执行令牌化:

  • 当general=true:代表着传入的item并非标准格式,此时将公式视为文本,使用线性解析方法;

  • 当general=false:代表着传入的item为标准格式,此时对公式采用抽象语法树的方法进行解析。

>>> item = "已知有公式$\\FormFigureID{1}$,如图$\\FigureID{088f15ea-xxx}$, 若$x,y$满足约束条件公式$\\FormFigureBase64{2}$,$\\SIFSep$,则$z=x+7 y$的最大值为$\\SIFBlank$"

>>> tokenizer = GensimWordTokenizer(symbol="gmas")
>>> token_item = tokenizer(item)
>>> print(token_item.tokens)
['已知', '公式', \FormFigureID{1}, '如图', '[FIGURE]', 'mathord', ',', 'mathord', '约束条件', '公式', [FORMULA], '[SEP]', 'mathord', '=', 'mathord', '+', 'textord', 'mathord', '最大值', '[MARK]']

>>> tokenizer = GensimWordTokenizer(symbol="gmas", general=True)
>>> token_item = tokenizer(item)
>>> print(token_item.tokens)
['已知', '公式', '[FORMULA]', '如图', '[FIGURE]', 'x', ',', 'y', '约束条件', '公式', '[FORMULA]', '[SEP]', 'z', '=', 'x', '+', '7', 'y', '最大值', '[MARK]']

GensimSegTokenizer

功能同 GensimWordTokenizer,但GensimSegTokenizer解析器可以按分块的形式返回处理后的token,即保留item的结构信息:

  • 提供了切分深度的选项,即选择按结构成分分块或语义成分分块, 且默认在文本块和公式块的头部插入开始标签。

选择分块级别

  • depth=None: 按结构成分分块, 即按模态类型,返回文本、公式、图片的token列表

  • depth=0 选择在sep标签处进行切割

  • depth=1 选择在tag标签处进行切割

  • depth=2 选择在sep标签和tag标签处进行切割

item = "已知有公式$\\FormFigureID{1}$,如图$\\FigureID{088f15ea-xxx}$, 若$x,y$满足约束条件公式$\\FormFigureBase64{2}$,$\\SIFSep$则$z=x+7 y$的最大值为$\\SIFBlank$"

tokenizer = GensimSegTokenizer(symbol="gmas")
token_item = tokenizer(item)
print(len(token_item), token_item)
# 10 [['已知', '公式'], [\FormFigureID{1}], ['如图'], ['[FIGURE]'], ['mathord', ',', 'mathord'], ['约束条件', '公式'], [[FORMULA]], ['mathord', '=', 'mathord', '+', 'textord', 'mathord'], ['最大值'], ['[MARK]']]

# segment at Tag and Sep
tokenizer = GensimSegTokenizer(symbol="gmas", depth=2)
token_item = tokenizer(item)
print(len(token_item), token_item)
# 2 [['[TEXT_BEGIN]', '已知', '公式', '[FORMULA_BEGIN]', \FormFigureID{1}, '[TEXT_BEGIN]', '如图', '[FIGURE]', '[FORMULA_BEGIN]', 'mathord', ',', 'mathord', '[TEXT_BEGIN]', '约束条件', '公式', '[FORMULA_BEGIN]', [FORMULA], '[SEP]'], ['[FORMULA_BEGIN]', 'mathord', '=', 'mathord', '+', 'textord', 'mathord', '[TEXT_BEGIN]', '最大值', '[MARK]']]

更多示例