Convolutional Neural Networks for Sentence Classification阅读梗概

《Convolutional Neural Network for Sentence Classification》论文阅读笔记 CNN在自然语言处理应用的开篇之作,本篇文章是作者在阅读一些blog以及论文《Convolutional Neural Network for Sentence Classification》的阅读笔记和总结。 阅读详情

开端

本人有幸加入哈工大赛尔NLP实验室。慢慢学习与NLP有关的知识。这篇论文是要求阅读项目中的一篇。本文也不算翻译,只是总结每一部分的重点。我希望能够通过这种写博客的方式巩固自己的知识,也和大家一起分享。

综述

这篇论文介绍的是在word2vec上预训练词向量使用卷积神经网络完成句子级别的分类任务。简单的CNN使用静态的词向量可以达到多个好结果在多任务上。如果进一步允许学习词向量能够获得更好的表现。

介绍

介绍部分介绍了深度学习模型在计算机视觉和语音识别获得了很好的成果。许多深度学习方面的研究都使用了从语言模型获得的词向量表示。
词向量把单词从稀疏的独热码向量投影到一个低维的紧密表示。在这个表示中相似的词向量的距离相近。
卷积神经网络使用卷积滤波器获得局部特征。一开始使用在计算机视觉领域,逐渐在NLP领域获取了成果。
在目前的工作中,我们训练一个CNN一层卷积在词向量上。一开始我们的词向量静止。尽管模型很简单,还是取得了不错的成果。

模型

模型架构
xi∈Rk表示第i个单词由一个k维向量表示。长度为n的句子表示为
x1:n = x1 ⊕ x2 ⊕ . . . ⊕ xn ⊕表示向量的连接。
xi:i+j 表示对向量i…i+j连接
ci = f(w · xi:i+h−1 + b)表示了一个特征。其实就是把i…i+h-1的向量首尾连接,与w做向量乘法,得到一个值。这样做其是和卷积等价的。h是窗口大小。w∈R(h*k)是一个卷积核。
对每个窗口计算特征,把他们连到一起c = [c1, c2, . . . , cn−h+1]得到一个特征图。c ∈ Rn−h+1
然后使用最大池化cˆ = max{c},为了捕获最明显的特征。
上面过程是使用一个的卷积核。模型中使用多个卷积核,来获取多个特征图。这些来自多卷积核的特征最后连接到一起放入softmax分类器中。
模型还实验了多输入,意思是一个向量静态一个向量动态然后两个结果相加。

正则化

在这个论文中,正则化使用了l2正则化和dropout层。
dropout用来阻止过拟合。就是让神经元以一定概率失活。
就是在倒数第二层中训练中
z = [ˆc1, . . . , cˆm]
不使用y = w · z + b
而是y = w · (z ◦ r) + b,
r是一个向量取值从0,1按伯努利分布随机采样按dropout_rate也就是论文中的p为等于1的概率。
然后测试的时候,按照p来缩放向量而不dropout。

训练结果

训练结果我就不详细写了。
几个数据集

最后附上一份自己的代码

没有用训练好的词向量,就是学习架构用的,最后F1值也没有达到论文水平,72左右。

import torch
import torch.nn as nn
import torch.nn.functional as F

