Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction论文解读

Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVyAzQOt-1669002412356)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221118095850193.png)]

paper:[1904.07535] Doc2EDAG: An End-to-End Document-level Framework for Chinese Financial Event Extraction (arxiv.org)

code:dolphin-zs/Doc2EDAG (github.com)

期刊/会议:EMNLP 2019

摘要

大多数现有的事件抽取(EE)方法只提取句子范围内的事件论元。然而,此类句子级事件抽取方法难以处理来自新兴应用程序(如金融、立法、卫生等)的大量文件,其中事件论点总是分散在不同的句子中,甚至在同一个文档中经常同时出现多个此类事件。为了解决这些挑战,我们提出了一种新的端到端模型Doc2EDAG,它可以生成基于实体的有向无环图,以有效地实现文档级事件抽取(DEE)。此外,我们重新设计了一个无触发词的DEE任务,以简化文档级事件标记。为了证明Doc2EDAG的有效性,我们构建了一个大规模的真实世界数据集,其中包括具有上述挑战的中国财务公告。大量实验和综合分析表明Doc2EDAG优于最先进的方法。

1、简介

事件抽取(EE),传统上建模为检测触发词并从纯文本中提取相应的论元,在自然语言处理中发挥着至关重要的作用,因为它可以生成有价值的结构化信息,以促进各种任务,如知识库构建、问题解答、语言理解等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVHru1Ws-1669002412357)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121091223350.png)]

近年来,随着金融、立法、卫生等各个领域的数字化趋势不断上升,事件抽取已经加速这些领域的快速发展。以金融领域为例,持续的经济增长见证了数字金融文件的爆炸式增长,如图1所示的特定股票市场的金融公告,即中国金融公告(ChFinAnn)。在形成金矿的同时,如此大量的公告呼吁事件抽取帮助人们提取有价值的结构化信息,以感知新出现的风险并及时发现盈利机会。

然而,鉴于在金融领域应用事件抽取的必要性,金融文件以及许多其他业务领域中的文件的特定特征给事件抽取带来了两个关键挑战,特别是论元分散和多事件。具体地说,第一个挑战表明,一个事件记录的论元可能分散在文档的多个句子中,而另一个挑战反映了文档可能包含多个这样的事件记录。为了直观地说明这些挑战,我们在图2中展示了一个典型的ChFinAnn文档,其中包含两个股权质押(Equity Pledge)事件记录。对于第一个事件,实体1“[SHARE1]”是句子级别的正确质押(Pledged Shares)股票(ID 5)。然而由于资本存量增加(ID 7),文件级别的正确质押(Pledged Shared)股份应为“[SHARE2]”。同样,“[DA TE3]”在句子级别(ID 9)是正确的结束日期,但在文档级别(ID 10)是不正确的。此外,一些终结性论点,如“[SHARE5]”和“[RA TIO]”,通常在文件末尾说明。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KaUCrNZD-1669002412358)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121091653127.png)]

尽管大量的研究者将经历聚焦在事件抽取,大多数的工作仍然放在ACE2005这个数据集上,一个专家标注的基准,它只标记句子范围内的事件论元。我们将这种任务称为句子级事件抽取(SEE),它显然忽略了分散论元的挑战。相比之下,财务文件上事件抽取,如ChFinAn,在面对分散的论元时需要文档级事件抽取(DEE),而这一挑战在与多事件相结合时变得更加困难。

最近的工作DCFEE试图通过使用远程监督(DS)生成事件抽取数据并执行两阶段提取来探索ChFinAnn上的文件级事件抽取:1)SEE的序列标记模型;2)检测关键事件句子的关键事件句子检测模型,再加上一种启发式策略,从周围的句子中填充缺失的论元。然而,SEE的序列标记模型无法正确地处理多事件句子,更糟糕的是,上下文无关的论元完成策略无法有效解决论点分散的挑战。

