基于transformer的python命名实体识别模型

【www.zhangdahai.com--其他范文】

徐关友,冯伟森

(四川大学计算机学院,成都 610065)

在中国互联网技术的快速发展和世界范围内线上教育快速普及的大背景下,互联网技术被广泛地应用于教育领域,网络上有许多在线题库能帮助学生学习各种专业的知识,但是这些在线题库很难针对每个学生不同的学习进展而进行个性化的试题定制。题库中的练习题一般是以章节或者是知识点来进行划分,章节或者是知识点之间会有一部分重叠、递进的情况出现,这些情况会影响学生练习试题的效果。因此学生在学习python 知识时,对python 知识进行更加精确的命名实体识别(Named Entity Recognition,NER)是十分重要的前期工作。

python 命名实体相较于微博等广泛使用口语的命名实体在句子方面会更加正式。和医学、社交等热门的领域相比,python 领域的NER 研究和尝试都相对较少,现有的技术可以解决部分问题,但仍会面临数据少、可借鉴和参考少的问题,因此取得的效果一般。

NER 是自然语言处理(Natural Language Processing,NLP)众多子任务中一项非常上游的基本任务,NER 同时也是诸如问答系统[1]、信息检索[2]、关系提取[3]等非常多下游任务的前提和重要基础,在近几年受到了非常多研究人员的重点关注。NER 的主要目标是从给定文本中找到诸如人物名和地名等命名实体(Named Entity,NE)。在深度学习(Deep Learning,DL)技术未广泛使用以前,Saito 等[4]提出使用隐马尔可夫模型(Hidden Markov Model,HMM)来识别NE,而Feng 等[5]则是利用条件随机场(Conditional Random Fields,CRF)解决该问题,Ekbal 等[6]在2010 年提出使用支持向量机(Support Vector Machines,SVM)识别文本中的NE。近几年深度学习技术和注意力机制得到发展后则使用神经网络技术[7]来解决NER 问题,使得NER 有很大的进步。

相较于英文NER,中文NER 难度更大,因为中文并不能像英文那样自然切分,词边界非常模糊,所以现有的一些研究是先使用已有的中文分词系统进行分词,然后将词级序列标注的模型应用于分词的句子[8]。然而,中文分词(Chinese Word Segmentation,CWS)不可避免地会产生错误分割的情况,会使词边界和实体类别的预测出现错误。所以有些方法直接使用字符进行NER,文献[9-10]中的研究表明字符级的NER 模型也能够有效地识别NE。

虽然基于字符的中文NER 模型能避免分词错误,但是基于字符的模型有一个缺点就是没有充分利用数据中的单词信息,而这些单词信息对于识别NE 非常关键。出于将词信息加入到模型中的目的,Lattice-LSTM 模型[11]使用类似格子的结构来编码输入到模型中的字符以及与词典所匹配的词信息。该模型是一个使用长短期记忆(Long Short-Term Memory,LSTM)和条件随机场(Conditional Random Field,CRF)的字符级模型的拓展模型,它在两个字符之间设置一个用于存储开始和结束字符之间对应单词的“快捷路径”,通过“快捷路径”连接开始字符、存储单元和结束字符,并且使用门控循环单元(Gated Recurrent Unit,GRU)来控制快捷路径和相邻字符直接路径的贡献。门控循环单元在如图1 所示的情况时,模型没有办法选择正确的路径,此时该模型会退化为基于词的模型,受到分词错误带来的负面影响。图1(a)表示Lattice-LSTM 原模型,而图1(b)则表示因为错误预测“河水(River Water)”为实体从而造成快捷路径错误的情况,图中标有双下划线的标签表示正确预测的标签,而没有下划线的标签表示模型预测的错误标签,字符间的虚线路径则表示未正确预测的路径。由于句子中的每一个单词的长度是不同的,整个路径的长度不是固定的;
每个字符都对应有一个可变大小的候选词集,这意味着模型的输入和输出路径的数量也不是固定的,上述两个问题会使得Lattice-LSTM模型失去批量训练的能力,从而导致模型训练的速度降低。

图1 一个Lattice-LSTM退化的例子Fig.1 An example of Lattice-LSTM degradation