class MyModel(nn.Module):

    def __init__(self, embeddings, n_features, n_classes, batch_size, dropout_prob=0.5):
        super().__init__()
        self.embeddings = embeddings
        self.n_features = n_features
        self.n_classes = n_classes
        self.dropout_prob = dropout_prob
        self.batch_size = batch_size
        self.embed_size = embeddings.shape[1]
        self.my_embeddings = nn.Embedding(embeddings.shape[0], self.embed_size)
        #[batch_size,seq_len]输入 每一列代表一句
        #[batch_size,seq_len,embedding_size]输出,每列变多维度
        self.my_embeddings.weight = nn.Parameter(torch.tensor(embeddings))
        self.fc1_1 = nn.Conv1d(in_channels=self.embed_size,out_channels=100,kernel_size = 1)
        #[batch_size,embedding_size,seq_len]输入,每列变多维度,一维卷积是在最后维度上扫
        #3*[batch_size,100,seq_len-3+1]
        self.fc1_2 = nn.Conv1d(in_channels=self.embed_size, out_channels=100, kernel_size=4)
        self.fc1_3 = nn.Conv1d(in_channels=self.embed_size, out_channels=100, kernel_size=5)
        self.fc1_1_2 = nn.ReLU()
        self.fc1_2_2 = nn.ReLU()
        self.fc1_3_2 = nn.ReLU()
        #做池化 [batch_size,100,seq_len-3+1]输入
        #[batch_size,300,1]输出
        #线性层,每列变多维度
        self.fc3_1 = nn.Linear(in_features = 300, out_features =100)
        self.fc3_2 = nn.ReLU()
        self.fc3_3 = nn.Dropout(0.5)
        self.fc4_1 = nn.Linear(in_features=100, out_features=50)
        self.fc4_2 = nn.ReLU()
        self.fc4_3 = nn.Dropout(0.5)
        self.fc5= nn.Linear(in_features=50,out_features=2)
        self.softmax = nn.Softmax(dim=1)
    def forward(self,x):
        x = x.long()
        x = self.my_embeddings(x)
        x = x.permute([0,2,1]).to(torch.float32)
        x1 = self.fc1_1(x)
        x2 = self.fc1_2(x)
        x3 = self.fc1_3(x)
        x1 = F.relu(self.fc1_1_2(F.max_pool1d(x1, kernel_size = x1.shape[2])))
        x2 = F.relu(self.fc1_2_2(F.max_pool1d(x2, kernel_size=x2.shape[2])))
        x3 = F.relu(self.fc1_3_2(F.max_pool1d(x3, kernel_size=x3.shape[2])))
        x = torch.cat((x3, x2, x1),1).squeeze(2)
        x = self.fc3_1(x)
        x = self.fc3_2(x)
        x = self.fc3_3(x)
        x = self.fc4_1(x)
        x = self.fc4_2(x)
        x = self.fc4_3(x)
        x = self.fc5(x)
        return self.softmax(x)
##训练过程
from torch.utils.data.dataloader import DataLoader
import model
import dataget
import torch.optim as optim
from sklearn.metrics import f1_score, confusion_matrix, accuracy_score, classification_report, precision_recall_fscore_support
import matplotlib.pyplot as plt
mydataset = dataget.MyDataSet()
mymodel = model.MyModel(batch_size=64,dropout_prob=0.5,embeddings=mydataset.word2vec,n_classes=2,n_features=mydataset.maxlen)
mydatasetloader = DataLoader(dataset=mydataset,batch_size=64)
mytestdatasetloader = DataLoader(dataset=dataget.MytestSet(mydataset),batch_size=64)
loss_function = torch.nn.CrossEntropyLoss()
optimzer = optim.Adam(mymodel.parameters(),lr=0.0001)
history_loss = list()
for epoches in range(100):
    tr_loss = 0
    nb_tr_steps = 0
    train_logits_list = []
    train_labels_list = []

    tv_loss = 0
    nb_tv_steps = 0
    valid_logits_list = []
    valid_labels_list = []
    mymodel.train()
    for data,mask,labels in tqdm(mydatasetloader):

        predict = mymodel(data)
        labels = labels.long()
        print(labels.shape)
        print(predict.shape)
        #print(predict)
        loss = loss_function(predict, labels)
        loss.backward()
        predict = predict.view(-1, 2).detach().cpu().numpy()
        labels = labels.view(-1).to('cpu').numpy()

        train_logits_list += [int(x) for x in np.argmax(predict, axis=1)]
        train_labels_list += [int(x) for x in labels]
        tr_loss = tr_loss+loss.item()
        nb_tr_steps = nb_tr_steps +1
        optimzer.step()
        optimzer.zero_grad()
    train_loss = tr_loss
    train_accuracy = metrics.accuracy_score(train_labels_list, train_logits_list)
    train_w_f1 = metrics.f1_score(train_labels_list, train_logits_list, average='weighted')

    mymodel.eval()
    for data,mask,labels in tqdm(mytestdatasetloader):
        predict = mymodel(data)
        labels = labels.long()
        loss = loss_function(predict, labels)
        tv_loss = tv_loss+loss.item()
        nb_tv_steps = nb_tv_steps +1
        predict = predict.view(-1, 2).detach().cpu().numpy()
        labels = labels.view(-1).to('cpu').numpy()
        valid_logits_list += [int(x) for x in np.argmax(predict, axis=1)]
        valid_labels_list += [int(x) for x in labels]
    valid_loss = tv_loss
    valid_accuracy = metrics.accuracy_score(valid_labels_list, valid_logits_list)
    valid_w_f1 = metrics.f1_score(valid_labels_list, valid_logits_list, average='weighted')
    history_loss.append(valid_loss)
    print('\nEpoch %d, train_loss=%.5f, train_acc=%.2f, train_w_f1=%.2f,valid_loss=%.5f, valid_acc=%.2f, valid_w_f1=%.2f'
          %(epoches, train_loss, train_accuracy * 100, train_w_f1 * 100,valid_loss, valid_accuracy * 100, valid_w_f1 * 100))







