MulDA: A Multilingual Data Augmentation Framework for Low-Resource Cross-Lingual NER 阅读笔记

32 篇文章 1 订阅
1 篇文章 0 订阅

MulDA: A Multilingual Data Augmentation Framework for Low-Resource Cross-Lingual NER

2021 Association for Computational Linguistics

Abstract

低资源语言的命名实体识别(NER)是一个既实用又具有挑战性的研究问题。本文研究了跨语言NER的zero-shot transfer问题,特别是在源语言训练数据量也有限的情况下。本文首先提出了一种简单而有效的标记序列翻译方法,将源语言训练数据翻译为目标语言,避免了词序变化和实体跨度确定等问题。利用源语言数据和翻译后的数据,引入了一种基于生成的多语言数据增强方法,通过生成多种语言的合成标记数据来进一步增加多样性。这些增强的数据使基于语言模型的NER模型能够更好地泛化目标语言合成数据中的特定语言特征和多语言合成数据中的语言独立特征。进行了广泛的一系列实验,以证明鼓励跨语言转移性能的新研究的各种目标语言。

1 Introduction

命名实体识别(NER)的目的是将文本中的实体进行识别和分类为预定义的类型,这是信息提取的重要工具。它也被证明在各种下游自然语言处理(NLP)任务中是有用的,包括信息检索、问题回答和文本摘要。

然而,除了一些资源丰富的语言(如英语、德语)外,大多数其他语言的训练集仍然非常有限。此外,注释这些数据通常是昂贵和耗时的,特别是对于低资源语言。因此,零镜头跨语言NER近年来引起了越来越多的兴趣,特别是随着深度学习方法的涌入

现有的跨语言NER方法可大致分为两大类:① 通过机器翻译和标签投影;② 基于模型的跨语言词表示或预先训练的多语言模型。最近,Wu等人通过知识蒸馏统一了基于实例和基于模型的转移。

这些最近的方法已经证明了很有前途的zero-shot跨语言NER性能。但是,它们中的大多数都假定可以以源语言提供大量的训练数据。当减少训练数据的大小时,可以观察到显著的性能下降。对于基于实例的传输,减少训练集的大小也放大了MT和标签投影引入的噪声的负面影响。对于基于模型的迁移,尽管大规模的预训练多语言模型(LM)在许多跨语言迁移任务上取得了最先进的性能,但只要在小训练集上进行微调就容易过拟合。

为了解决低资源跨语言NER设置下的上述问题,本文提出了一个多语言数据增强(MulDA)框架,以更好地利用预训练的多语言LMs的跨语言泛化能力。具体来说,本文考虑了一个跨语言NER的低资源设置,其中有非常有限的源语言训练数据,并且没有目标语言训练/验证数据。这样的设置在许多真实的场景中都是实用的和有用的。

本文提出的框架从基于实例的转移(即翻译训练)范式中寻求初始帮助。文章首先介绍了一种新的标记序列翻译方法,将训练数据翻译为目标语言和其他语言。这使得能够根据多语言数据而调整基于LM的NER模型,而不是仅基于源语言数据,这有助于防止对特定语言特性的过拟合。一个常用的翻译工具是现成的谷歌翻译系统,它支持100多种语言。另外,还有许多预训练的MT模型可以方便地访问,例如,超过1000个MarianMT模型已经在hug人脸模型中心上发布。

请注意,基于实例的传输方法为训练集增加了有限的语义多样性,因为它们只将实体和相应的上下文翻译到不同的语言中。相比之下,数据增强已被证明是解决数据稀缺性问题的一种成功的方法。受最近一种单语言数据增强方法的启发,作者提出了一种基于生成的多语言数据增强方法来增加多样性,其中LM对多语言标记数据进行训练,然后用于生成更多的合成训练数据。

作者进行了广泛的实验和分析来验证该方法的有效性。主要贡献可以总结如下:

  1. 本文提出了一种简单而有效的标记序列翻译方法,将源训练数据转换为所需的语言。与现有的方法相比,作者的标记句子翻译方法利用占位符进行标签投影,有效地避免了单词对齐过程中面临的许多问题,如词序变化、实体跨度确定、噪声敏感相似性度量等。
  2. 提出了一种基于生成的多语言数据增强方法,该方法利用多语言语言模型为训练数据增加了更多的多样性。
  3. 通过经验实验观察到,当对低资源的跨语言NER的预先训练的多语言lm进行微调时,翻译到更多的语言也可以作为一种有效的数据增强方法,这有助于提高源语言和目标语言的性能。

