Tokenizer¶
概述¶
为了方便后续向量化表征试题,本模块提供题目文本的令牌化解析(Tokenization),即将题目转换成令牌序列。
根据构成题目的元素类型,解析功能分为 “文本解析” 和 “公式解析” 两部分。
文本解析¶
根据题目文本切分粒度的大小,文本解析又分为 “句解析” 和 “词解析”。
句解析(sentence-tokenization):将较长的文档切分成若干句子的过程称为“分句”。每个句子为一个“令牌”(token)。(待实现)
词解析(text-tokenization):一个句子(不含公式)是由若干“词”按顺序构成的,将一个句子切分为若干词的过程称为“词解析”。根据词的粒度大小,又可细分为“词组解析”和”单字解析”。
词组解析 (word-tokenization):每一个词组为一个“令牌”(token)。
单字解析 (char-tokenization):单个字符即为一个“令牌”(token)。
公式解析¶
公式解析(formula-tokenization):理科类文本中常常含有公式。将一个符合 latex 语法的公式切分为标记字符列表的过程称为“公式解析”。每个标记字符为一个“令牌”(token)。
词解析¶
词解析分为两个主要步骤: 1. 分词:
- 词组解析:使用分词工具切分并提取题目文本中的词。
本项目目前支持的分词工具有:
jieba- 单字解析:按字符划分。
筛选:过滤指定的停用词。 本项目默认使用的停用词表:stopwords 你也可以使用自己的停用词表,具体使用方法见下面的示例。
[1]:
# 导入模块
from EduNLP.SIF.tokenization.text import tokenize
[5]:
# 输入
text = "三角函数是基本初等函数之一"
词组解析¶
分词粒度参数选择 word: granularity = "word"
[10]:
# 输出:默认使用 EduNLP 项目提供的停用词表
tokenize(text, granularity="word")
[10]:
['三角函数', '初等', '函数']
单字解析¶
分词粒度参数选择 word: granularity = "char"
[14]:
# 输出:默认使用 EduNLP 项目提供的停用词表
tokenize(text, granularity="char")
[14]:
['三', '角', '函', '数', '基', '初', '函', '数']
停用词表¶
[15]:
# 获取自己的停用词表
spath = "test_stopwords.txt"
from EduNLP.SIF.tokenization.text.stopwords import get_stopwords
stopwords = get_stopwords(spath)
stopwords
[15]:
{'一旦', '一时', '一来', '一样', '一次', '一片', '一番', '一直', '一致'}
[8]:
# 输出:传入停用词表(stopwords)
tokenize(text,granularity="word",stopwords=stopwords)
[8]:
['三角函数', '是', '基本', '初等', '函数', '之一']
公式解析¶
切分出 latex 公式的每个标记符号。针对本模块更加详细的解释参见 formula
[35]:
# 导入模块
from EduNLP.SIF.tokenization.formula import tokenize
# 输入
formula = "\\frac{\\pi}{x + y} + 1 = x"
# 输出
# 输出形式选择普通序列(linear)
print('linear: ',tokenize(formula,method="linear"))
# 输出形式选择抽象语法分析树(ast)
print('ast : ',tokenize(formula,method="ast",return_type = "list", ord2token=False))
# 输出形式选择抽象语法分析树(ast)且将公式变量名转换成 token
print('ast & ord2token: ',tokenize(formula,method="ast",return_type = "list", ord2token=True))
# 输出形式选择抽象语法分析树(ast)且将公式变量名转换成带编号的 token
print('ast & ord2token & var_numbering: ',tokenize(formula,method="ast",return_type = "list", ord2token=True, var_numbering=True))
linear: ['\\frac', '{', '\\pi', '}', '{', 'x', '+', 'y', '}', '+', '1', '=', 'x']
ast : ['\\pi', '{ }', 'x', '+', 'y', '{ }', '\\frac', '+', '1', '=', 'x']
ast & ord2token: ['mathord', '{ }', 'mathord', '+', 'mathord', '{ }', '\\frac', '+', 'textord', '=', 'mathord']
ast & ord2token & var_numbering: ['mathord_con', '{ }', 'mathord_0', '+', 'mathord_1', '{ }', '\\frac', '+', 'textord', '=', 'mathord_0']
综合解析¶
标记解析 + 公式解析。特殊符号将转换成常量,例如:
FIGURE_SYMBOL = "[FIGURE]" # $\SIFChoice$
QUES_MARK_SYMBOL = "[MARK]" # $\FigureID{1}$
[39]:
# 导入模块
from EduNLP.Tokenizer import get_tokenizer
# 输入
item = {
"如图来自古希腊数学家希波克拉底所研究的几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形$ABC$的斜边$BC$, 直角边$AB$, $AC$.$\bigtriangleup ABC$的三边所围成的区域记为$I$,黑色部分记为$II$, 其余部分记为$III$.在整个图形中随机取一点,此点取自$I,II,III$的概率分别记为$p_1,p_2,p_3$,则$\SIFChoice$$\FigureID{1}$"
}
# 输出
tokenizer = get_tokenizer("text")
tokens = tokenizer(item)
next(tokens)
[39]:
['如图',
'古希腊',
'数学家',
'希波',
'克拉底',
'研究',
'几何图形',
'此图',
'三个',
'半圆',
'三个',
'半圆',
'直径',
'直角三角形',
'ABC',
'斜边',
'BC',
'直角',
'AB',
'AC',
'\x08',
'igtriangleupABC',
'三边',
'围成',
'区域',
'记',
'I',
'黑色',
'记',
'II',
'其余部分',
'记',
'III',
'图形',
'中',
'随机',
'取',
'一点',
'此点',
'取自',
'I',
',',
'II',
',',
'III',
'概率',
'记',
'p',
'_',
'1',
',',
'p',
'_',
'2',
',',
'p',
'_',
'3',
'[MARK]',
'[FIGURE]']