深度学习与自然语言处理第四次大作业

一、作业内容

1.实验要求

利用Word2Vec模型训练Word Embedding,根据小说中人物、武功、派别或者其他你感兴趣的特征,基于Word Embedding来进行聚类分析。

2.数据集

金庸小说数据集
在这里插入图片描述
数据库地址: https://share.weiyun.com/5zGPyJX
(导入文本时注意选择编码格式)
需要用到的人物武功门派文本和停词文本:
https://pan.baidu.com/s/1DXz09cOnZeeu571SnQW9aQ
提取码:1234

二、实验原理

1.Word Embedding

1.1 基本概念

词向量(Word embedding),又叫Word嵌入式自然语言处理(NLP)中的一组语言建模和特征学习技术的统称,其中来自词汇表的单词或短语被映射到实数的向量。 从概念上讲,它涉及从每个单词一维的空间到具有更低维度的连续向量空间的数学嵌入。
如果将word看作文本的最小单元,可以将Word Embedding理解为一种映射,其过程是:将文本空间中的某个word,通过一定的方法,映射或者说嵌入(embedding)到另一个数值向量空间(之所以称之为embedding,是因为这种表示方法往往伴随着一种降维的意思)。
生成这种映射的方法包括神经网络,单词共生矩阵的降维,概率模型,可解释的知识库方法,和术语的显式表示单词出现的背景。
当用作底层输入表示时,单词和短语嵌入已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。

1.2 输入和输出

(1)输入:
Word Embedding的输入是原始文本中的一组不重叠的词汇,假设有句子:what is your name?那么为了便于处理,我们可以将这些词汇放置到一个dictionary里,例如:[“what”, “is”, “your”, “name”],这个dictionary就可以看作是Word Embedding的一个输入。
(2)输出:
Word Embedding的输出就是每个word的向量表示。对于上文中的原始输入,假设使用最简单的one hot编码方式,那么每个word都对应了一种数值表示。例如,what对应的vector就是[1, 0, 0, 0],your对应的vector就是[0, 0, 1, 0],各种机器学习应用可以基于这种word的数值表示来构建各自的模型。当然,这是一种最简单的映射方法,但却足以阐述Word Embedding的意义。下文将介绍常见的Word Embedding的方法和优缺点。

1.3 Word Embedding的类型

Word Embedding也是有流派的,主流有以下两种:
(1)基于频率的Word Embedding(Frequency based embedding)

主要有以下几种:

  1. Count Vector
  2. TF-IDF Vector
  3. Co-Occurence Vector

(2)基于预测的Word Embedding(Prediction based embedding)

主流的有以下两种:

  1. CBOW(continues bag of words)
  2. Skip – Gramtor

1.4 Word Embedding的应用

现今流行的Word Embedding算法携带了语义信息且维度经过压缩便于运算,因此有很多用途,例如:

  • 计算相似度
  • 在一组单词中找出与众不同的一个,例如在如下词汇列表中:[dog, cat, chicken, boy],利用词向量可以识别出boy和其他三个词不是一类。
  • 直接进行词的运算,例如经典的:woman+king-man =queen
  • 由于携带了语义信息,还可以计算一段文字出现的可能性,也就是说,这段文字是否通顺。

本质上来说,经过Word Embedding之后,各个word就组合成了一个相对低维空间上的一组向量,这些向量之间的远近关系则由他们之间的语义关系决定。

2.Word2vec模型

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅层双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。

训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。

Word2vec依赖skip-grams或CBOW(连续词袋)来建立神经词嵌入。

2.1 Skip-gram 和 CBOW 的简单情形

2.1.1 one-hot encoder

one-hot encoder,其思想跟特征工程里处理类别变量的 one-hot 一样,本质上是用一个只含一个 1、其他都是 0 的向量来唯一表示词语。

举个例子,假设全世界所有的词语总共有 V 个,这 V 个词语有自己的先后顺序,假设『我』这个词是第1个词,『你』这个单词是第2个词,那么『我』就可以表示为一个 V 维全零向量、把第1个位置的0变成1,而『你』同样表示为 V 维全零向量、把第2个位置的0变成1。这样,每个词语都可以找到属于自己的唯一表示。

