Document Modeling with Gated Recurrent Neural Network for Sentiment Classification (EMNLP 2015)

基于门控循环神经网络的文本情感分类建模

Gated Recurrent Neural Network(Gated RNN):

​    simple RNN 具有梯度消失或者梯度爆炸的特点,所以,在实际应用中,带有门限的RNN模型变种(Gated RNN)起着至关重要的作用

GRNN:广义回归神经网络

Abstract

​    引入了一个神经网络,以统一的,自底向上的方式来学习基于向量的文本表示方法。该模型首次使用CNN/LSTM来学习句子表示。利用Gated RNN自适应地对句子的语义及其之间关系进行编码。

文本表示(Document Represen-tation):对文本进行预处理,抽取能表达文本主题内容的特征,并将这些特征用结构化的形式保存起来,形成文本的中间表示形式

​    对来自IMDB和Yelp Dataset Challenge的4个大型评论数据集进行了文本情感分类。实验表明,Gated RNN在文本情感分类方面明显优于RNN

Introduction

​    文本分类是NLP情感分析的基础任务,在此之前的文献中,主流的方法是利用机器学习算法构建分类器,专注于手工提取的特征值或学习从数据中区分特征,模型的性能严重依赖数据的选择。

​    文本情感分类仍存在一个重要的挑战:如何表达句子上下文之间内在的语义或语法关系。上下文关系对情感的分类至关重要,因为例如“contract”和“cause“这样的关系对确定文本的意义和总体极性(积极 或 消极)很重要。Pang(2002)和Wang、Manning(2012)使用bag-of-ngrams表示文本特征,并在此基础上构建SVM分类器。尽管这些特征驱动的SVM性能很强,但是在考虑句子之间关系时显得力不从心。