在本文中,我们提出了一种新的端到端模型Doc2EDAG,以解决DEE的独特挑战。Doc2EDAG的关键思想是将事件表转换为基于实体的有向无环图(EDAG)。EDAG格式可以将表格填充任务转换为几个更易于处理的顺序路径扩展子任务。为了有效地支持EDAG生成,Doc2EDAG使用文档级上下文对实体进行编码,并设计用于路径扩展的内存机制。此外,为了简化基于DS的文档级事件标记,我们提出了一种新的DEE形式化,该形式化去除了触发词标记,并将DEE视为基于文档的直接填充事件表。这种无触发词设计不依赖于任何预定义的触发词集或启发式方法来过滤多个候选触发词,并且仍然完全符合DEE的最终目标,即将文档映射到底层事件表。

为了评估我们提出的Doc2EDAG的有效性,我们在由大规模财务公告组成的真实世界数据集上进行了实验。与DCFEE使用的数据集(其中97%的文档仅包含一个事件记录)相比,我们的数据集要大十倍,其中约30%的文档包含多个事件记录。额外的实验表明,Doc2EDAG在特定领域事件抽取任务中能显著地超过其他最优的方法。

总的来说,我们的贡献为以下几点:

  • 我们提出了一种新的模型Doc2EDAG,它可以基于文档直接生成事件表,以有效地解决DEE的独特挑战。
  • 我们在无触发词的情况下对DEE任务进行了改革,以简化基于DS的文档级事件标记。
  • 我们为DEE构建了一个大规模的真实世界数据集,具有独特的论点分散和多事件挑战,在其上进行的大量实验证明了Doc2EDAG的优越性。

注意,尽管我们在这项工作中关注ChFinAnn数据,但我们在没有任何领域特定假设的情况下解决了这些文档级事件抽取特定的挑战。因此,我们的通用标签和建模策略可以直接帮助许多其他面临类似挑战的业务领域,例如从法律文件中提取犯罪事实和判决、从医疗报告中识别疾病症状和医生指示等。

2、相关工作

信息抽取的最新发展在构建联合模型方面取得了进展,该模型可以同时抽取实体并识别其中的结构(关系或事件)。例如,专注于联合抽取实体和实体间关系。同时,与本文的重点相同,一些研究旨在设计实体和事件抽取的联合模型,例如基于手工特征的模型和基于神经网络的模型。然而,这些模型并没有展示如何处理超出句子范围的候选论元。声称以定义明确的特征为前提处理跨句子的事件-论元关系,不幸的是,这是不平凡的。

除了建模挑战之外,事件抽取普及化的另一大障碍是由于获取专家标注的巨大成本而缺乏训练数据。为了解决这一问题,一些研究试图将远程监督(DS)应用于事件抽取设置,因为DS通过使用知识库自动生成用于关系提取的训练数据显示出了很有前景的结果。然而,普通事件抽取需要事实知识库中缺少的触发词。因此,使用语言资源或预定义词典来标记触发词。另一方面,最近的另一项研究表明,直接标记事件论元而不使用触发词也是可行的。然而,他们只考虑句子级事件抽取设置,他们的方法不能直接扩展到文档级事件抽取设置,这是本工作的主要重点。

传统上,当将DS应用于关系提取时,研究人员付出了巨大的努力来缓解标签噪声。相反,这项工作表明,将DS与一些简单的约束相结合可以获得相当好的DEE标签质量,原因有两个方面:1)知识库和文本文档都来自同一领域;2) 一个事件记录通常包含多个论元,而一个公共关系事实只包含两个实体。

3、Preliminaries

我们首先澄清了几个关键概念:1)实体提及:实体提及是指实体对象的文本跨度;2) 事件角色:事件角色对应于事件表的预定义字段;3) 事件论元:事件论元是扮演特定事件角色的实体;4) 事件记录:事件记录对应于事件表的一个条目,并包含几个具有所需角色的论元。例如,图2显示了两个事件记录,其中实体“[PER]”是一个具有认捐者角色的事件论元。

