语法解析

在教育资源中,文本、公式都具有内在的隐式或显式的语法结构,提取这种结构对表征学习是大有裨益的:

  • 文本语法结构解析

  • 公式语法结构解析

文本语法结构解析

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

句解析(sentence-tokenization)

将较长的文档切分成若干句子的过程称为“分句”。每个句子为一个“令牌”(token)。(待实现)

词解析(text-tokenization)

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

主要步骤

(1)分词

  • 词组解析:使用分词工具切分并提取题目文本中的词。

    本项目目前支持的分词工具有:jieba

  • 单字解析:按字符划分。

(2) 过滤停用词

  • 本项目默认使用的停用词表:stopwords

  • 你也可以使用自己的停用词表,具体使用方法见下面的示例。

示例

导入模块

from EduNLP.SIF.tokenization.text import tokenize

输入

text = "三角函数是基本初等函数之一"

词组解析

# 输出:默认使用 EduNLP 项目提供的停用词表
>>> tokenize(text, granularity="word")
['三角函数', '初等', '函数']

单字解析

# 输出:默认使用 EduNLP 项目提供的停用词表
>>> tokenize(text, granularity="char")
['三', '角', '函', '数', '基', '初', '函', '数']

使用自己的停用词表

>>> spath = "test_stopwords.txt"
>>> from EduNLP.SIF.tokenization.text.stopwords import get_stopwords
>>> stopwords = get_stopwords(spath)
>>> stopwords
{'一旦', '一时', '一来', '一样', '一次', '一片', '一番', '一直', '一致'}
>>> tokenize(text, granularity="word", stopwords=stopwords)
['三角函数', '是', '基本', '初等', '函数', '之一']

公式语法结构解析

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

包括两种方案

  • 公式线性解析

  • 公式AST解析

Note

本小节主要介绍如何获取不同格式的公式解析结果。公式解析的底层实现请参考:EduNLP.Formula 部分。

(1)公式线性解析

如果您想按 latex 语法标记拆分公式的各个部分,并得到顺序序列结果,输出方法可以选择:linear

::
>>> tokenize(formula, method="linear")
['\\frac', '{', '\\pi', '}', '{', 'x', '+', 'y', '}', '+', '1', '=', 'x']

(2) 公式AST解析

如果您想得到公式解析出的语法分析树序列,输出方法可以选择:ast

> 抽象语法分析树,简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 > 因此,ast 可以看做是公式的语法结构表征。

::
>>> tokenize(formula, method="ast", return_type="list", ord2token=False)
['\\pi', '{ }', 'x', '+', 'y', '{ }', '\\frac', '+', '1', '=', 'x']

(3)公式AST解析+变量符号化

如果您只是关心公式的结构和类型,并不关心变量具体是什么,比如二元二次方程 x^2 + y = 1 ,它从公式结构和类型上来说,和 w^2 + z = 1 没有区别。 此时,您可以设置如下参数:ord2token = True,将公式变量名转换成 token

::
>>> tokenize(formula, method="ast", return_type="list", ord2token=True)
['mathord', '{ }', 'mathord', '+', 'mathord', '{ }', '\\frac', '+', 'textord', '=', 'mathord']

(4) 公式AST解析+变量标准化

如果您除了 (3) 中提供的功能之外,还需要区分不同的变量。此时可以另外设置参数:var_numbering=True

::
>>> tokenize(formula, method="ast", return_type="list", ord2token=True, var_numbering=True)
['mathord_con', '{ }', 'mathord_0', '+', 'mathord_1', '{ }', '\\frac', '+', 'textord', '=', 'mathord_0']