fig=plt.figure(num=1,figsize=(4,4))
plt.subplot(111)
plt.plot(np.arange(0,len(history_loss)),history_loss)
plt.show()
##数据处理
import random

import chardet
import torch
import pickle
import numpy as np
from torch.utils.data.dataset import Dataset
from PIL import Image
import numpy as np
import torch

from tqdm import tqdm


def get_word2id(data_paths):
    print('加载数据集')
    wordid = {'PAD': '0'}
    for path in data_paths:
      with open(path,encoding="Windows-1252") as f:
        for line in tqdm(f):
            words = line.strip().split()
            for word in words:
                if word not in wordid.keys():
                    wordid[word] = len(wordid)
    print(wordid)
    return wordid


def get_word2vec(word2id):
    word2vec = np.array(np.random.uniform(-1., 1., [len(word2id) + 1, 50]))
    #apple = ge.models.KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz", binary=True)
    return word2vec


def get_corpus(word2id):
    print('loading corpus...')
    contents = list()
    labels = list()
    masks = list()
    maxlen = 0
    with open('E:\\python_project\\dataset\\rt-polaritydata\\rt-polarity.neg', encoding="Windows-1252") as f:
        for line in tqdm(f):
            words = line.strip().split()
            if not words: continue
            content = [word2id[word] for word in words]
            if len(content) >maxlen:maxlen = len(content)
            label = 0
            contents.append(content)
            labels.append(label)
    with open('E:\\python_project\\dataset\\rt-polaritydata\\rt-polarity.pos', encoding="Windows-1252") as f:
        for line in tqdm(f):
            words = line.strip().split()
            if not words: continue
            content = [word2id[word] for word in words]
            if len(content) > maxlen: maxlen = len(content)
            label = 1
            contents.append(content)
            labels.append(label)
    for index,line in enumerate(contents):
        addline = [0 for i in range(maxlen - len(line))]
        mask = [1 for i in range(len(line))]
        line = line + addline
        mask  = mask + addline
        masks.append(mask)
        contents[index] = line
    cc = list(zip(contents,labels))
    random.shuffle(cc)
    contents[:], labels[:] = zip(*cc)
    return contents,masks,labels,maxlen


class MyDataSet(Dataset):
    def __init__(self):
        datapath = ['E:\\python_project\\dataset\\rt-polaritydata\\rt-polarity.pos',
                    'E:\\python_project\\dataset\\rt-polaritydata\\rt-polarity.neg']
        self.word2id = get_word2id(data_paths=datapath)
        self.corpus = get_corpus(self.word2id)
        self.word2vec = get_word2vec(self.word2id)
        self.maxlen = self.corpus[3]
    def __len__(self):
        return 8000

    def __getitem__(self, index):
        '''
        :param index:
        :return: 编码,掩码,标签
        '''
        return np.array(self.corpus[0][index]), np.array(self.corpus[1][index]),np.array(self.corpus[2][index])

class MytestSet(Dataset):
    def __init__(self,MyDataSet):
        self.mydataset = MyDataSet
    def __len__(self):
        return 2050

    def __getitem__(self, index):
        '''
        :param index:
        :return: 编码,掩码,标签
        '''
        return np.array(self.mydataset.corpus[0][index+8000]), np.array(self.mydataset.corpus[1][index+8000]), np.array(self.mydataset.corpus[2][index+8000])
论文阅读:《Convolutional Neural Networks for Sentence Classification》 我们报告了一系列卷积神经网络(CNN)的实验,这些卷积神经网络是在预先训练过的词语向量的基础上进行训练以进行句子级别的分类任务。我们展示了一个简单的CNN,带有超级参数调整和静态向量,可以在多个基准测试中取得优异的结果。通过微调学习特定于任务的矢量可提高性能。我们另外建议对体系结构进行简单的修改,以允许使用任务特定和静态向量。本文讨论的CNN模型改进了7项任务中的4项任务的现有技术水平,其中包括情感分析和问题分类。 阅读详情

相关推荐

Convolutional Neural Networks for Sentence Classification阅读笔记及复现

文章目录TEXT-CNN1. 网络结构Embedding LayerConvolution LayerMax-Pooling LayerSoftMax分类Layer2. 参数与超参数3. 变种4. 实验代码复现(pytorch) TEXT-CNN 一篇比较老的论文了, 但是很经典, 在一些简单的分类任务上效果也还不错. 1. 网络结构 Embedding Layer word embedd...

Leokb24的博客 1659