为了更好地阐述和评估我们提出的方法,我们在本文中利用了ChFinAnn数据。ChFinAnn文件包含中国股市上市公司的第一手官方披露,有数百种类型,如年度报告和盈利预测。在这项工作中,我们将重点放在那些频繁、有影响力且主要由自然语言表达的事件相关事件上。

4、文档级事件标注

作为DEE的先决条件,我们首先在文档级别进行基于DS的事件标记。更具体地说,我们将事件知识库中的表格记录映射到文档文本,并将匹配良好的记录视为该文档所表示的事件。此外,我们采用了无触发词设计,并相应地改进了一个新的DEE任务,以实现端到端模型设计。

事件标注。为了确保标记质量,我们为匹配的记录设置了两个约束:1)预定义的关键事件角色的论元必须存在(非关键事件角色可以为空);2)匹配的论元的数量应该高于某个阈值。这些约束的配置是特定于事件的,在实践中,我们可以调整它们以直接确保文档级别的标签质量。我们将满足这两个约束条件的记录视为匹配良好的记录,这些记录作为远距离监督的基本事实。除了标记事件记录之外,我们还将论元的角色分配给匹配的token作为token级实体标记。请注意,我们没有显式标记触发词。除了不影响DEE功能之外,这种无触发词设计的另一个好处是基于DS的标签更加容易,不依赖预定义的触发词词典或手动策划的启发式方法来过滤多个潜在的触发词。

无触发词的DEE任务。我们对DEE的一项新任务进行了改进,即基于文档直接填充事件表,这通常需要三个子任务:1)实体抽取,抽取实体提及作为论元候选词,2)事件检测,判断每个事件类型的文档是否被触发,3)事件表填充,将论元填充到触发事件表中。这种新颖的DEE任务与带有触发词的普通SEE有很大不同,但与上述简化的基于DS的事件标记一致。

5、Doc2EDAG

Doc2EDAG的关键思想是将表格事件记录转换为EDAG,并让模型学习基于文档级上下文生成EDAG。按照图2的示例,图3通常描述了EDAG生成过程,图4显示了Doc2EDAG的总体工作流程,其中包括两个关键阶段:文档级实体编码,实体有向无环图(EDAG)生成。在本节详细介绍它们之前,我们首先描述两个预处理模块:输入表示和实体识别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-II74c3Qg-1669002412359)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121095233728.png)]

输入表征。在本文中,我们将文档表示为一个句子序列。正式地,在查找token嵌入表 V ∈ R d w × ∣ V ∣ V \in \R^{d_w \times |V|} VRdw×V之后,我们将文档 d d d表示为一个句子序列 [ s 1 ; s 2 ; ⋅ ⋅ ; s N s ] [s1;s2;··;s_{N_s}] [s1;s2;⋅⋅;sNs],每个句子 s i ∈ R d w × N w s_i \in \R^{d_w \times N_w} siRdw×Nw都是由符号嵌入序列 [ w i , 1 , w i , 2 , . . . , w i , N w ] [w_{i,1},w_{i,2},...,w_{i,N_w}] [wi,1,wi,2,...,wi,Nw]组成,其中 ∣ V ∣ |V| V是词汇大小, N s N_s Ns N w N_w Nw分别是句子序列和符号序列的最大长度, w i , j ∈ R d w w_{i,j} \in \R^{d_w} wi,jRdw是嵌入大小为 d w d_w dw的第 i i i个句子中第 j j j个token的嵌入。

