向量化

向量化过程是将原始题目(item)转成向量(vector)的过程,它包括两个步骤:

  • 使用 Tokenizer 令牌化容器 将原始题目(item)转化为令牌化序列(tokens);

  • 使用 T2V 向量化容器 将令牌化序列(tokens)转成向量(vector)。

I2V 向量化容器

为了使用户能直接使用本地的(或公开的)预训练模型,我们提供了`I2V向量化容器`, 将令牌化、向量化操作同时封装起来。

I2V 模块提供两种向量化方法:

  • 使用开源预训练模型

  • 使用本地预训练模型

输入数据

输入原始的题目列表,题目内容以文本或字典的形式给出

items = [
   r"题目一:如图几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形$ABC$的斜边$BC$, 直角边$AB$, $AC$.$\bigtriangleup ABC$的三边所围成的区域记为$I$,黑色部分记为$II$, 其余部分记为$III$.在整个图形中随机取一点,此点取自$I,II,III$的概率分别记为$p_1,p_2,p_3$,则$\SIFChoice$$\FigureID{1}$",
   r"题目二: 如图来自古希腊数学家希波克拉底所研究的几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形$ABC$的斜边$BC$, 直角边$AB$, $AC$.$\bigtriangleup ABC$的三边所围成的区域记为$I$,黑色部分记为$II$, 其余部分记为$III$.在整个图形中随机取一点,此点取自$I,II,III$的概率分别记为$p_1,p_2,p_3$,则$\SIFChoice$$\FigureID{1}$"
]

使用开源预训练模型

调用 get_pretrained_i2v 加载开源模型,并获取对应的 I2V 向量化容器将给定的题目转成向量。

  • 优点:用户不需要研究令牌化和模型加载的细节。令牌化和向量化的参数已由预训练模型的参数文件定义好。

  • 缺点:不适合修改预训练的模型参数或令牌化容器参数

模型选择与使用

根据题目所属学科选择预训练模型:(以下为部分开源模型示例)

预训练模型名称

学科

d2v_math_300

数学

w2v_math_300

数学

elmo_math_2048

数学

bert_math_768

数学

bert_taledu_768

数学

disenq_math_256

数学

quesnet_math_512

数学

Note

完整预训练模型列表可通过 Vector.t2v.get_all_pretrained_models 查看或者前往 模型库 查看

具体用法

from EduNLP import get_pretrained_i2v

i2v = get_pretrained_i2v("w2v_math_300")
item_vector, token_vector = i2v(items)

使用本地预训练模型

使用自己提供的任一预训练模型(给出模型存放路径即可)将给定的题目文本转成向量。

  • 优点:可以使用自己的模型,另可调整训练参数,灵活性强。

提供的I2V容器

名称

I2V容器

w2v

W2V

d2v

D2V

elmo

Elmo

bert

Bert

disenq

DisenQ

quesnet

QuesNet

具体用法

from EduNLP.I2V import W2V

# 加载向量化容器
pretrained_path = "path/to/model"
i2v = W2V("pure_text", "w2v", pretrained_path)

# 向量化
item_vector, token_vector = i2v(items)
# or
item_vector, token_vector = i2v.infer_vector(items)
# or
item_vector = i2v.infer_item_vector(items)
token_vector = i2v.infer_token_vector(items)

Note

不同模型的I2V容器在使用时略有差别,建议使用时查看对应的API文档或用法样例。

更多I2V容器使用示例

T2V 向量化容器

T2V 向量化容器能将题目的令牌序列(tokens)转成向量(vector)。

  • 优点:此容器与令牌化容器相互分离,用户可以自主调整令牌化容器和向量化容器的参数,可用于个性化的需求。

T2V 模块提供两种向量化方法:

  • 使用开源预训练模型

  • 使用本地预训练模型

输入数据

T2V 向量化容器的输入为题目的令牌化序列。因此,在调用 T2V 向量化容器之前,必须先使用 Tokenizer 令牌化容器获取 令牌序列列(token)。

from EduNLP.Tokenizer import PureTextTokenize

raw_items = [
   r"题目一:如图几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形$ABC$的斜边$BC$, 直角边$AB$, $AC$.$\bigtriangleup ABC$的三边所围成的区域记为$I$,黑色部分记为$II$, 其余部分记为$III$.在整个图形中随机取一点,此点取自$I,II,III$的概率分别记为$p_1,p_2,p_3$,则$\SIFChoice$$\FigureID{1}$",
   r"题目二: 如图来自古希腊数学家希波克拉底所研究的几何图形.此图由三个半圆构成,三个半圆的直径分别为直角三角形$ABC$的斜边$BC$, 直角边$AB$, $AC$.$\bigtriangleup ABC$的三边所围成的区域记为$I$,黑色部分记为$II$, 其余部分记为$III$.在整个图形中随机取一点,此点取自$I,II,III$的概率分别记为$p_1,p_2,p_3$,则$\SIFChoice$$\FigureID{1}$"
]

tokenizer = PureTextTokenizer()
token_items = [t for t in tokenizer(raw_items)]

使用开源预训练模型

Note

开源模型列表同I2V部分

加载源预训练模型到W2V容器中:

from EduNLP.Vector import get_pretrained_t2v

model_dir = "path/to/save/model"
t2v = get_pretrained_t2v("test_w2v", model_dir=model_dir)

item_vector = t2v.infer_vector(token_items)
# [array(), ..., array()]
token_vector = t2v.infer_tokens(token_items)
# [[array(), ..., array()], [...], [...]]

使用本地预训练模型

提供的T2V容器:

名称

T2V容器

w2v

W2V

d2v

D2V

elmo

ElmoModel

bert

BertModel

dienq

DisenQModel

quesnet

QuesNetModel

加载本地模型到W2V容器中:

from EduNLP.Vector import T2V, W2V

path = "path_to_model"
t2v = T2V('w2v', filepath=path)
# 或
# t2v = W2V(path)
<<<<<<< HEAD

item_vector = t2v.infer_vector(token_items)

# [array(), …, array()] token_vector = t2v.infer_tokens(token_items) # [[array(), …, array()], […], […]]

Note

不同模型的T2V容器在使用时略有差别,建议使用时查看对应的API文档或用法样例。

更多T2V容器使用示例