N-gramn元语法 指文本中连续出现的n个语词。n元语法模型是基于(n - 1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构。

n-gram 中如果n=1则为unigram,n=2则为bigram,n=3则为trigram。n>4后,则直接用数字指称,如4-gram,5gram。

示例:以 I will go to United States. 这句话为例。bigram为:

I will

will go

go to

to United

United States

​    文章介绍了一种能够学习连续文本的神经网络,来用于情感分类。该方法基于组合性原则:较长的表达式的意义取决于其组成部分的意义。共分为两个部分对文本进行建模。

组合性原则 :复杂的表达式的意义完全由它的结构,以及它的组成部分的意义决定,所以一旦我们将部分的意义和它们如何进行组合的,放在一起,我们没有任何余地完全说明了整个表达式的意义。

1636009838116

​    第一步利用CNN/LSTM从单词表示中生成句子表示,然后利用Gated RNN自适应地对文本表示中句子的语义及其内在关系进行编码。这些文本表示很自然地被用作对每个文本进行情感标签分类的特征。整个模型采用随机梯度下降进行端到端训练,其中的loss为有监督的情感分类的交叉熵误差。

交叉熵误差

E = − ∑ k t k ln ⁡ y k E=-\sum_k{t_k}\ln{y_k} E=ktklnyk

y k y_k yk 是神经网络的输出, t k t_k tk是正确解标签。并且, t k t_k tk中只有正确解标签的索引为1,其他均为 0(one-hot 表示)。因此,实际上只计算对应正确解 标签的输出的自然对数。

​    作者对比了一些其他的模型,例如paragraph vector(doc2vec),CNN,baselines(例如,基于特征的SVM和推荐算法JMARS)。结果表明,(1)该模型性能优于所有baseline算法(2)在文本建模方面,Gated RNN明显优于标准RNN。

几种文本表示方法

  • 传统非NN方法:

- one hot encoding:

​    入门级文本表示方法,应用词袋模型(BOW)+ TF-IDF技术,优点是简单粗暴配合LR效果也不赖,缺点也明显,维度太高且有词义鸿沟问题,不适合大语料。

- 主题模型系列:

- LSA/LSI等,将文档为行,词为列,表示成“文档-词”大矩阵,利用SVD矩阵分解的实现技术,训练得到词和文档的特征向量,有点儿像推荐里的隐语义模型了,模型忽略了语序,更注重主题相关,适合长文本,实际使用效果还不错。
    - LDA,比较适合长文本表示,不太适合短文本表示。LDA属于一种文档主题生成模型,引用其他博客的话:“LDA认为一篇文档的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到的,文档到主题服从多项式分布,主题到词语服从多项式分布”。

  • NN方法(word-embedding):

- word2vec+TF-IDF:

​    虽然word2vec非DNN系列,但其训练词向量效率和效果均表现不俗。首先通过word2vec训练词向量,再通过简单的词加权/关键Tag加权/TF-IDF加权平均得到文档向量表示。在加权之前做停用词剔除、词聚类等预处理是个不错的选择。缺点:短文本效果较好,长文本效果不好。

- doc2vec(paragraph vector):

​    doc2vec在word2vec基础上增加了个段落向量,能直接训练处(段落)文档向量,在实际使用中,貌似效果一般,特别是长文本NLP相关任务。

- WMD

- glove

参考:https://blog.csdn.net/cht5600/article/details/53381364

paragraph vector论文来源:《Distributed Representations of Sentences and Documents 》

​    文章做的几项工作:

  1. 文章提出了一种神经网络方法来编码文档表示中句子之间的关系,用于情感分类。
  2. 文章证实:从四个大规模数据集的结果来看,该方法优于当时最新的文本情感分类方法。
  3. 文章证实:传统的RNN在文本构成建模面存在不足,而加上neural gates大大提高了分类性能。
The Approach

​    文章里的方法是基于组合性原则对文本语义进行建模。由于文本由一个句子列表组成,而每个句子又由一个单词列表组成,因此该方法分为两个阶段对文本表示进行建模。首先,将句子里的词生成连续的句子向量,然后,将句子向量作为文本组成的输入,得到文本表示,使用文本表示作为文本情感分类的特征。

​    首先描述了单词向量的表示,然后提出了一个具有多个过滤器的CNN用于句子的组成。每个词都被表示为一个低维的、连续的、实值的向量,也被称为词嵌入(word embedding)。所有词向量都被堆叠在一个word embedding矩阵中
L w ∈ R d × ∣ V ∣ L_w∈R^{d\times|V|} LwRd×V
d表示单词向量的维数,|V|为词汇量

这些词向量使用嵌入学习算法从文本语料中预训练,以更好地利用词汇的语义和单词的语法联系。

​    本文利用CNN/LSTM计算具有语义的连续句子表示,然后使用CNN/LSTM为不同长度的句子生成固定长度的向量,并捕获句子中的单词顺序,也不依赖外部依赖或句法分析的结果。也可以使用基于树的合成算法作为替代,例如RNTNs或树结构LSTM。

RNTNs(递归神经张量网络) :可以将任意长度的短语作为输入,通过词向量和解析树来表示短语,然后通过使用相同的基于张量的组合函数来计算得到更高的结点。

RNTN论文来源 :《Recursive Deep Models for Semantic Compositionality Over a Semantic Treebank》

​    文章尝试使用多个不同宽度的卷积过滤器来生成句子表示(如图二),使用多个卷积过滤器来捕获不同粒度n-gram的局部语义。例如,宽度为2的过滤器基本上可以捕获句子中bigram的语义。在这里使用三个宽度分别为1,2,3的过滤器来编码句子中单字,双字和三字的语义。

1636274913827

​        每个过滤器由一系列带有共享参数的线性层组成。在形式上,将有n个单词的句子表示为

{ W 1 , W 2 , W 3 , W 4 , . . . , W n W_1,W_2,W_3,W_4,...,W_n W1,W2,W3,W4,...,Wn},设 l c l_c lc为过滤器的宽度,设 W c , b c W_c,b_c Wc,bc为过滤器中线性层的共享参数。每个单词 W i W_i Wi都映射到它的嵌入表示中: e i ∈ R d e_i∈R^d eiRd。线性层的输入是word embedding在定长窗口大小 l c l_c lc的concat(The input of a linear layer is the concatenation of word embeddings in a
fixed-length window size l c l_c lc),表示为
I c = [ e i ; e i + 1 ; . . . ; e i + l c − 1 ] ∈ R d ⋅ l c I_c=[e_i;{e_{i+1}};...;e_{i+l_c-1}]∈R^{d·l_c} Ic=[ei;ei+1;...;ei+lc1]Rdlc
线性层的输出为
O c = W c ⋅ I c + b c O_c=W_c·I_c+b_c Oc=WcIc+bc
其中 W c ∈ R l o c × d ⋅ l c W_c∈R^{l_{oc}×{d·l_c}} WcRloc×dlc b c ∈ R l o c b_c∈R^{l_{oc}} bcRloc l o c l_{oc} loc是线性层的输出长度。为取得一个句子的全局语义,将线性层的输出提供给平均池化层,,从而得到一个固定长度的输出向量。

池化层 :除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,

目前主要有两种(平均法,最大法),其中最大值池化是使用最多的方式。

最大池化(MaxPooling)

平均池化(AveragePooling)

全局最大池化(GlobalMaxPooling)

全局平均池化(GlobalAveragePooling)

​    先举一个池化层的例子,然后我们再讨论池化层的必要性。假如输入是一个 4×4 矩阵,
用到的池化类型是最大池化( max pooling)。执行最大池化的树池是一个 2×2 矩阵。执行过
程非常简单,把 4×4 的输入拆分成不同的区域,我把这个区域用不同颜色来标记。对于 2×2
的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

1636341082545

​    左上区域的最大值是 9,右上区域的最大元素值是 2,左下区域的最大值是 6,右下区域的最大值是 3。为了计算出右侧这 4 个元素值,我们需要对输入矩阵的 2×2 区域做最大值
运算。这就像是应用了一个规模为 2 的过滤器,因为我们选用的是 2×2 区域,步幅是 2,这
些就是最大池化的超参数。

​    因为我们使用的过滤器为 2×2,最后输出是 9。然后向右移动 2 个步幅,计算出最大值
2。然后是第二行,向下移动 2 步得到最大值 6。最后向右移动 3 步,得到最大值 3。这是一
个 2×2 矩阵,即𝑓 = 2,步幅是 2,即𝑠 = 2。

1636341290569

此例中为3×3矩阵,步幅为1,所以超参数 f = 3 , s = 1 f=3,s=1 f=3,s=1

​    本文进一步加入了tanh函数来融合点态非线性特征(to incorporate pointwise nonlinearity),并对多个过滤器的输出进行平均,得到句子表示。

​    将得到的句子向量输入到文档组成组件中来计算整个文档的表示形式。给定可变长度的句子向量作为输入,文档组合生成一个固定长度的文档向量作为输出。

​    一个简单的方法是忽略句子顺序,然后将句子向量的平均作为文档向量。尽管这样的计算效率很高,但没有考虑到句子之间复杂的语义关系。CNN是一种文档合成的替代方法,利用线性层共享参数来对局部句子关系进行建模。

*CNN论文来源:《Modelling, Visualising and Summarising Documents with a Single Convolutional Neural Network》*https://arxiv.org/abs/1406.3830

模型基于扩展的动态CNN,该模型在句子和文档水平上学习卷积过滤,层级化地学习和描述低水平的词典特征到高水平的语义概念

​    标准RNN可以通过将当前句子向量 s t s_t st与上一步的 h t − 1 h_{t-1} ht1的输出向量递归地转换来将变长句子的向量映射到定长句子。
h t = t a n h ( W r ⋅ [ h t − 1 ; s t ] + b r ) h_t=tanh(W_r·[h_{t-1};s_t]+b_r) ht=tanh(Wr[ht1;st]+br)
其中 W r ∈ R l h × ( l h + l o c ) W_r∈R^{l_h×(l_h+l_{oc})} WrRlh×lh+loc b r ∈ R l h b_r∈R^{l_h} brRlh l h l_h lh l o c l_{oc} loc分别问隐藏向量和句子向量的维度。

​    可是标准CNN存在梯度消失和梯度爆炸的问题,其中梯度在长序列上按指数增长或衰减。为了解决这一问题,本文开发了一种用于文档合成的Gated RNN,以一种循序渐进的方式自适应地对文档表示中的句子语义编码。Gated RNN所使用的转换函数如下所示:
i t = s i g m o i d ( W i ⋅ [ h t − 1 ; s t ] + b i ) i_t=sigmoid(W_i·[h_{t-1};s_t]+b_i) it=sigmoidWi[ht1;st]+bi

f t = s i g m o i d ( W f ⋅ [ h t − 1 ; s t ] + b f ) f_t=sigmoid(W_f·[h_{t-1};s_t]+b_f) ft=sigmoidWf[ht1;st]+bf

g t = t a n h ( W r ⋅ [ h t − 1 ; s t ] + b r ) g_t=tanh(W_r·[h_{t-1};s_t]+b_r) gt=tanhWr[ht1;st]+br

h t = t a n h ( i t ⊙ g t + f t ⊙ h t − 1 ) h_t=tanh(i_t{\odot}g_t+f_t{\odot}h_{t-1}) ht=tanh(itgt+ftht1)

其中 ⊙ \odot 表示对应位置元素相乘, W i , W f , b i , b f W_i,W_f,b_i,b_f WiWfbibf自适应地选择和删除历史向量和输入向量进行语义合成。

1636444934566

​    图三(a)给出了一种标准的顺序方法,最后一个隐藏向量作为情感分类的文档表示。本文进行了进一步的扩展,将隐藏向量的平均作为文档表示(b),这可以考虑到不同粒度的历史语义层次。还可以更进一步将文档表示输入前向和后向的Gated RNN。

​    在没有进行特征工程的情况下,将组合起来的文档表示文档的特征进行情感分类。首先,先添加一个线性层将文档向量转换为长度是类数C的实值向量,然后添加一个 s o f t m a x softmax softmax层将实值向量转化为条件概率,计算如下:
P i = e x p ( x i ) ∑ i ‘ = 1 C e x p ( x i ‘ ) P_i=\frac{exp(x_i)}{\sum^C_{i`=1}exp(x_{i`})} Pi=i=1Cexp(xi)exp(xi)
​    文章进行有监督的学习,其中训练数据中的每个文档都有正确情绪标签(gold sentiment label)。在模型训练中,文章使用正确情绪分布 P g ( d ) P^g(d) Pg(d)和预测情绪分布 P ( d ) P(d) P(d)的交叉熵误差作为损失函数。
l o s s = − ∑ d ∈ T ∑ i = 1 C P i g ( d ) ⋅ l o g ( P i ( d ) ) loss=-\sum_{d∈T}\sum^C_{i=1}P^g_i(d)·log(P_i(d)) loss=dTi=1CPig(d)log(Pi(d))
其中T为训练数据,C为类数,d为文档表示, P g ( d ) P^g(d) Pg(d)为1 of k编码方案,其维数与类数相同,且只有正确的标注的维数才是1,其他的全是0。