实体识别。实体识别是典型的序列标记任务。我们在句子级别执行这项任务,并遵循经典方法BI-LSTM-CFR,该方法首先编码token序列,然后添加条件随机场(CRF)层以促进序列标记。唯一的区别是我们使用了Transformer,而不是原始编码器LSTM。Transformer通过多头自注意机制对一系列嵌入进行编码,以在它们之间交换上下文信息。由于Transformer的先进性能,我们将其用作本工作中的主要上下文编码器,并将本阶段使用的Transformer模块命名为Transformer-1。对于每一个句子 s i ∈ R d w × N w s_i \in \R^{d_w \times N_w} siRdw×Nw,我们获得句子的编码向量 h i = T r a n s f o r m e r − 1 ( s i ) h_i=Transformer-1(s_i) hi=Transformer1(si),其中 h i ∈ R d w × N w h_i \in \R^{d_w \times N_w} hiRdw×Nw共享相同的嵌入大小 d w d_w dw,序列长度 N w N_w Nw。在训练期间,我们使用经典BIO(Begin,Inside,Other)标注方案将匹配论元的角色用作实体标签,并用CRF层包装 h i h_i hi,以获得实体识别损失 L e r L_er Ler。至于推理,我们使用维特比解码来获得最佳标记序列。

5.1 文档级实体编码

为了有效解决论元分散的挑战,必须利用全局上下文来更好地识别实体是否扮演特定的事件角色。因此,我们利用文档级实体编码来编码具有这种上下文的抽取的实体提及,并为具有不同表面名称的每个实体提及生成大小为 d w d_w dw的嵌入。

实体和句子嵌入。由于实体提及通常包含多个长度可变的token,我们首先通过对其覆盖的token嵌入执行最大池化操作,为每个实体提及获得固定大小的嵌入。例如,给定第 l l l个实体提及覆盖第 i i i个句子的第 j j j个到第 k k k个标记,我们对 [ h i , j , . . . , h i , k ] [h_{i,j},...,h_{i,k}] [hi,j,...,hi,k]进行最大池化,以获得实体提及嵌入 e l ∈ R d w e_l \in \R^{d_w} elRdw。对于每个句子 s i s_i si,我们还对编码的标记序列 [ h i , 1 , . . . , h i , N w ] [h_{i,1},...,h_{i,N_w}] [hi,1,...,hi,Nw]进行最大池化运算,以获得单个句子嵌入 c i ∈ R d w c_i \in \R^{d_w} ciRdw。在这些操作之后,提及和句子嵌入共享相同的嵌入大小 d w d_w dw

文档级编码。尽管我们得到了所有句子和实体提及的嵌入,但这些嵌入只编码句子范围内的局部上下文。为了能够感知文档级上下文,我们使用了第二个Transformer模块Transformer-2,以促进所有实体提及和句子之间的信息交换。在将它们输入Transformer-2之前,我们将它们与句子位置嵌入一起添加,以告知句子顺序。在Transformer编码之后,我们再次利用最大池操作将具有相同实体表面名称的多个提及嵌入合并到单个嵌入中。从形式上讲,在这个阶段之后,我们获得了文档级上下文实体提及和句子嵌入,分别为 e d = [ e 1 d , . . . , e N e d ] e^d=[e_1^d,...,e_{N_e}^d] ed=[e1d,...,eNed] c d = [ c 1 d , . . . , c N s d ] c^d=[c_1^d,...,c_{N_s}^d] cd=[c1d,...,cNsd],其中 N e N_e Ne是不同实体表面名称的数量。这些聚合嵌入为下一阶段直接填充事件表提供了服务。

5.2 EDAG 生成

在文档级实体编码阶段之后,我们可以获得文档嵌入 t ∈ R d w t \in \R^{d_w} tRdw通过对句子张量 c d ∈ R d w × N s c^d \in \R^{d_w \times N_s} cdRdw×Ns进行最大池化运算,并在 t t t上堆叠线性分类器,以对每个事件类型进行事件触发词分类。接下来,对于每个触发词事件类型,我们学习生成EDAG。

EDAG 构建。在模型训练之前,我们需要根据表格事件记录构建EDAG。对于每种事件类型,我们首先手动定义一个事件角色顺序。然后,我们按照这个顺序将每个事件记录转换为论元的链接列表,其中每个论元节点要么是实体,要么是特殊的空论元NA。最后,我们通过共享相同的前缀路径将这些链接列表合并到EDAG中。由于EDAG的每个完整路径都对应于事件表的一行,因此从给定EDAG恢复表格式很简单。