2 MulDA: Our Multilingual Data Augmentation Framework

作者提出了一个多语言数据增强框架,它利用了基于实例和基于模型的跨语言网络网络传输的优势。本框架首先引入了一种新的标记序列翻译方法,将标注的训练数据从源语言 S S S翻译为一组目标语言 T = { T 1 , . . . , T n } T=\{T_1,...,T_n\} T={T1,...,Tn}。然后在 { D S , D T 1 , . . . , D T n } \{D^S,D^{T_1},...,D^{T_n}\} {DS,DT1,...,DTn}上对语言模型进行训练,生成多语言合成数据,其中 D S D^S DS为源语言训练数据, D T i D^{T_i} DTi为语言 T i T_i Ti中的翻译数据。最后,对增强的数据进行后处理和过滤,以训练多语言NER模型,以便对目标语言测试集进行推理。

2.1 Labeled Sequence Translation

作者利用标记序列翻译对源语言的训练数据来生成多语言NER训练数据,这也可以看作是一种数据增强的方法。先前的方法通常通过两个独立的步骤进行翻译和标签投影:1)将源语言训练句子翻译成目标语言;2)通过对齐模型或算法的字对字/短语到短语映射,将标签从源训练数据传播到翻译的句子。然而,这些方法存在一些标签投影问题,如词序变化、跨度确定等。避免标签投影问题的另一种方法是逐字翻译,但通常会牺牲翻译质量。

为了解决上述问题,作者首先在句子翻译之前用上下文占位符替换命名实体,然后在翻译之后,用相应的翻译实体替换翻译句子中的占位符。该方法的一个说明如图1所示。

在这里插入图片描述

假设一个句子 X S = { x 1 , . . . , x M } ∈ D S X^S=\{x_1,...,x_M\}∈D^S XS={x1,...,xM}DS和相应的NER标签 { y 1 , . . . , y M } \{y_1,...,y_M\} {y1,...,yM},其中 x i x_i xi是句子标记, M M M是句子长度。让 { E 1 , . . . , E n } \{E_1,...,E_n\} {E1,...,En}表示预定义的命名实体类型。本方法首先将占位符替换 { x 1 , . . . , x M } \{x_1,...,x_M\} {x1,...,xM}中的所有实体(图1中步骤1中的src)。占位符 E k E_k Ek是重构的标记,以相应的实体类型 E E E作为前缀,以实体 k k k的索引作为后缀。假设 { x i , . . . , x j } \{x_i,...,x_j\} {xi,...,xj}是源句中的第 k k k个实体,对应的类型是 E z E_z Ez,那么可以用占位符 E z k E_zk Ezk替换该实体来得到 { … , x i − 1 , E z k , x j + 1 , … } \{…,x_{i−1},E_zk,x_{j+1},…\} {,xi1,Ezk,xj+1,}。用 X ∗ S X_∗^S XS来表示用占位符替换所有实体后生成的句子。 X ∗ S X_∗^S XS注入一个 M T MT MT模型得到翻译 X ∗ T X_∗^T XT目标语言 T T T。这样的设计,占位符前缀 E E E可以提供 M T MT MT模型实体相关的上下文信息,这样模型可以翻译与相当好的句子质量。此外,作者观察到大多数占位符在翻译后没有变化,这可以用来帮助定位实体的位置。

在第二步中,用相应的上下文来翻译每个实体。更具体的是,使用方括号来标记每个实体的跨度,并依次将其转换为目标语言,一次一个(图1中步骤2中的src)。例如,要翻译实体 { x i , . . . , x j } \{x_i,...,x_j\} {xi,...,xj},则提供 { … , x i − 1 , [ x i , . . . , x j ] , x j + 1 , … } \{…,x_{i−1},[xi,...,xj],x_{j+1},…\} {,xi1,[xi,...,xj],xj+1,}到MT模型。然后可以通过从翻译的句子中提取标记标记得到实体翻译。如果没有找到方括号,将直接转换实体。