**one-hot编码:**又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

1636457628698

**1 of k编码(哑编码):**哑变量编码直观的解释就是任意的将一个状态位去除。还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。

1636457638554

然后通过反向传播对整个参数集求损失函数的导数,使用随机梯度下降算法更新参数。
θ = [ W c ; b c ; W i ; b i ; W f ; b f ; W r ; b r ; W s o f t m a x ; b s o f t m a x ] \theta=[W_c;b_c;W_i;b_i;W_f;b_f;W_r;b_r;W_{softmax};b_{softmax}] θ=[Wc;bc;Wi;bi;Wf;bf;Wr;br;Wsoftmax;bsoftmax]
​    设三个过滤器的宽度为1、2、3,过滤器的输出长度为50,分别在每个数据集上使用SkipGram进行200维的词嵌入,随机初始化均匀分布的其他参数U(-0.01,0.01),并设置学习率为0.03。

Experiment

​    文章使用了来自IMDB的一个电影评论数据集和来自Yelp dataset Challenge(2013年、2014年和2015年)的三个餐厅评论数据集。文章没有考虑评分和文本不匹配的情况。统计信息见表一。在IMDB数据集上,随机选择了5万部电影,并抓取它们的所有评论。只保留那些带有用户评级的评论(从0到10),删除评论少于2条的用户,然后删除评论少于2条的电影。