任务分解。EDAG格式旨在将硬表填充任务简化为几个可处理的路径扩展子任务。然后,一个自然的问题是任务分解是如何工作的,这可以通过以下EDAG恢复过程来回答。假设事件触发词作为起始节点(初始EDAG),则会出现一系列路径扩展子任务,遵循预定义的事件角色顺序。当考虑某个角色时,对于当前EDAG的每个叶节点,都有一个路径扩展子任务,它决定要扩展哪些实体。对于要扩展的每个实体,我们为当前角色创建该实体的新节点,并通过将当前叶节点连接到新实体节点来扩展路径。如果没有实体可以扩展,我们将创建一个特殊的NA节点。当前角色的所有子任务完成后,我们将转到下一个角色并重复直到最后一个角色。在这项工作中,我们利用上述逻辑在推断时从路径扩展预测中恢复EDAG,并在训练时为每个子任务设置相关标签。

记忆存储。为了更好地完成每个路径扩展子任务,了解路径中已经包含的实体至关重要。因此,我们设计了一种记忆机制,该机制在开头用句子张量 c d c^d cd初始化记忆张量 m m m,并在扩展路径时通过附加相关实体嵌入或NA论元的零填充嵌入来更新 m m m。通过这种设计,每个子任务可以拥有一个不同的记忆张量,对应于唯一的路径历史。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGwRjLdC-1669002412359)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121103936478.png)]

路径扩展。对于每个路径扩展子任务,我们将其形式化为多个二分类问题的集合,即预测所有实体的扩展(1)或不扩展(0)。为了能够感知当前路径状态、历史上下文和当前事件角色,我们首先将内存张量 m m m和实体张量 e d e^d ed连接起来,然后将它们与可训练的事件角色指示符嵌入一起添加,并使用第三个Transformer模块Transformer-3对它们进行编码,以促进上下文感知推理。最后,我们从Transformer-3的输出中提取丰富的实体张量 e r e^r er,并在 e r e^r er上堆叠线性分类器以进行路径扩展分类。

优化。对于事件触发词分类,我们计算交叉熵损失值 L t r L_tr Ltr。在EDAG生成期间,我们计算每个路径扩展子任务的交叉熵损失,并将这些损失相加为最终EDAG生成损失 L d a g L_{dag} Ldag。最后,我们将 L t r L_tr Ltr L d a g L_{dag} Ldag和实体识别损失 L e r L_{er} Ler相加作为最终损失, L a l l = λ 1 L e r + λ 2 L t r + λ 3 L d a g L_{all}=\lambda_1 L_{er}+\lambda_2 L_{tr} + \lambda_3 L_{dag} Lall=λ1Ler+λ2Ltr+λ3Ldag,其中 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 λ 3 \lambda_3 λ3是超参数。

推理。给定一个文档,Doc2EDAG首先从句子中识别实体提及,然后使用文档级上下文对其进行编码,最后通过执行一系列路径扩展子任务为每个触发词事件类型生成EDAG。

使用技巧。在训练过程中,我们可以使用正确标注实体token和给定的EDAG结构。在推断时,我们需要首先识别实体,然后根据这些实体的嵌入顺序扩展路径,以恢复EDAG。训练和推理之间的这种差距会导致严重的错误传播问题。为了缓解这些问题,我们利用计划抽样逐步将文档级实体编码的输入从正确标注实体提及切换到模型识别的实体提及。此外,对于路径扩展分类,误报比真正的错误更有害,因为前者可能导致完全错误的路径。因此,我们可以将 γ ( > 1 ) γ(>1) γ(>1)设置为相关交叉熵损失的负类权重。

6、实验

在本节中,我们提出了彻底的实证研究,以回答以下问题:1)Doc2EDAG在面临DEE特定挑战时,能在多大程度上优于现有技术方法?2) 当面对争论分散和多事件挑战时,不同的模型如何表现?3) Doc2EDAG的各个组件有多重要?