新提出的字符-词 transformer(Character-Word TransFormer,CW-TF)模型可以很好地解决Lattice-LSTM 模型的上述问题。为了防止模型退化为基于词的模型而受到分词错误带来的影响,本文模型将词信息分配给单个的字符,摒除了错误路径的影响。在transformer 编码前创建字符和词信息,在编码时将词信息分别分配给其对应的开始和结束字符,通过transformer 处理后使用CRF 解码预测标签序列。本文模型还引入了3 种策略来处理字符对应的词信息长度不固定的问题,让模型能够保留词信息的同时提高模型批量训练的速度。

针对python 的NER,CW-TF 模型在python 数据集上展示了其有效性,而且验证了模型并不会因为python 数据集而产生高性能的特殊情况,同时还在另一个数据集上训练,确保模型的普适性。实验的结果表明本文所提模型确实能较好地识别python 中的NE。

本文的主要工作有:1)提出了CW-TF 模型将词信息融合到基于字符的模型中;
2)探索了3 种不同的策略将词信息编码为固定大小的向量以解决无法批量化训练的问题;
3)针对python 已有数据集缺乏的问题整理了一个python 的NER数据集;
4)验证了所提模型能很好地识别python 中的NE。

近年来LSTM 等神经网络技术的进步促进了NER 的快速发展,本章将说明神经网络技术在NER 中的应用以及提出模型使用到的transformer 的结构。

1.1 NER的神经结构

近些年来神经网络技术在NER 中已经取得了较好的成绩[12-14]。从输入序列到预测标签序列,基于DL(Deep Learning)或者是注意力机制的NER 模型一般是由输入、上下文编码器和标签解码器3 个部分构建而成[15]。

Xu 等[16]利用词根、字符、词等不同粒度级别的信息作为输入解决了中文微博数据集中的NER 明显的性能下降问题;
Sun 等[17]提出了ERNIE2.0 模型,首先从训练的语料库中提取词汇信息、句法信息和语义信息,然后逐步构建预训练任务,最后通过在这些构建的任务上持续多任务学习的方式利用了训练语料库中其他有价值的信息。

Liu 等[18]在将信息输入模型时将词信息与字符信息相融合,避免了分词错误带来的影响,但是其批量化的训练速度仍然受限于上下文编码的方式;
所以现有的某些研究[19-20]使用图像处理的方法来处理NER,将中文字符转化为图片的格式进行训练,使用卷积神经网络(Convolutional Neural Network,CNN)编码图片吸收汉字作为象形文字的象形信息;
Yan 等[21]使用了transformer 结构作为上下文编码器编码输入信息,对字符级和词级特征进行建模,通过整合方向感知、距离感知等信息证明了transformer 类的编码器对于NER和其他NLP 任务一样有效;
Zhu 等[22]针对词级嵌入和词汇特征的模型经常出现的分词错误以及预训练在字典外(Out-Of-Vocabulary,OOV)的问题,提出使用一个基于字符并且带有局部注意力层的CNN 和从相邻的字符以及句子语境中获取信息的全局自注意层的GRU 组成的卷积注意网络(Convolutional Attention Network,CAN)作为上下文编码器解决这个问题;
Ding 等[23]利用自适应的门控图序列神经网络(Gated Graph Sequence Neural Network,GGNN)和一个标准的双向长短期记忆(Bi-directional Long Short-Term Memory,Bi-LSTM)网络作为上下文编码器,学习来自不同词典的加权信息组合,并且模型基于上下文信息解决了字符和词汇匹配的冲突;
Sui 等[24]和Wu 等[25]也使用Bi-LSTM 作为上下文编码器解决了中文词边界模糊的问题;
Xue 等[26]提出一个transformer 的拓展模型多孔格子transformer 编码器(Porous Lattice Transformer Encoder,PLTE),它通过批处理并行建模所有的字符和匹配的词汇,并用位置关系表示来增加自注意以包含格结构,它还引入了一种多孔机制来增强本地建模,并保持捕获丰富的长距离依赖关系的强度。Zhao 等[27]提出了多任务数据选择和使用知识库的约束解码两种方式改进Bi-LSTM-CRF 模型架构。

1.2 Transformer

Vaswani等[28]改进了seq2seq任务模型,提出了transformer的概念。transformer 的结构如图2所示,包含编码和解码两个部分,为了专注于NER 任务,本部分只关注于transformer的编码部分。transformer 的编码部分是由多头注意力(Multi-head Attention)和前馈网络(FeedForward Network,FFN)这两个非常重要的部分组成,FFN 是一种具有非线性转换位置方式的多层感知器。在这之后是残差连接和层标准化这两个操作。