Convolutional Neural Networks for Sentence Classification(卷积神经网络句子分类)

通过复现论文来总结各种技术,并运用,理解论文的写作思路,所用技术,挖掘自己的写作点,冲刺顶刊! ——小白成长记

kuxingseng123的博客 2689

论文阅读《Convolutional Neural Networks for Sentence Classification》Yoon Kim

摘要:我们报告了一系列在预训练的单词向量之上用卷积神经网络(CNN)训练的实验,用于完成句子级分类任务。我们展示了一个具有很少超参数调整和静态向量的简单的CNN,它可以在多个基准测试中获得出色的结果。学习特定任务的向量通过微调可以进一步有很好的表现。为了使用特定任务向量和静态向量,我们对架构进行了简单的修改。我们在这里讨论的七个任务中,有四个取得了目前最好的结果,其中包括情感分析和问题分类。 模...

qq_41943219的博客 1220

Convolutional Neural Networks for Sentence Classification

论文总体结构 一、摘要 使用卷积神经网络处理句子级别文本分类,并在多个数据集上有好的效果 二、Introduction(背景介绍) 使用预训练词向量和卷积神经网络,提出一种有效分类模型 本文的主要契机: 1、深度学习的发展(2012) 2、预训练词向量方法 3、卷积神经网络的方法 本文的历史意义: 1、开启基于深度学习的文本分类的序幕 2、推动卷积神经网络在自...

BUPT-WT的博客 1139

TextCNN Convolutional Neural Networks for Sentence Classification阅读笔记

论文原文 Convolutional Neural Networks for Sentence Classification 论文信息 EMNLP2014 论文解读 Zhenyu Zhang & Hytn Chen 更新时间 2020-02-19 文本分类简介 发展历史历经基于规则的文本分类,基于特征的文本分类以及基于神经网络的文本分类三大阶段。 基于规则的文本...

nstarLDS的博客 370

[论文笔记]Convolutional Neural Networks for Sentence Classification

这是对经典的TextCNN论文的阅读笔记。

日积月累,天道酬勤 1100

【论文阅读笔记】Convolutional Neural Networks for Sentence Classification

1 概览 Convolutional Neural Networks for Sentence Classification 的 原文,本文将CNN和NLP结合; 介绍了一系列的对比实验,实验结果证明了: 一个简单的(单层神经网络)的CNN模型 一点超参数的调节(Filter的个数) static word vector 另外,对cnn模型进行了小改动:将static vectors和non static vectors变成cnn模型中的两个channels,类似于图像中的rgb三通道。 non-st

学习带来的快乐最持久~ 1687

《Convolutional neural networks for sentence classification》原文及翻译

《Convolutional neural networks for sentence classification》原文及翻译

论文阅读:Convolutional Neural Networks for Sentence Classification 卷积神经网络的句子分类

Convolutional Neural Networks for Sentence Classification 卷积神经网络的句子分类 目录Convolutional Neural Networks for Sentence Classification卷积神经网络的句子分类摘要1 引言2 模型2.1 正则化3 数据集和实验设置3.1 超参数和训练3.2 预训练词向量3.3 模型变体4 结果与讨论4.1 多通道与单通道模型4.2 静态与非静态表示4.3 进一步的观察5 结论 摘要 我们报告了一系列在预训

南有芙蕖 4452

STM32串口调试踩坑记:HAL_UART_ErrorCallback里不先解锁,你的中断接收就废了

本文深入分析了STM32串口调试中HAL_UART_ErrorCallback的锁机制陷阱,指出在错误回调中不先解锁会导致中断接收失效的问题。通过解析HAL库源码,提出了正确的错误处理实现方法,并分享了预防措施与最佳实践,帮助开发者提升串口通信的可靠性。

weixin_33733810的博客 515

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 490

【文本分类】Convolutional Neural Networks for Sentence Classification

·摘要:   本文作者将CNN引用到了NLP的文本分类任务中。 ·参考文献:   [1] Convolutional Neural Networks for Sentence Classification 论文链接:http://cn.arxiv.org/pdf/1408.5882.pdf [1] 模型   很基础的卷积神经网络模型。   算法流程:   1)word2vec词嵌入   将若干个文本中的所有词,进行无监督训练,得到词向量(word vectors)。对于每个文本,可以采用词向量加和、.

十一月廿七风雨大作 6756

8卡H20运行DeepSeek-V3-0324性能和推理实测

最近在一台 8卡H20 机器上,先后部署了 DeepSeek-R1-AWQ (671B)和最新的 DeepSeek-V3-0324 (685B) ,测试了下性能和数学问题跑分。服务器由火山引擎提供。