6.1 实验设置

带有事件标签的数据收集。我们利用十年(2008-2018年)的ChFinAnn4文档和人类总结的事件知识库进行基于DS的事件标记。我们关注五种事件类型:股权冻结(EF)、股权回购(ER)、股权减持(EU)、股权超重(EO)和股权质押(EP),这些事件属于监管机构要求披露的重大事件,可能对公司价值产生巨大影响。为了确保标签质量,我们为匹配的文档记录对设置约束在第4节中描述的。此外,我们直接使用字符标记化来避免来自中文分词工具的错误传播。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXIixEX5-1669002412360)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121112726785.png)]

数据质量。为了验证基于DS的事件标记的质量,我们随机选择100个文档并手动标注它们。通过将DS生成的事件表视为预测,将人类标注的事件表作为基本事实,我们基于下面介绍的度量来评估标记质量。表2显示了这种近似评估,我们可以观察到DS生成的数据非常好,实现了高精度和可接受的召回。在以后的实验中,由于自动生成的测试集覆盖范围很广,我们直接使用它进行评估。

评估指标。DEE的最终目标是用每个角色的正确论元填充事件表。因此,我们通过直接比较每种事件类型的预测事件表和基本事实表来评估DEE。具体来说,对于每个文档和每个事件类型,我们从关联的事件表中选择一个预测记录和一个最相似的标注记录(至少其中一个是非空的),而不进行替换,以计算特定于事件角色的真阳性(TP)、假阳性(FP)和假阴性(FN)统计数据,直到没有记录留下。在所有评估文档中汇总这些统计数据后,我们可以计算角色级别的准确度(precision)、召回率(recall)和F1-score(均以百分比格式报告)。由于事件类型通常包括多个角色,我们计算micro 平均角色级别分数,作为直接反映端到端DEE能力的最终事件级别度量。

超参数设置。对于输入,我们将最大句子数和最大句子长度分别设置为64和128。在训练期间,我们设置了λ1=0.05,λ2=λ3=0.95和γ=3。我们使用Adam优化器,学习率为1e−4,训练最多100个时期,并根据开发集上的验证分数选择最佳时期。此外,我们利用非空参数比率的递减顺序作为Doc2EDAG所需的事件角色顺序,因为路径历史中更多的信息实体可以更好地促进后续的路径扩展分类。

注意,由于篇幅限制,我们将其他详细的超参数、模型结构、数据预处理配置、事件类型规范和EDAG生成的伪代码留在附录中。

6.2 效果对比

Baselines

  • DCFEE
  • Doc2EDAG

主要的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aBuu0hD-1669002412361)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121113618091.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcZzGami-1669002412362)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121113633454.png)]

消融实验

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IY2b8z4u-1669002412363)(Doc2EDAG An End-to-End Document-level Framework for Chinese Financial Event Extraction.assets/image-20221121113645485.png)]

案例分析:让我们按照图2中的示例,Doc2EDAG可以成功地恢复正确的EDAG,而DCFEE即使使用完美的SEE模型也不可避免地会犯许多错误,如引言中所讨论的。由于篇幅的限制,我们在附录中留下了另外三个细粒度的案例研究。

7、总结和未来工作

针对DEE的端到端建模,我们提出了一种新的模型Doc2EDAG,该模型与一种新任务形式化相关联,无需触发词,以简化基于DS的标记。为了验证所提出方法的有效性,我们在金融领域构建了一个大规模的真实世界数据集,并进行了广泛的实证研究。值得注意的是,在没有任何特定领域假设的情况下,我们的通用标签和建模策略可以直接使其他领域的从业者受益。

由于这项工作显示了端到端DEE的有希望的结果,因此将Doc2EDAG的输入从纯文本序列扩展到格式丰富的序列非常有吸引力,我们将其作为未来的工作来探索。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trouble..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值