最后,将 X ∗ T X_∗^T XT中的占位符替换为相应的实体翻译(从第二步获得),并将占位符前缀复制为实体标签,生成目标语言的合成训练数据(图1中的步骤3)。用谷歌翻译和MarianMT模型进行了测试,发现两者都产生了预期的高质量的合成数据。

2.2 Synthetic Data Generation with Language Models

虽然标记序列翻译可以生成高质量的多语言NER训练数据,但由于翻译不引入新的实体或上下文,它增加了有限的多样性。受DAGA的启发,作者提出了一种基于生成的多语言数据增强方法,为训练数据增加更多的多样性。DAGA是一种设计用于序列标记任务的单语数据增强方法,它已被证明能够为训练数据增加显著的多样性。如图2所示的例子,它首先通过在句子标记之前添加实体类型来线性化已标记的序列。然后用自回归的方法对线性化序列的LM(LSTM-LM)进行训练,然后将句子开始标记[BOS]输入LSTM-LM,自动回归生成合成训练数据。DAGA的单语言LSTM-LM的训练方式与图3中所示的示例相似,除了没有语言标签[en]。
在这里插入图片描述

为了将这种方法扩展用于多语言数据增强,作者在每个句子的开头添加特殊的标记来表示它所属的语言。源语言数据和通过翻译获得的多语言数据被连接起来,用一个共享的词汇表来训练/微调多语言LM(如图5所示)。给定一个来自多语言训练数据的标记序列 { x 1 , . . . , x M } \{x_1,...,x_M\} {x1,...,xM},LM被训练以最大化等式1中的概率$p(x_1,…,x_M) $:

p ( x 1 , . . . , x M ) = Π t = 1 M p θ ( x t ∣ x < t ) p(x_1,...,x_M) =\Pi^M_{t=1}p_\theta (x_t|x_{<t}) p(x1,...,xM)=Πt=1Mpθ(xtx<t)

其中, θ θ θ是要优化的参数, p θ ( x t ∣ x < t ) p_\theta (x_t|x_{<t}) pθ(xtx<t)是给定序列中前一个token的下一个token的概率,通常用softmax函数计算。图3显示了一个如何以自回归的方式训练多语言LSTM-LM的示例。在训练了LSTM-LM之后,可以将[BOS]标记和一个语言标记提供给模型,以生成指定语言的合成训练数据。

在这里插入图片描述

此外,为了利用大规模预训练的多语言LM的跨语言泛化能力,作者还微调了最近最先进的seq2seq模型mBART,该模型使用多语言去噪任务进行了预训练。句子排列和词跨掩蔽是两种噪声注入方法,用于添加噪声到原始句子 X = { x 1 , . . . , x M } X=\{x_1,...,x_M\} X={x1,...,xM}输出 g ( X ) g(X) g(X),其中 g ( . ) g(.) g(.)是用来表示噪声注入函数的。在用Transformer decoder对 g ( X ) g(X) g(X)进行编码后,Transformer decoder被训练通过最大化等式1自动回归生成原始序列X。

去噪词跨掩码序列与本文的数据增强方法最相关,因为只需要很小的修改就可以使微调任务尽可能与训练前任务保持一致。更具体地说,通过以下变化设计了微调任务:

  1. 使用线性化的标记序列(如图5所示)作为输入X;
  2. 修改 g ( . ) g(.) g(.)掩码随机尾随子序列,使 g ( X ) = { x 1 , . . . , x z , [ m a s k ] } g(X)=\{x_1,...,x_z,[mask]\} g(X)={x1,...,xz,[mask]},其中 1 ≤ z ≤ ∣ X ∣ 1≤z≤|X| 1zX是一个随机整数。经过该任务的微调后,可以方便地将随机掩码序列 { x 1 , . . . , x z , [ m a s k ] } \{x_1,...,x_z,[mask]\} {x1,...,xz,[mask]}输入mBART生成合成数据。图4显示了一个更具体的例子,以说明mBART是如何用本文工作中的线性化序列来微调mBART的。
    在这里插入图片描述
    在这里插入图片描述
2.3 Semi-supervised Method

未标记的多语言句子通常很容易获得,例如,从维基媒体中获得的数据。为了更好地利用这些未标记的多语言数据,作者提出了一种半监督的方法来准备更多的伪标记数据来微调多语言LM。受自我训练的启发,作者使用对多语言翻译数据进行训练的NER模型来标注未标注的句子。之后使用另外两个使用不同随机种子训练的NER模型,通过删除具有不同标签预测的数据来过滤带注释的数据。