weixin_53138109的博客 3366

Attention-based Convolutional Neural Networks for Sentence Classification 论文阅读

句子分类是口语理解(SLU)和自然语言处理(NLP)中的基础任务之一。在本文中,我们提出了一种新颖的带注意力机制的卷积神经网络(CNN),以提高句子分类的性能。在传统的CNN中,很难有效地编码长期的上下文信息和非连续词之间的关联。相反,我们基于注意力的CNN能够捕获每个词的这些信息,而无需任何外部特征。我们在各种公共和内部数据集上进行了实验。实验结果表明,我们提出的模型明显优于传统的CNN模型,并且在利用丰富的句法特征的模型中取得了竞争性能。

weixin_44609958的博客 1170

AI驱动视频剪辑自动化:cutcli命令行工具重塑工作流

视频剪辑自动化是提升内容生产效率的关键技术,其核心原理在于通过程序化指令替代手动操作,将创意执行过程代码化。这项技术的价值在于能够将创作者从重复性劳动中解放,实现批量化、标准化的视频内容生产,尤其适用于社交媒体运营、产品宣传等高频产出场景。通过封装专业软件(如剪映/CapCut)的底层草稿格式,自动化工具在保证工业级渲染质量的同时,提供了可编辑的中间态,为AI智能体(Agent)与生产工具的结合提供了清晰接口。本文以cutcli为例,深入探讨了如何通过命令行工具和AI助手,构建从自然语言指令到可编辑视频草稿

weixin_27210125的博客 1065

华为OD机试真题 新系统 2026-04-22 C++ 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 169

Convolutional Neural Networks for Sentence Classification 阅读笔记

原文链接: http://chenhao.space/post/b62604a1.html Introduction 题目:Convolutional Neural Networks for Sentence Classification 来源:EMNLP 2014 本论文提出将CNN用在NLP的句子分类任务上,进行了一系列的对比实验。 Model 假设一个句子的长度为n,可以表示为(词向量x...

每天起床第一句要给自己打个气 404

Far planner 代码系列(33) 关于real_world_contour和contour_graph

我们知道far planner前部分的流程是这样子的: 对于特定的地图,如下: 我们要从surround_obs_cloud里抽取生成realworld_contour_,如下图所示: 在这时候,每个node的z坐标都是以机器人的高度定的。如图所示: 先去吃饭啦~待会回来在写 ...

博客 763

Convolutional neural networks for sentence classification 阅读笔记

论文原文 论文实现 使用CNN,以词向量为变量: 1.CNN-rand:初始词向量为随机值,训练过程中可修改 2.CNN-static:初始词向量为word2vec训练后的词向量,训练过程静态不可修改 3.CNN-non-static:初始词向量为word2vec训练后的词向量,训练过程动态可改 4.CNN-multichannel:多通道CNN,初始值为均为word2vec训练后的词向量,一个通...

Mizar_的博客 277

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1034

pycharm一直选择不了conda正确路径弹框报错:latinit property envs_dirs has not been initialized...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2923

深度学习论文阅读:Convolutional Neural Networks for Sentence Classification (TextCNN)

这是一篇将CNN运用于句子分类的论文 摘要 We report on a series of experiments with convolutional neural networks (CNN) trained on top of pre-trained word vectors for sentence-level classification tasks. We show that ...

guangyacyb的博客 2086

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【论文泛读】8. 文本分类:Convolutional Neural Networks for Sentence Classification

更新进度:■■■■■■■□□□□□□□□□□□□□□□□|30% 理论上一周更一个经典论文 刚刚开始学习,写的不好,有错误麻烦大家留言给我啦 目录文本表示:文本分类方法:基于规则的文本分类基于特征的文本分类方法基于卷积神经网络的文本分类 文本表示: 词袋子:one_hot 不考虑文本的序列信息,就像将信息放进了一个袋子里。有多少词就需要有多少维度,数据处理的压力会比较大 词嵌入:Word2Vec(2013年Efficient Estimation of Word Representations in .

⛄ 646

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

『 论文阅读』:Convolutional Neural Networks for Sentence Classification

Abstract CNN应用于文本分类系列实验表明,使用很少超参合静态变量的CNN在多分类任务上表现出色。fine-tuning的词向量还能提高性能。本文同时利用了微调和静态的词向量(multi-channel)。 1 Introduct Word vectors: train by Mikolov, on 100 billion words of Google News , 词向量...

百川的博客 1955

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 泛型类型擦除的愚蠢
下一篇: Hierarchical Attention Networks for Document Classification阅读报告
入过栈你
博客等级 码龄7年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值