2.1.2 简单情形下的Skip-gram 和 CBOW

接下来来看 Skip-gram 的网络结构了,x 就是上面提到的 one-hot encoder 形式的输入,y 是在这 V 个词上输出的概率,我们希望跟真实的 y 的 one-hot encoder 一样。

在这里插入图片描述

在上述图示中,隐层的激活函数其实是线性的,相当于没做任何处理,我们要训练这个神经网络,用反向传播算法,本质上是链式求导。

当模型训练完后,最后得到的其实是神经网络的权重,比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],对应刚说的那个词语『我』,则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。

此外,输出 y 也是用 V 个节点表示的,对应V个词语,所以把输出节点置成 [1,0,0,…,0],它也能表示『我』这个单词,但是激活的是隐含层到输出层的权重,这些权重的个数,跟隐含层一样,也可以组成一个向量 vy,跟上面提到的 vx 维度一样,并且可以看做是词语『我』的另一种词向量。而这两种词向量 vx 和 vy,正是 Mikolov 在论文里所提到的,『输入向量』和『输出向量』,一般我们用『输入向量』。

这个词向量的维度(与隐含层节点数一致)一般情况下要远远小于词语总数 V 的大小,所以 Word2vec 本质上是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示。

2.2 Skip-gram

上面讨论的是Skip-gram的最简单情形,即 y 只有一个词,当 y 有多个词时,网络结构如下:
在这里插入图片描述
可以看成是 单个x到单个y 模型的并联,cost function 是单个 cost function 的累加(取log之后)。

2.3 CBOW

CBOW跟Skip-gram 相似
Skip-gram 是预测一个词的上下文,而 CBOW 是用上下文预测这个词
CBOW的网络结构如下:
在这里插入图片描述
与 Skip-gram 的模型并联不同,这里是输入变成了多个单词,所以要对输入处理下(一般是求和然后平均),输出的 cost function 不变。

三、实验过程

3.1文本预处理

3.1.1导入各种包和数据集

导入所需要的jieba模块、gemsim模块和其他相关模块并加载文件路径

import os
import jieba
import warnings
import gensim.models as w2v
warnings.filterwarnings('ignore')
novel_path = "C:/Users/Administrator/Desktop/novels-master/novels-master/武侠小说数据库/"
data_path = "C:/Users/Administrator/Desktop/novels-master/novels-master/"

3.1.2文本过滤

过滤掉文本中的标点符号和一些训练词向量时不需要,单独出现并没有什么意义的停词(stop word)。
停词表选用的是网上通用的中文语料停词表,我又手动在里面添加了部分武侠小说里常出现的对训练词向量没什么意义的词汇和短语。这里把标点符号当作停用词合并一起处理。

stop_words_file = open(data_path + "stop_words.txt", 'r')
stop_words = list()
for line in stop_words_file.readlines():
    line = line.strip()   # 去掉每行末尾的换行符
    stop_words.append(line)
stop_words_file.close()
print(len(stop_words))

3.1.3添加自定义词汇

jieba的词汇表中并没有收录很多金庸的武侠小说这种特定环境下的很多专有名词,包括一些重要人物的名称,一些重要的武功等。这里整理了三份txt文本,分别记录了武侠小说中的人物名称、武功名称和门派名称,并把这些词汇添加到词汇表中。
人名、武功、门派txt文本参考来源:金庸网-金庸数据库。

(1)将人名添加到词汇表中:

people_names_file = open(data_path + "金庸小说全人物.txt", 'r')
people_names = list()
for line in people_names_file.readlines():
    line = line.strip()   # 去掉每行末尾的换行符
    jieba.add_word(line)
    people_names.append(line)
stop_words_file.close()
print(len(people_names))

(2)将武功添加到词汇表中:

people_names_file = open(data_path + "金庸小说全武功.txt", 'r')
people_names = list()
for line in people_names_file.readlines():
    line = line.strip()   # 去掉每行末尾的换行符
    jieba.add_word(line)
    people_names.append(line)
stop_words_file.close()
print(len(people_names))