2.4 Post-Processing

作者还设计了几种简单的方法来后处理和过滤由LM生成的增强数据:

  1. 删除仅包含O(其他)标记的序列。
  2. 通过分离句子标记和NER标记,将生成的标记序列转换为与黄金数据相同的格式。
  3. 使用在多语言翻译数据上训练的NER模型来标记生成的序列(在标签删除之后)。然后比较由LM和NER模型预测生成的标签,并删除有不一致的句子。

3 Experiments

作者进行了实验来评估所提出的多语言数据增强框架的有效性。首先,将标记序列翻译方法与以前的基于实例的转移(即翻译序列)方法进行了比较。接下来展示添加多语言翻译的好处。然后,作者继续通过比较基于生成的多语言数据增强方法,并分别比较训练在单语言、双语和多语言增强数据上的模型的跨语言NER性能,来评估基于生成的跨语言数据增强方法。最后,我们在更广泛的遥远语言上进一步评估了我们的方法。

在本文实验中,作者使用了最典型的Transformer-based NER model,它是通过在Transformer最终层中添加一个随机初始化的前馈层来实现的。具体来说,为了证明本文框架可以帮助实现额外的性能提高,即使是在最先进的多语言LM的顶部,作者使用预先训练的XLM-R large模型的检查点来初始化本文的NER模型。

3.1 Labeled Sequence Translation

作者在翻译的目标语言数据上微调NER模型,以将本文标记序列翻译方法与现有的基于实例的转移方法进行比较。

**Experimental settings: **CoNLL02/03NER数据集用于评估,其中包含四种不同语言的数据:英语、德语、荷兰语和西班牙语。所有的数据都用同一组NER标签进行了注释。按照2.1中描述的步骤将英语训练数据翻译成其他三种语言。实验中使用了谷歌翻译系统。由于本文的NER模型比Jain和Li等人使用的模型更强大,作者用XLM-R large来重现他们的结果,以进行公平的比较。所有的NER模型只对翻译的目标语言句子进行10个epoch的微调,使用英语验证数据选择最佳模型,然后对目标语言原始测试数据进行评估。

在这里插入图片描述

Results: 如表1所示,该方法在德语和荷兰语上分别比最佳基线方法高出2.90和2.97,平均为2.23。由于本模型只对标记序列翻译方法生成的数据进行了微调,因此结果直接证明了我们的方法的有效性。此外,与最近的两种基线方法相比,我们的方法不依赖于复杂的标签投影算法,而且更容易实现。

3.2 Multilingual Translation as Data Augmentation

本节实验验证多语言翻译可能有助于提高低资源场景下多语言LM的跨语言转换性能的假设。

Experimental settings: 使用与上面相同的NER数据集。为了模拟低资源的场景,从gold英语训练集中随机抽取500、1k和2k个句子。本文采用标记序列翻译方法将采样数据翻译为德语、西班牙语和荷兰语三种目标语言的伪标记数据。为了更好地演示训练数据如何影响跨语言的NER性能,作者在四种不同的条件下训练了NER模型:

  1. En:只对英语数据训练模型;
  2. Tgt-Tran:只对某种目标语言的伪标记数据训练模型;
  3. En + Tgt-Tran:用英语数据和伪标记目标语言数据的组合训练模型;
  4. En + Multi-Tran:用三种目标语言的英语数据和伪标记数据的组合训练一个单一模型。

作者发现过滤翻译句子可以进一步提高跨语言传输性能,所以使用一个NER模型训练抽样英语数据标签翻译句子,计算每个句子的实体数量不同于NER模型预测,然后删除前20%的句子最不一致的实体。这与2.4中描述的第三步相似,除了从增强的数据中删除了所有不一致的句子,因为LM可以用来生成大量的候选句子。将最大的epoch数设置为10,并从英语开发数据中随机抽取500个句子来为每个设置选择最佳模型。然后在原始目标语言测试集上评价最佳模型。

在这里插入图片描述