图2 transformer结构Fig.2 Structure of transformer

1.2.1 位置嵌入

自注意力不知道不同标记的位置,所以无法捕获语言的顺序特征,而Vaswani 等[28]则采用由频率变化的正弦波产生的位置嵌入。第t个词元的位置嵌入可以用下面的公式计算:

其中:i∈[0,],d表示输入的维度。这种基于正弦曲线的位置嵌入使transformer 能够对词元的位置和每两个词元的距离进行建模。对于任何固定的偏移量k,PEt+k以通过PEt的一个线性transformer 表示。

1.2.2 缩放点击注意力

transformer 编码器接收到一个已经转化为嵌入向量的矩阵H∈Rl×d,其中的l和d分别表示序列的长度和输入的维度。使用三个可学习的矩阵Wq,Wk,Wv∈可以将矩阵H投影到不同的空间中,dk为一个超参数。缩放点积注意力可以通过以下公式计算:

其中:At,j、Q、K、V、A皆为矩阵;
Qt表示第t个词元的查询向量;
j表示第j词元;
Kj表示第j个词元的值向量表达;
归一化指数函数softmax 将应用于最后一个维度。

1.2.3 多头自注意力

可以使用多组Wq、Wk、Wv提升自注意力的能力,在使用多组Wq、Wk、Wv时被称为多头自注意力,其计算方式为:

式(6)和(7)中的h表示头的索引,式(8)中的n表示头的数量,[head(1),head(2),…,head(n)]则表示在最后一个维度的连接操作。在一般的情况下有d=n×dk,这可以说明多头注意力MultiHead(H) ∈Rl×d。在式(8)中的WO∈Rd×d是一个可学习参数。

1.2.4 前馈网络

多头注意力的输出会经过FFN 进一步处理,处理过程可以表示为:

其中:W1,W2∈为可学习参数矩阵,dff是一个超参数;
b1∈为可学习向量,b2∈Rd同样为可学习向量。

所提模型结构如图3 所示,和有的模型一样使用transformer 作为上下文编码器编码输入的数据,但是本文模型和标准的transformer 模型在嵌入层有所不同。如图3 所示,实线部分可以看作是一个使用transformer 作为上下文编码器的基于字符的模型,虚线部分则表示将单词信息编码成固定大小的表示,单词信息被整合到单词的结尾字符中,“PAD”表示填充值,“Stgy”表示3 种编码策略的一种,“⊕”表示连接操作。在嵌入层中,中文句子是将词信息绑定到每个字符上形成字符-词对;
其次,为了使模型能够批量训练并满足不同的应用需求,引入了3 种编码策略来从词集中提取固定大小但不同的信息;
最后,CW-TF 模型能提取字符和单词的特征,以更好地预测NE。

图3 所提模型结构Fig.3 Structure of the proposed model

使用S={c1,c2,…,cn}来表示输入的一句中文句子,ci表示句子中的第i个字符;
使用cb,e表示句子S中的一个以第b个字符开始到第e个字符结束的字符子序列,如图3 中所示的字符子序列“清澈”,可以将其表示为字符子序列c1,2。使用ciw表示第i个字符对应的单词集,它由一组来自词典D的字符子序列cb,i所构成,而下标b<i,词典D的构建和Lattice-LSTM 模型中自动分割原始文本构建的词典相同,每个字符对应的单词集可以表示为ciw={wi1,wi2,…,},wi1表示字符ci对应的字符子序列构成词集的第一个词,表示词集中词的数量。字符对应的词集在经过词编码策略选择以后,把字符和对应词信息连接在一起,最终输入的句子按字符-词对这种形 式可以表示为CW={(c1,c1w),(c2,c2w),…,(cn,cnw)}。

2.1 词编码策略

词集ciw中词的原始数量为,尽管模型在同一个批次中为每个字符ci分配的单词集ciw中词的数量通过填充都为,但是每个批次为字符ci选择的词的长度会因为批次不同而可能不同,因此模型的输入大小并不是相同的,这种情况将会不利于批量训练。为了获取固定大小的输入,本节将会介绍3 种不同的编码策略,并且在后面的部分统一使用wi,fin作为字符ci对应词信息的最终表示,然后其他对应词的长度则通过填充或者是截取的方式变成相同的长度。在通过词编码后字符ci对应的词集中只有一个词,其词集可以表示为ciw=wi,fin。