(3)将门派添加到词汇表中:

people_names_file = open(data_path + "金庸小说全门派.txt", 'r')
people_names = list()
for line in people_names_file.readlines():
    line = line.strip()   # 去掉每行末尾的换行符
    jieba.add_word(line)
    people_names.append(line)
stop_words_file.close()
print(len(people_names))

3.1.4分词

将所有文本分词并显示每一本书分词后的行数和总行数,通过一个嵌套列表存储,每一句为列表中一个元素,每一句又由分好的词构成一个列表,这也是word2vec训练时需要输入的格式。

seg_novel = []
for novel_name in novel_names:
    novel = open(novel_path + novel_name, 'r', encoding='utf-8-sig')
    print("Waiting for {}...".format(novel_name))
    line = novel.readline()
    forward_rows = len(seg_novel)
    while line:
        line_1 = line.strip()
        outstr = ''
        line_seg = jieba.cut(line_1, cut_all=False)
        for word in line_seg:  
            if word not in stop_words:
                if word != '\t':
                    if word[:2] in people_names:
                        word = word[:2]
                    outstr += word 
                    outstr += " "
        if len(str(outstr.strip())) != 0:
            seg_novel.append(str(outstr.strip()).split())
        line = novel.readline()
    print("{} finished,with {} Row".format(novel_name, (len(seg_novel) - forward_rows)))
    print("-" * 40)
print("-" * 40)
print("-" * 40)
print("All finished,with {} Row".format(len(seg_novel)))

3.2 训练词向量

Gemsim模块是一个功能很强大的NLP处理模块,这里用到了Gemsim模块中Word2Vec函数。

model = w2v.Word2Vec(sentences=seg_novel, vector_size=200, window=5, min_count=5, sg=1)
model.save(data_path + 'all_CBOW.model')  # 保存模型

Word2Vec中的几个参数:

  • sentences是输入的语料,即分词得到的嵌套列表,可以通过LineSentence或Text8Corpus函数构造。

  • size即是训练得到的词向量的维数。

  • window为滑窗大小,也就是训练词与上下文词最远的距离。

  • min_count是指过滤掉一些低词频的词。

  • sg为选择CBOW模型还是skip-gram模型,0为CBOW模型,1为skip-gram模型,默认为CBOW模型。

还有一些其他参数,不一一列出,具体可以参考官方文档,链接如下:

3.3 人物、武功和门派等的关系分析

通过模型里的similarity、most_similar等函数对各个要素进行分析

以人名为例:

print(model.wv.similarity('人名1', '人名2'))
print(model.wv.most_similar("人名", topn=10))

编写函数寻找对应关系:

def find_relation(a, b, c):
    d, _ = model.wv.most_similar(positive=[c, b], negative=[a])[0]
    print (c,d)

寻找X1之于X2等于Y1之于什么

print(find_relation("X1","X2","Y1"))

四、实验结果与分析

4.1实验结果

(1)人物亲近关系分析

本人看过的金庸先生的作品不多,大部分都是通过影视剧等接触到的,首先对金庸小说中给我印象最深的几个人物进行一下亲近的关系程度分析。
这里选取的人物有:
张无忌、赵敏、周芷若、小昭、殷离(嘿嘿,这里通过模型着重分析一下张无忌个人的亲近关系状况,通过小说挖掘一下这个男人的内心情感纠纷,坏笑.jpg)

print(model.wv.most_similar("张无忌", topn=10))
  1. CBOW模型下结果:
    [(‘令狐冲’, 0.8219925761222839),
    (‘虚竹’, 0.8191495537757874),
    (‘苗人凤’, 0.7612510919570923),
    (‘杨过’, 0.7554736733436584),
    (‘胡斐’, 0.7488624453544617),
    (‘赵敏’, 0.7459343671798706),
    (‘陈家洛’, 0.7437200546264648),
    (‘张翠山’, 0.7308812141418457),
    (‘段誉’, 0.7242549061775208),
    (‘石破天’, 0.7199333310127258)]

