Tokenizer

概述

为了方便后续向量化表征试题,本模块提供题目文本的令牌化解析(Tokenization),即将题目转换成令牌序列。

根据构成题目的元素类型,解析功能分为 “文本解析”“公式解析” 两部分。

文本解析

根据题目文本切分粒度的大小,文本解析又分为 “句解析”“词解析”

  1. 句解析(sentence-tokenization):将较长的文档切分成若干句子的过程称为“分句”。每个句子为一个“令牌”(token)。(待实现)

  2. 词解析(text-tokenization):一个句子(不含公式)是由若干“词”按顺序构成的,将一个句子切分为若干词的过程称为“词解析”。根据词的粒度大小,又可细分为“词组解析”和”单字解析”。

    • 词组解析 (word-tokenization):每一个词组为一个“令牌”(token)。

    • 单字解析 (char-tokenization):单个字符即为一个“令牌”(token)。

公式解析

公式解析(formula-tokenization):理科类文本中常常含有公式。将一个符合 latex 语法的公式切分为标记字符列表的过程称为“公式解析”。每个标记字符为一个“令牌”(token)。

词解析

词解析分为两个主要步骤: 1. 分词:
- 词组解析:使用分词工具切分并提取题目文本中的词。
本项目目前支持的分词工具有:jieba
- 单字解析:按字符划分。
  1. 筛选:过滤指定的停用词。 本项目默认使用的停用词表: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]']