2.1.1 最短策略

对于字符ci对应的词集ciw={wi1,wi2,…},最短策略为选择词集中长度最短的词,假如是第一个词的长度为最短,则有:

2.1.2 最长策略

对于字符ci对应的词集ciw={wi1,wi2,…,},最长策略就是选择词集中长度最长的词,如果最后一个词的长度最长,则有:

2.1.3 平均策略

如果选择长度最短的词语,一般情况下就是字符本身,必定只能利用部分的信息,而选择长度最长的词会对增加计算的时间,所以引入一种平均策略。将平均策略用于选词的时候,对于字符ci对应的词集ciw={wi1,wi2,…,},选择对应的词有:

2.2 词-字符嵌入层

在CW中的i个元素都包含两个部分:对应句子中的第i个字符和分配给这个字符的词ciw。在字符ci的词集没有经过编码策略选择以前,每个词集ciw中的词的数量为,通过填充确保每个词集ciw有相同数量的候选词数量,经过词编码策略以后字符ci对应的词为wi,fin。通过预训练的字符嵌入查找表ec将每个字符ci嵌入到分布空间中获得向量有:

同样字符ci对应的词ciw=wi,fin,通过预训练的词嵌入查找表ew将每个词wi,fin表示为向量:

2.3 词-字符transformer

选择对应的词编码策略将词集编码并且使字符和对应的词转化为嵌入向量,然后将字符嵌入与对应的词嵌入连接。将字符嵌入与对应的词嵌入连接计算获取向量Xi如下:

式(15)中的“⊕”符号表示连接操作,在经过连接以后CW={X1,X2,…,Xn}。通过将字符与对应词信息连接,本模型没有Lattice 模型中的快捷路径,信息只能在相邻的字符间流动,确保模型不会退化。将连接的信息输入到上下文编码器中,在CW-TF 中的隐藏状态向量hi计算有:

则CW-TF 的输出可 以表示为H={h1,h2,…,hn}的向量集合。

2.4 解码和训练

模型使用标准的CRF 作为模型的最后一层,将上下文编码器的结果H输入到CRF 中。对于一个由向量li组成可能的标记序列y={l1,l2,…,ln},它的概率计算如下:

在得到所有可能的标签序列后,对其使用一阶维特比算法找到可能性最大的标签序列。

3.1 数据和评估指标

使用3 个数据集评估提出的CW-TF 模型,并且使用精确率(Precision,P)、召回率(Recall,R)和F1 值(F1)作为评价的指标。

3.1.1 数据集

使用多个数据集(python 数据集、resume 数据集和weibo数据集)评估提出的CW-TF 模型。resume 数据集、weibo 数据集是Lattice-LSTM 模型中使用的数据集,python 命名实体数据集是针对python 知识领域的数据集。

针对学生在学习python 知识时的个性化定制问题,python 命名实体识别的工作必不可少。中文命名实体识别的工作主要集中在新闻领域以及社交领域,针对教学领域的数据集很少,所以制作了一个有关python 命名实体的数据集。制作python 数据集时需要知道:在教育领域中,可以将NE 看作是教学过程中传递信息的载体。具体来说,在教学材料中NE 的表现形式可以是一个符号、一个事实、一个概念、一个原理或一个技能。通过这些事实、概念实现信息从一端到另外一端的传递。

教育领域中的NE 可以分为概念性、事实型、原理型、技能型以及符号型几类。在教育材料中:符号型NE 通常以单词形式出现。概念型NE、原理型NE、事实型NE、技能型NE通常以一句或多个句子的形式出现。其例子如图4 所示。

图4 数据集标注例子图Fig.4 Dataset labeling examples

标注的python 数据集是使用文献[29]作为标注数据集的原始文本材料,对书中的第一章至最后一章的所有内容进行标注。在进行数据标注以前使用正则表达式将语料中的数字统一替换为0,然后对清理过后的数据使用开源的标注工具YEDDA[30]进行NE 标注,并使用BIO 标记主题。对于数据集中的每个字符,可能的标注结果包括“B-NAME”“INAME”和“O”三种情况。python 数据集、resume 数据集和weibo 数据集的句子数量和字符数量如表1 所示,而表中的“K”表示1 000。

表1 数据集的统计信息Tab.1 Statistics of datasets