IMDB数据集处理方法来源:《Jointly Modeling Aspects, Ratings and Sentiments
for Movie Recommendation》

将Yelp数据集分割为训练集、开发集和测试集,比例为8/1/1。使用Stanford CoreNLP标记数据和拆分句子,使用accuracy(准确率)和MSE作为评价指标。

**Stanford CoreNLP:**是一个自然语言处理工具包。它集成了很多非常实用的功能,包括分词,词性标注,句法分析等等。这不是一个深度学习框架,而是一个已经训练好的模型。

1636447807374

**准确率(Accuracy):**分类问题中最基本的评价指标,正确分类样本所占的比列,即正确分类的测试样本/全部测试样本。优点:计算简单,易于理解/即可以用于二分类,也可以用于多分类。缺点:当数据不均衡时,无法很好的衡量分类器的好坏。

**精确率(Precision):**准确率的分母是所有被分为正类的所有测试样本,分子是被分为正类测试样本中,真正是正类的测试样本数量。只能用于二分类(多分类时,只能两两计算,然后求平均)
被 预 测 为 正 类 的 测 试 样 本 中 真 正 是 正 类 的 测 试 样 本 ( 正 确 中 的 正 类 ) 所 有 被 预 测 为 正 类 的 测 试 样 本 ( 既 包 括 预 测 正 确 的 也 包 括 预 测 错 误 的 ) \frac{被预测为正类的测试样本中真正是正类的测试样本(正确中的正类)}{所有被预测为正类的测试样本(既包括预测正确的也包括预测错误的)}
**召回率(Recall):**同样只能用于二分类(多分类时,只能两两计算,然后求平均)。分母是所有正真是正类的测试样本,这里面就包括了把正真是正类样本预测正确+把正真是正类样本预测错误(即把正的预测成负的了),分子和precision一样,都是被分为正类测试样本中,真正是正类的测试样本数量。
被 预 测 为 正 类 的 测 试 样 本 中 真 正 是 正 类 的 测 试 样 本 ( 正 确 中 的 正 类 ) 所 有 真 正 正 类 测 试 样 本 ( 包 括 预 测 正 确 的 和 预 测 成 负 类 的 ) \frac{被预测为正类的测试样本中真正是正类的测试样本(正确中的正类)}{所有真正正类测试样本(包括预测正确的和预测成负类的)}