与张无忌最相关的十个人里只有赵敏入围,看来赵敏确实是真爱。
至于其他几个人物里出现了很多其他小说中的,应该是同作为主角或者和都是些和很多女人有瓜葛的人物的原因吧。。。

  1. skip-gram模型下结果:
    [(‘赵敏’, 0.6332710385322571),
    (‘周芷若’, 0.5428728461265564),
    (‘杨逍’, 0.5047704577445984),
    (‘小昭’, 0.49526676535606384),
    (‘波斯’, 0.47718557715415955),
    (‘范遥’, 0.46113550662994385),
    (‘明教’, 0.46045544743537903),
    (‘韦一笑’, 0.45127829909324646),
    (‘东方不败’, 0.4473627805709839),
    (‘殷天正’, 0.4427570104598999)]

skip-gram模型下得出的结果明显比CBOW模型下的结果靠谱的多。

来看下具体数值:

print(model.wv.similarity('张无忌', '赵敏'))
print(model.wv.similarity('张无忌', '周芷若'))
print(model.wv.similarity('张无忌', '小昭'))
print(model.wv.similarity('张无忌', '殷离'))
  1. CBOW模型下结果:
    0.74593437
    0.6773286
    0.5496901
    0.49504638

  2. skip-gram模型下结果:
    0.63327116
    0.5428728
    0.49526674
    0.3247611

两个模型的结果是很相近的,由这个相关度的结果来看,在张无忌心中这几个女人在心中的排行顺序应该为:

赵敏>周芷若>小昭>殷离

(2)人物武功分析

来看下段誉和他的几个武功:

print(model.wv.similarity('段誉', '一阳指'))
print(model.wv.similarity('段誉', '六脉神剑'))
print(model.wv.similarity('段誉', '凌波微步'))
print(model.wv.similarity('段誉', '北冥神功'))
  1. CBOW模型下结果:
    0.13793938
    0.13799165
    0.4013414
    0.29287854
  2. skip-gram模型下结果:
    0.23468633
    0.33899996
    0.29822442
    0.22794816

从第一个结果来看,段誉使用或被提及到的武功的频率:
凌波微步>北冥神功>六脉神剑>一阳指
凌波微步的相关性远大于其他几个,这么看来段誉这小子跑路的功夫还是相当到位的。
从第二个结果来看,段誉使用或被提及到的武功的频率:
六脉神剑>凌波微步>一阳指>北冥神功
第二个得到的结果还是比较符合我的认知的。

再来看下乔峰与他的几个武功:

print(model.wv.similarity('乔峰', '降龙十八掌'))
print(model.wv.similarity('乔峰', '打狗棒法'))
print(model.wv.similarity('乔峰', '太祖长拳'))
print(model.wv.similarity('乔峰', '龙爪手'))
  1. CBOW模型下结果:
    0.15670247
    0.1666217
    0.43892443
    0.3719232

  2. skip-gram模型下结果:
    0.3248629
    0.34100458
    0.40759918
    0.34507743

两个结果都是太祖长拳和龙爪手的相关性更高这我是没想到的,印象里乔峰的大招一直都是降龙十八掌。。。果然还是因为没看过小说啊,对这些内容都不太熟悉。

再来看看虚竹的武功

print(model.wv.similarity('虚竹', '罗汉拳'))
print(model.wv.similarity('虚竹', '小无相功'))
print(model.wv.similarity('虚竹', '生死符'))
print(model.wv.similarity('虚竹', '天山折梅手'))
print(model.wv.similarity('虚竹', '天山六阳掌'))
  1. CBOW模型下结果:
    0.3873413
    0.4642748
    0.4012003
    0.42147836
    0.397842
  2. skip-gram模型下结果:
    0.35458156
    0.37884584
    0.36366314
    0.34679428
    0.35620466

由上面的结果来看,可能小无相功应该是虚竹最猛也用的最溜的武功了吧。

(3)门派关系分析
对我最感兴趣的峨嵋派进行一下分析