3.1.2 评估指标

使用精确率(P)、召回率(R)和F1 值(F1)来评价模型在3 个数据集上的NE 识别效果。P指的是所有正确预测结果占所有实际被预测到的结果的比例;
R指的是正确被预测的结果占所有应该被预测到的结果的比例;
P倾向于查准,而R更倾向于查全,在预测的时候希望两者都高,但事实上这两个指标在有些情况下是矛盾的,所以引入了精确率和召回率的调和平均F1。P、R、F1 三者的计算方法如下:

其中:Tp表示模型能够正确识别到的实体数目,Fp表示模型识别到与所需NE 不相关的实体个数,FN表示模型无法识别的相关实体个数。

3.2 实验设置

本节将会通过两个部分详细地介绍实验所依托的软硬件环境以及在实验过程中所设置的各种参数。

3.2.1 模型参数设置

模型的超参数和训练参数搜索范围如表2 所示,模型的特征维度在前两个数据集上都在160 时取得最好的效果,而在weibo 这个数据集上取得最好效果是在320;
同样前两个数据集在模型层数设置为2 时取得较好的效果,而weibo 则是在4 时效果较好;
将python 数据集和resume 数据集的多头注意力头数和维度分别设置为10 和64,而将weibo 数据集的多头注意力头数和维度分别设置为16 和128。输入句子的最大长度在resume 数据集上设置为178,而在python 数据集上设置为199,在weibo 数据集上设置为175。字符嵌入和词嵌入设置为0.15,而将模型中transformer 的dropout 率为0.4。并且模型将随机梯度下降(Stochastic Gradient Descent,SGD)这种优化算法应用于优化器,同时在python 数据集和resume 数据集上都将学习率设置为0.000 7。将梯度裁剪值设置为5,模型训练10 个轮次,100 个批次。

表2 模型参数Tab.2 Model parameters

3.2.2 实验环境

实验的硬件和软件环境如表3 所示。

表3 实验环境Tab.3 Experimental environment

3.3 实验结果和分析

与本文所提模型比较的基准模型同样是使用了词信息的模型,即在2018 年提出的Lattice-LSTM 模型、在2019 年提出的WC-LSTM 模型、在2019 年提出的LR-CNN 模型以及在2020 年提出的BERT+CRF 和BERT+LSTM+CRF 方法作为比较的基准。表4 为各模型在python 数据集、resume 数据集和weibo 数据集上的实验结果。

表4 在python,resume,weibo数据集上的实验结果 单位:%Tab.4 Experimental results on python,resume,weibo datasets unit:%

从表4 中可以看出将字符与对应词连接时,NER 性能将得到提升。在python 数据集,针对Lattice-LSTM 模型,将字符直接与其对应的词信息连接消除了原有模型中的快捷路径,进一步消除了模型退化为基于词模型的可能性,所以在P、R以及F1 上分别提升1.5、3.81、2.64 个百分点。与WC-LSTM模型相比,在R 值和F1 值上分别提升1.73 和0.58 个百分点,由于训练模型时的参数问题,导致得到的模型相较于理想情况,更倾向于查全而不是查准,所以所得结果的P 值会低于该模型。相较于LR-CNN 模型,在P 值上提升0.61 个百分点,而在R 值和F1 值上的性能提升并不明显。本模型和使用了BERT+CRF 的模型相比在F1 值上提升3.65 个百分点,在P 值和F1 值上相较于BERT+LSTM+CRF 模型分别低2.15 和0.59 个百分点,说明使用BERT 初始化词嵌入优于随机初始化词嵌入,并且在使用BERT 的情况下再加入LSTM是有必要的。本模型通过使用BERT 语言预训练模型可以有进一步的提升,说明预训练的语言模型在python 领域是有效果的。从表4 还可以看出三种词编码策略中平均策略在各项均优于最短策略。

为验证本文模型的性能提升并非特定于python 数据集,使用resume 数据集和weibo 数据集验证模型的拓展性。从表4 中在resume 数据集上的实验结果可以看出与Lattice-LSTM模型相比,在F1 值提升0.83 个百分点;
而和使用BERT 的模型相比,由于resume 数据集中的数据对于方向性有一定的依赖,所以使用BERT 的模型会优于使用单向transformer 的CW-TF 模型。虽然模型在resume 数据集上的提升不大,但是训练速度明显提高。