Results: 表2比较了在不同训练集上训练的模型的跨语言NER性能。尽管En和Tgt-Tran在大多数情况下的性能相对较差,但结合它们总是可以显著提高性能,特别是在数据集大小较小的情况下。当英语数据大小为1k或更少时,添加多语言翻译的数据将进一步使跨语言性能平均提高1%以上。因此,在跨语言NER的低资源场景中,多语言翻译可以作为一种有效的数据增强方法。此外,还有:经过En + Multi-Tran训练单模型可以应用于所有目标语言。

在这里插入图片描述

此外作者还观察到,多语言翻译的数据甚至可以帮助提高源语言的NER性能。表3总结了上述设置的英语测试数据结果。TgtTran(avg)是分别在三个不同的德语、西班牙语和荷兰语的Tgt-Tran上训练的模型的平均英语结果。En+TgtTran(avg)是将En与三种不同的Tgt-Tran各自组合的平均值。正如从表中所看到的,添加额外的翻译数据可以持续地提高英语NER的性能。特别是,在En + Multi-Tran 取得了最好的性能。因此,也可以使用多语言翻译的数据来提高低资源的单语NER性能。

3.3 Generation-based Multilingual Data Augmentation

本节实验以验证对多语言翻译的数据应用基于生成的数据增强方法是否可以在低资源场景下进一步提高跨语言性能。

Experimental settings: 遵循2.2中描述的步骤,分别在LSTM-LM和mBART的基础上实现所提出的数据增强框架,然后使用它们来增强3.2中处理的数据。将英语gold数据和过滤后的多语言翻译数据连接起来,以训练/微调修改后的LM,其中LSTM-LM从头开始训练,mBART使用mBARTCC25 checkpoint进行微调。mBARTCC25是一个在25种语言上训练的12个编码器和解码器层的模型。按照2.4中描述的步骤对增强的数据进行后处理,并将它们与相应的英语gold和翻译的多语言数据连接起来,以训练NER模型。在每个设置中使用的增强数据的大小与相应的英语gold数据的大小相同。使用MulDA-LSTM和MulDA-mBART分别表示使用LSTM-LM和mBART增强数据的方法。此外,作者还报告了方法的一个双语版本,用BiDA-LSTM表示,它只对英语和翻译的目标语言数据进行数据增强。遵循上述相同的设置来评估在不同数据上训练的NER模型的跨语言性能。

在这里插入图片描述

Results: 表4报告了5次运行的平均结果。请注意,MulDA-LSTM和MulDAmBART在每个设置中为所有目标语言训练一个单一模型,而BiDA-LSTM在每个设置中为每种目标语言训练一个模型。因此,我们只比较了BiDA-LSTM和En+Tgt-Tran。正如我们所看到的,所提出的多语言数据增强方法进一步一致地提高了跨语言的NER性能。对于1k和2k设置,MulDA-LSTM实现了与BiDA-LSTM相当的平均性能。

3.4 Evaluation on More Distant Languages

本节将在更广泛的目标语言上评估所提出的方法。

Experimental settings:

在这些实验中使用了Hu等人处理的维基NER数据。从gold训练数据中抽取1k个英语句子 ( D 1 k S ) (D^S_{1k}) (D1kS),以模拟低资源场景。作者还假设MT模型并不适用于所有的目标语言,所以只将抽样的英语句子翻译为6种目标语言:ar、fr、It、ja、tr和zh。 D t r a n s T D^T_{trans} DtransT通过2.1中所述的步骤来表示翻译后的目标语言句子。低质量的翻译句子以与3.2相同的方式被过滤掉。为了在半监督设置下评估本文方法,作者还从6种目标语言的训练数据中抽取5000个句子,然后删除NER标签,创建未标记的 D u n l a b e l e d T D^T_{unlabeled} DunlabeledT。按照2.3中描述的步骤,用一个 { D 1 k S , D t r a n s T } \{D^S_{1k},D^T_{trans}\} {D1kS,DtransT}训练的NER模型标注 D u n l a b e l e d T D^T_{unlabeled} DunlabeledT,然后用另外两个在相同数据但不同随机种子训练的NER模型对伪标记数据进行过滤。使用 D s e m i T D^T_{semi} DsemiT来表示用这种半监督方法生成的数据。最后连接 { D 1 k S , D t r a n s T , D s e m i T } \{D^S_{1k}, D^T_{trans}, D^T_{semi}\} {D1kS,DtransT,DsemiT},按照2.2和2.4中的步骤生成 D a u g T D^T_{aug} DaugT的增强数据。利用上述增强数据,对 { D 1 k S , D t r a n s T , D a u g T } \{D^S_{1k}, D^T_{trans}, D^T_{aug}\} {D1kS,DtransT,DaugT}的连接数据进行训练NER模型,以进行跨语言NER评估。作者还在 { D 1 k S , D t r a n s T , D s e m i T } \{D^S_{1k}, D^T_{trans}, D^T_{semi}\} {D1kS,DtransT,DsemiT}上训练了一个NER模型进行比较,表示为弱Tagger。其他设置与上述实验中的设置相同。