print(model.wv.most_similar("峨嵋派", topn=10))
print(model.wv.most_similar("明教", topn=10))
print(model.wv.most_similar("星宿派", topn=10))
  1. CBOW模型下结果:
    峨嵋派:
    [(‘华山派’, 0.9436966776847839),
    (‘嵩山派’, 0.9389994144439697),
    (‘雪山派’, 0.9334407448768616),
    (‘昆仑派’, 0.9219261407852173),
    (‘武当派’, 0.9164824485778809),
    (‘本派’, 0.9102069139480591),
    (‘泰山派’, 0.9091735482215881),
    (‘恒山派’, 0.9059759974479675),
    (‘正派’, 0.9051200151443481),
    (‘同门’, 0.9038318395614624)]
    明教:
    [(‘豪杰’, 0.9451081156730652),
    (‘五岳剑派’, 0.9322075843811035),
    (‘本教’, 0.9257973432540894),
    (‘帮会’, 0.9235848784446716),
    (‘泰山’, 0.9211295247077942),
    (‘同道’, 0.920339822769165),
    (‘忠义’, 0.9173502922058105),
    (‘中原’, 0.9149920344352722),
    (‘众多’, 0.9079399704933167),
    (‘武林’, 0.9052870273590088)]
    星宿派:
    [(‘门人’, 0.9520851373672485),
    (‘峨嵋’, 0.9368542432785034),
    (‘星宿’, 0.9360981583595276),
    (‘青城’, 0.93340665102005),
    (‘王屋派’, 0.919457197189331),
    (‘万门’, 0.9152359962463379),
    (‘第三代’, 0.9008792638778687),
    (‘八袋’, 0.8994984030723572),
    (‘雪山派’, 0.8989220857620239),
    (‘五支’, 0.8980754017829895)]

  2. skip-gram模型下结果:
    峨嵋派:
    [(‘本派’, 0.7783536314964294),
    (‘峨嵋’, 0.7679157257080078),
    (‘西宗’, 0.7626980543136597),
    (‘华山派’, 0.7623113393783569),
    (‘仙都派’, 0.7524623274803162),
    (‘无量剑’, 0.7504383325576782),
    (‘恒山派’, 0.7442404627799988),
    (‘门徒’, 0.7416756749153137),
    (‘雪山派’, 0.7413643598556519),
    (‘弃徒’, 0.7368792295455933)]
    明教:
    [(‘五散’, 0.7567914724349976),
    (‘教众’, 0.7546409368515015),
    (‘本教’, 0.7462047338485718),
    (‘护教’, 0.7236737012863159),
    (‘法王’, 0.7100147604942322),
    (‘光明顶’, 0.7046201229095459),
    (‘波斯’, 0.6988454461097717),
    (‘杨逍’, 0.6982667446136475),
    (‘日月神教’, 0.6954314112663269),
    (‘日月’, 0.6857722401618958)]
    星宿派:
    [(‘门人’, 0.8486785888671875),
    (‘峨嵋’, 0.8153977990150452),
    (‘长门’, 0.7829409241676331),
    (‘老怪’, 0.7800701856613159),
    (‘群弟子’, 0.7795143127441406),
    (‘老仙’, 0.7772762775421143),
    (‘西宗’, 0.7724445462226868),
    (‘徒众’, 0.7705309391021729),
    (‘无量剑’, 0.7679233551025391),
    (‘星宿’, 0.7651693820953369)]

通过上面两个模型得到的结果可以大概感受到各个名门正派和各个其他派之间的关系以及每个门派相关的人物和主要的事物的关系等等。

(4)通过编写的函数发掘一下不同小说中人物的对应关系