表4 最后的部分为CW-TF 模型使用预训练后在weibo 数据集上的实验结果。可以看出在F1 值上本模型略高于Lattice-LSTM 模型,而对于weibo 这种口语化强、语句短的领域表现出的效果低于其他基准模型,但仍然可以说明CW-TF模型具有一定的泛化性。

通过3 种词编码策略提高了模型的批量训练能力,表5第2 列显示了部分模型在python 数据集总训练时间上的对比,而第3 列表示在resume 数据模型上的比较,使用“×”表示倍数关系。使用Lattice-LSTM 模型的总训练时间作为比较的基准,Lattice-LSTM 模型相较于所提出的模型而言,在python 数据集上的总训练时间为CW-TF 模型的4.14 倍,在resume 数据集上的总训练时间为CW-TF 模型的3.25 倍。而所提模型与其他模型相比在总的训练时间上都有显著减少。

表5 训练速度Tab.5 Training speed

3.4 多头注意力的特征维度对比实验

本文还研究了多头注意力的特征维度对CW-TF 模型的影响。实验在保持transformer 上下文编码器总规模不变的情况下,通过python 数据集研究了多头注意力的特征维度对CW-TF 模型的影响,特征维度的取值范围为[32,64,96,256]。将其他参数设置为固定值,所得实验结果如表6 所示。从表6 可以看出:前期当多头注意力的特征维度数增加时,实验的效果逐渐变好;
在多头注意力的特征维度取64时,模型取得最佳的效果;
而当多头注意力的特征维度增加到一定程度后,实验效果达到最优值并逐渐变差。

表6 在python数据集上不同transformer多头注意力的特征维度结果对比 单位:%Tab.6 Result comparison of different transformer multi-head attention feature dimension on python dataset unit:%

3.5 三种词编码策略对比实验

选择不同的词编码策略会对实验的效果有影响,图5 为3 种词编码策略的实验效果对比。从图5 中可以看出在python 数据集上选择最长的词可以让F1 值达到最高。由于最长的词编码策略可以利用更多的词信息,所以最长的词编码策略在效果上均优于最短的词编码策略。

图5 在python数据集词编码策略性能比较Fig.5 Word coding strategy performance comparison on python dataset

本文对python 领域的NER 进行了研究,提出了一种基于transformer 的python 领域NER 模型。该模型将字符和字符对应的词信息进行连接,获取连接后的向量化表示,然后输入到transformer 中编码,最后通过CRF 获取预测的标签序列。实验的结果表明,所提模型相较于其他几个模型在识别效果和速度上都有提升。所提模型为python 领域NER 的下游任务打下坚实的基础,为个性化学习python 知识进一步提供了技术上的可行性。与基于机器学习方法相比,本文模型可以很容易地迁移到其他领域。为了解决教育领域命名实体识别标记数据集少的问题,整理了一个python 的数据集。后续将进一步验证模型的可迁移性,将该模型应用于其他领域,还会扩大数据集的规模,以达到更好的识别效果。

猜你喜欢 字符编码注意力 住院病案首页ICD编码质量在DRG付费中的应用中国典型病例大全(2022年7期)2022-04-22让注意力“飞”回来小雪花·成长指南(2022年1期)2022-04-09Python实现图片转字符画电脑报(2021年41期)2021-11-04正则表达式快速入门电脑知识与技术(2019年29期)2019-12-16图片轻松变身ASCⅡ艺术画电脑爱好者(2019年8期)2019-10-30高效视频编码帧内快速深度决策算法计算机应用(2016年10期)2017-05-12A Beautiful Way Of Looking At Things第二课堂(课外活动版)(2016年2期)2016-10-21视频监视系统中字符叠加技术的应用农机使用与维修(2014年10期)2014-10-23不断修缮 建立完善的企业编码管理体系中国计算机报(2009年27期)2009-04-27阅读理解两则中学英语之友·高一版(2008年10期)2008-12-11

推荐访问:实体 命名 识别

本文来源:http://www.zhangdahai.com/shiyongfanwen/qitafanwen/2023/0412/583385.html

  • 相关内容
  • 热门专题
  • 网站地图- 手机版
  • Copyright @ www.zhangdahai.com 大海范文网 All Rights Reserved 黔ICP备2021006551号
  • 免责声明:大海范文网部分信息来自互联网,并不带表本站观点!若侵害了您的利益,请联系我们,我们将在48小时内删除!