在这里插入图片描述

在这里插入图片描述

Results: 从表6可以看出,Tran-Train是从英语翻译得到相应训练数据的6种语言的平均性能。zero-shot是其他目标语言的平均性能。MulDALSTM在跑步训练语言和zero-shot语言上都展示了有希望的性能改进。MulDA-mBART的性能略低,一个可能的原因是在字符级别上标记的句子引入的噪声。作者遵循gold数据格式,在字符级别上标记翻译后的zh和ja序列,这与mBART的预训练方式不一致。每种语言的跨语言NER结果详见表5。

3.5 Case Study
3.5.1 Effectiveness in Label Projection

以往方法的标签投影步骤需要定位实体并确定其边界,这很容易受到词序变化、长实体等诸多问题的影响。本文方法有效地避免了使用占位符的这些问题。在图6所示的两个例子中,Jain等人要么只标记整个实体的一部分,要么错误地将实体分成两个,Li等人在两个例子中错误地将实体分成两个,而本文方法可以正确地映射标签。

在这里插入图片描述

3.5.2 Multilingual Data Augmentation

作者研究了本文多语言数据增强方法生成的数据。在LM训练期间,NER标签可以被视为不同语言之间的共享词汇表。因此,作者发现一些生成的句子包含来自多种语言的标记,这有助于改善跨语言迁移。图7中显示了两个示例。

在这里插入图片描述

4 Related Work

Cross-lingual NER: 人们对跨语言的NER越来越感兴趣。先前的方法可以分为两大类,基于实例的转移和基于模型的转移。基于实例的传输将源语言训练数据翻译为目标语言,然后应用标签投影对翻译后的数据进行注释。一些早期的方法也使用并行语料库来构建目标语言中的伪训练数据,而不是MT。为了最小化资源需求,Mayhew和Xie等人设计的框架仅依赖于单词对单词/短语到短语的翻译。此外,也有很多关于通过附加特征或更好的映射方法来提高标签投影质量的研究。与这些方法不同的是,我们的标记句子翻译方法利用占位符来确定翻译后实体的位置,有效地避免了标签投影过程中的许多问题,如词序变化、实体跨度确定、噪声敏感相似性度量等。

基于模型的转移直接将基于源语言训练的模型应用于目标语言测试数据,这严重依赖于跨语言表征的质量。最近的方法通过微调大规模预训练的多语言LMs实现了显著的性能改进。此外,还有一些方法将基于实例和基于模型的转移结合起来。与这些方法相比,我们的方法利用MT模型和LM为训练数据增加了更多的多样性,并通过对多语言数据上的NER模型进行微调来防止对语言特定的特征的过拟合。

Data augmentation: 数据增强为训练数据增加更多多样性以帮助改进模型泛化,已广泛应用于许多领域,如计算机视觉、语音、NLP等。对于NLP来说,反向翻译是最成功的数据增强方法之一,它将目标语言的单语数据转换为源语言,以生成更多的并行数据用于MT模型训练。其他流行的方法包括同义词替换、随机删除/交换/插入、生成等。数据增强也被证明在跨语言环境中是有用的,但大多数现有方法忽略了这些资源可用时对多语言训练数据的更好利用。

5 Conclusions

本文提出了一个针对低资源跨语言NER的多语言数据增强框架。本文的标记序列转换方法通过在MT过程中利用占位符,有效地避免了许多与标签投影相关的问题。本文的基于生成的多语言数据增强方法生成高质量的合成训练数据,以增加更多的多样性。所提议的框架在各种低资源环境和广泛的目标语言中显示出了令人鼓舞的性能改进。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值