使用MSE来衡量预测标签和正确标签之间的差异,因为评论的标签反映的是情绪强度(一星表示强烈负面,五星表示强烈正面)。
M S E = ∑ i N ( g o l d i − p r e d i c t e d i ) 2 N MSE=\frac{\sum^N_i(gold_i-predicted_i)^2}{N} MSE=NiN(goldipredictedi)2
​    将本文方法与其他文档级情感分类比较:

(1)Majority:是一个启发式的基线方法,将训练集中的多数情感标签分配给测试集中的每个文档(?)

majority class classifier(多数类分类器),就是说假设分类标签有0和1,共有1500个样本,标签1占1000个样本,则标签1就为majority class classifier,它的准确率为1000/1500=0.666,而你所建立的分类器预测为1的准确率必须要大于0.666,这样才有意义,说白了就是分类器预测准确率要大于随便猜的准确率

(2)SVM+Ngrams:使用单词袋和双词袋为特征,并使用LIBLINEAR训练SVM

LIBLINEAR:是一个简单的求解大规模规则化线性分类和回归的软件包

论文来源:《Liblinear: A library for large linear classification》https://www.jmlr.org/papers/volume9/fan08a/fan08a.pdf

(3)TextFeatures:实现了复杂的特征,包括单词ngram,字符ngram,情感词典特征,聚类特征等。