print(find_relation("张无忌","赵敏","段誉"))
print(find_relation("张无忌","赵敏","乔峰"))
print(find_relation("张无忌","赵敏","令狐冲"))
print(find_relation("张无忌","赵敏","郭靖"))
print(find_relation("虚竹","小无相功","张无忌"))
print(find_relation("虚竹","小无相功","乔峰"))
print(find_relation("虚竹","小无相功","段誉"))
print(find_relation("虚竹","小无相功","令狐冲"))
print(find_relation("周芷若","峨嵋派","张无忌"))
print(find_relation("周芷若","峨嵋派","赵敏"))
print(find_relation("周芷若","峨嵋派","令狐冲"))
print(find_relation("周芷若","峨嵋派","虚竹"))
print(find_relation("张无忌","赵敏","韦小宝"))
print(find_relation("张无忌","周芷若","韦小宝"))
print(find_relation("张无忌","小昭","韦小宝"))
print(find_relation("张无忌","殷离","韦小宝"))

  1. CBOW模型下结果:
    段誉 王语嫣
    None
    乔峰 杨康
    None
    令狐冲 陆无双
    None
    郭靖 黄蓉
    None
    张无忌 中使
    None
    乔峰 争斗
    None
    段誉 分辨
    None
    令狐冲 奈何
    None
    张无忌 少林
    None
    赵敏 武当山
    None
    令狐冲 武当
    None
    虚竹 武当
    None
    韦小宝 公主
    None
    韦小宝 不答
    None
    韦小宝 公主
    None
    韦小宝 空心菜
    None
  2. skip-gram模型下结果:
    段誉 王语嫣
    None
    乔峰 阿朱
    None
    令狐冲 岳不群
    None
    郭靖 黄蓉
    None
    张无忌 要诀
    None
    乔峰 华山论剑
    None
    段誉 奥秘
    None
    令狐冲 要诀
    None
    张无忌 第三代
    None
    赵敏 西宗
    None
    令狐冲 华山派
    None
    虚竹 第三代
    None
    韦小宝 双儿
    None
    韦小宝 双儿
    None
    韦小宝 方怡
    None
    韦小宝 梦见
    None

在这些得到的结果中,发现skip-gram模型在这个数据集上有着更好地表现,大部分对应关系还是很合理的。但是由于设置的类比可能也存在一些问题,所以除了人物对人物的对应关系外,很多的结果是比较乱来的,比如对应武功时出现了要诀等词汇。
另外在人物对人物的关系也不是全都十分合理的,上头也有些很搞笑的,尤其是令狐冲喜欢陆无双?还有令狐冲的真爱是岳不群这个我是万万没想到的,,,属实有点离谱哈哈哈哈。

4.2实验分析

通过上面得到的两种模型下的实验结果,可以看出在一些情况下,会出现胡乱对应的情况,说明部分停词可能去除的还不够干净,而两种模型得到的结果也是在很多情况下不相同的,总得从结果看来,CBOW模型,更注重文章整体的关联,很多相似度高的词跨越了多个时代和多本小说,而skip-gram模型更加注重局部,相似度高的词基本集中在同一本小说中。
在这个金庸武侠小说的数据集中,尤其是关于一些对应关系等情况,skip-gram模型的表现更好一些。

4.3实验代码

链接:https://pan.baidu.com/s/1JHGNWELYcNgmmlk1pg4ZMA
提取码:1234

  • 6
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
深度学习进阶自然语言处理是指在深度学习的基础上,更加深入地应用于自然语言处理领域的技术和方法。它主要包括以下几个方面的内容: 1. 词向量表示:深度学习进阶自然语言处理中,常用的一种技术是将词语表示为向量形式,以便于计算机进行处理。常见的词向量表示方法有Word2Vec、GloVe等。 2. 语言模型:语言模型是自然语言处理中的一个重要任务,它用于预测下一个词语或者句子的概率。深度学习方法可以通过使用循环神经网络(RNN)或者Transformer等模型来建立语言模型。 3. 序列标注:序列标注是指给定一个输入序列,为每个输入元素打上相应的标签。在自然语言处理中,常见的序列标注任务包括命名实体识别、词性标注等。深度学习方法可以通过使用条件随机场(CRF)或者长短时记忆网络(LSTM)等模型来解决序列标注问题。 4. 文本分类:文本分类是指将文本划分到不同的类别中。在自然语言处理中,常见的文本分类任务包括情感分析、垃圾邮件过滤等。深度学习方法可以通过使用卷积神经网络(CNN)或者循环神经网络(RNN)等模型来进行文本分类。 5. 机器翻译:机器翻译是指将一种语言的文本转换为另一种语言的文本。深度学习方法可以通过使用编码-解码模型,如循环神经网络(RNN)或者Transformer等模型来进行机器翻译。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值