(4)AverageSG:使用word2vec表示200维单词向量,词嵌入求平均(average word embeddings)来获得文档表示,并以此训练SVM。

(5)SSWE:分别使用最大池化、最小池化、平均池化来获得文档表示。

(6)JMARS:对用户和评论的各个方面进行协同过滤和主题建模。

(7)CNN

(8)baseline Paragraph Vector:代码没有正式提供。窗口大小依据开发集大小调整。

​    实验结果如表二所示。使用两个指标来评估每个数据集,accuracy(越高越好)和MSE(越低越好)。

1636527670956

​    从表二中可以看出,Majority是表现最差的方法,因为它没有涉及任何文本语义。以单词袋和双词袋为特征的SVM几乎是所有基线算法中最强的。为文本表示设计复杂的特征对于篇章级的情感分类也是有效的,但是在Twitter语料库上,相比bag-of-ngram没有明显的改进。

论文来源:《Sentiment Analysis of Short Informal Texts》

​    描述了一个检测短的非正式文本情感(例如Twitter和SMS,消息级任务)和消息中一个单词或短语情感(术语级任务)的分析系统,使用的是linear-kernel SVM。基于有监督的统计文本分类方法,利用各种表面形式、语义和情感特征。情感特征主要来源于高覆盖率的推特特定情感词汇。使用CMU Twitter NLP工具对推文进行标记和词性标记,将每条推特表示为一个特征向量。

SVM的kernel参数:

kernel是svm中选择核函数的参数,其可选选项主要区别如下:

​    linear:线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。

​    poly:多项式核函数,多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。

​    rbf:高斯核函数(默认),高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。

​    sigmoid:sigmoid 核函数,sigmoid 经常用在神经网络的映射中。因此当选用 sigmoid 核函数时,SVM 实现的是多层神经网络。

​    本文也尝试了多个篇章相关的特征(discourse-driven features),分类性能保持不变。

**Discourse:**我们知道一篇文档的内容往往是有几个部分通过一些衔接部分组合起来的,比如段落。那么如何使用机器学习的方法来根据含义自动分割文档呢?最简单的方法就是依次比较两句相邻的句子的相似度,分割点往往就产生在相似度最低的地方,这种非监督的方法叫做Text Tiling。当然,也可以采用监督学习的方法,如构造分类器或是序列模型来检测分割点。

1636531945506

​    AverageSG是一种无需特征工程就能直接组成文档表示的方法,但是在这个场景中表现不好,SSWE的性能也不如基于上下文的词嵌入。复杂的基线算法,如JMARS,paragraph vector,CNN,通过捕获文本的更深层语义,能够获得比AverageSG显著的性能提升。

​    在两个评价指标中,Conv-GRNN和LSTM-GRNN在四个数据集上的性能都是最好的。与CNN相比,Conv-GRNN在文档组成方面表现出了优越的能力,它利用Gated RNN对文档表示中句子的语义及其关系进行编码,而且在句子表示建模方面,LSTM几乎全部优于CNN。

​    比较不同模型用于文档合成,使用CNN获取句子向量后,在以下的设置中进行了一些实验:

(1)Average:对句子向量求平均得到文档表示

(2)RNN/Gated NN:句子向量按顺序输入到标准(Gated)RNN中,最后一个隐藏向量作为文档表示

(3)RNN Avg/Gated NN Avg:将隐藏向量的平均作为文档表示

(4)Bi RNN Avg/Bi Gated NN Avg:双向隐藏向量的平均为文档表示

1636791505277

实验结果如表三所示,标准RNN是最差的,甚至比Average还要差(梯度爆炸)。RNN Avg相比RNN有很大改善,Bi RNN Avg和RNN Avg表现相当,但是都没有超越Average。在添加了门控之后,Gated NN的性能明显改进。结果表明Gated RNN能够在一定程度上处理消失梯度问题,在文本表示中对句子语义进行自适应建模是可行的。Gated NN Avg和Bi Gated NN Avg具有与Gated NN相当的性能。

Related Work

​    最近的一项工作也研究了LSTM对文档意义的建模,验证了LSTM在文本生成任务中的有效性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值