NLP Learning | 初识NLP

微调Helsinki-NLP-en-zh模型 Helsinki-NLP 是一个广泛使用的开源机器翻译(Machine Translation,MT)模型系列,基于 Marian NMT 框架原本的模型对于国内外公司的名称支持度很差,比如会把‘FireFox‘翻译成‘消防’,所以我需要在保留原本翻译能力的基础上,增强对公司名称的翻译能力。 阅读详情
NLP的Demo工具和预处理技术

自然语言处理(英语:Natural Language Processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言处理包括多方面和步骤,基本有认知、理解、生成等部分。
从今天开始,我将和大家一起学习自然语言处理的一些基础知识及经典模型,探索深度学习的另一神奇领域。

1 体验自然语言乐趣的小工具:Pipeline

Pipeline是由 Hugging Face开发的一个用于多种NLP任务的深度学习包,其主要贡献在于对文本预处理、模型构建、结果表示等主要过程进行封装,实现端到端的输入输出,并且几乎支持所有主流的预训练模型。
本次实验主要选取Pipeline中的情感分析、文本翻译、摘要提取共三个功能,利用实际应用中的例子进行测试。

1.1 情感分析

情感分析是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,主要用于预测电影票房、股票趋势、舆情分析、改进服务及产品、及了解用户的体验等。本实验中情感分析输入输出如表1所示。
在这里插入图片描述

情感分析代码片段如下:

# 1.情感分析代码片段
# 介绍:分析文本情感
# 1.情感分析示例
classifier = pipeline("sentiment-analysis")
classifier_sentence=[
"I like apple",# Positive
"I hate this so much!", # Negative
    "I've been waiting for a HuggingFace course my whole life." ,# Positive
    "Aiming at the real-time detection of multiple objects and micro-objects in large-scene RS images,a cascaded convolutional neural network real-time object-detection framework for RS images is proposed,which integrates visual perception and convolutional memory network reasoning."# Positive]
print("="*27,"情感分析输出{}\n{}".format("="*27,classifier(classifier_sentence)))

输出结果:

======================== 情感分析输出========================
[{'label': 'POSITIVE', 'score': 0.9995661377906799},
{'label': 'NEGATIVE', 'score': 0.9994558691978455},
{'label': 'POSITIVE', 'score': 0.9598046541213989},
{'label': 'NEGATIVE', 'score': 0.6896899342536926}]

1.2 文本翻译

文本翻译是利用计算机将一种自然语言(源语言)转换为另一种自然语言(目标语言)的过程,它是计算语言学的一个分支,具有重要的科学研究价值。本实验采用Helsinki-NLP分支下的opus-mt-en-zh翻译模型进行英译汉操作,其代码片段如下:

# 2.文本翻译代码片段
# 介绍:利用Pipeline中translation功能实现英译汉
# 2.文本翻译
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh")
trans_sentence=[
    'The object detection task and the classification task follow the same process in the image feature extraction part of the network',
    'Object detection is a fundamental problem in the field of Computer Vision, which can be widely used in many fields such as environment monitoring,intrusion detection human-machine interaction and so on.'
]
print("="*27,"文本翻译输出{}\n{}".format("="*27,translator(trans_sentence)))

输出结果:

========================= 文本翻译输出========================
[{'translation_text': '目标探测任务和分类任务在网络图像特征提取部分遵循同样的程序'}, 
{'translation_text': '物体探测是计算机视野领域的一个基本问题,可广泛用于环境监测、入侵探测人体机械相互作用等许多领域。'}]

1.3 摘要提取

摘要提取任务是在尽可能保留主要信息的情况下,将长文本压缩成短文本,对于从海量信息中快速、准确地获取有效信息至关重要。本实验采用sshleifer分支下的distilbart-cnn-12-6模型进行摘要提取,其代码片段如下:

# 3.摘要提取代码片段
# 介绍:利用Pipeline中summarization功能实现自动摘要
# 3.摘要提取
summarizer = pipeline("summarization")
sum_sentence='Automatic object detection technology based on RS image is an intelligent data analysis method to realize automatic classification and location of RS objects. It is one of the important research directions in the field of RS image interpretation, and has received extensive attention in the civil and military fields. Automatic detection of remote sensing objects has played an important role in many practical applications such as urban planning, traffic safety, environmental monitoring and so on.'
print("="*27,"摘要提取输出{}\n{}".format("="*27,summarizer(sum_sentence)),"="*27)

输出结果:

====================== 摘要提取输出======================
[{'summary_text': ' Automatic object detection technology based on RS image is an intelligent 
data analysis method . Automatic detection of RS objects has played an important role in many 
practical applications such as urban planning, traffic safety, environmental monitoring and so on.
It has received extensive attention in the civil and military fields .'}] 

2 英文语料预处理及分析

在数据分析和数据挖掘中,通常需要经历前期准备、数据爬取、数据预处理、数据分析、数据可视化、评估分析等步骤,其中的数据预处理会直接影响后续模型分析的好坏,对于分析结果有重要意义。语料预处理主要指保留语料中有价值的数据,删除噪音数据,本次实验主要采用文本词频分析及文本向量化实现语料预处理。

2.1 文本词频分析

2.1.1 自主实现英文文本分词

由于英文文本天然地具有分词特性,即英文文本可按照单词与单词之间空格直接划分词组,只需将非字母类型的字符进行剔除即可,所以按照这个逻辑,本实验自主编写了英文文本分词函数,其主体内容如下:

# 4.英文分词代码片段
# 介绍:首先使用空格对特殊字符进行替换,然后使用空格分词,最后将上一步结果中的空格剔除,得到最终的英文文本分词结果
def get_words(input_txt):

    for idx in range(len(input_txt)):
        for ch in '!"#$%&()*+,./:;<=>?@[\\]^_‘{|}~£':
            input_txt[idx] = input_txt[idx].replace(ch, ' ')
        input_txt[idx]=[item for item in filter(lambda x: x != '', input_txt[idx].split(' '))]
        return input_txt

对于原始输入:

tv future in the hands of viewers with home theatre systems plasma high-definition. tvs  and digital video recorders moving into the living room the way people watch tv will be radically different in five years time.

经过分词后的结果为:

'tv', 'future', 'in', 'the', 'hands', 'of', 'viewers', 'with', 'home', 'theatre', 'systems', 'plasma', 'high-definition', 'tvs', 'and', 'digital', 'video', 'recorders', 'moving', 'into', 'the', 'living', 'room', 'the', 'way', 'people', 'watch', 'tv', 'will', 'be', 'radically', 'different', 'in', 'five', 'years', 'time'

可以看到,对于我们预定义的标点符号和空格,函数能够较好分词。

2.1.2 词干提取及去停用词操作

在分析语料的过程中,通常会存在一些脏数据或噪声词组干扰我们的实验结果,这就需要对分词后的语料进行数据清洗。比如进行英文分词后,结果中可能存在一些脏数据或停用词,如“a”、“the”、“ours”等。为了得到更好的分析结果,需要使用nltk工具进行词干提取及停用词剔除,相关内容如下:

# 5.词干提取及停用词剔除代码片段
# 介绍:对英文文本分词结果进行清洗,主要包括get_stemWords操作和get_stopWords
def get_stemWords(sentences):

    porter_stem = PorterStemmer()
    res=[]
    for words in sentences:
        temp = []
        for word in words:
            temp.append(porter_stem.stem(word))
        res.append(temp)
       return res

def get_stopWords(stem_sentences):

    stop_words = stopwords.words("english")
    for idx in range(len(stem_sentences)):
        stem_sentences[idx]=[word for word in stem_sentences[idx] if not word in stop_words]
    return stem_sentences

对于分词后的结果:

'howard', 'hits', 'back', 'at', 'mongrel', 'jibe', 'michael', 'howard', 'has', 'said', 'a', 'claim', 'by', 'peter', 'hain', 'that', 'the', 'tory', 'leader', 'is', 'acting', 'like', 'an', 'attack'

词干提取输出为:

'howard', 'hit', 'back', 'at', 'mongrel', 'jibe', 'michael', 'howard', 'ha', 'said', 'a', 'claim', 'by', 'peter', 'hain', 'that', 'the', 'tori', 'leader', 'is', 'act', 'like', 'an', 'attack'

停用词剔除结果为:

'howard', 'hit', 'back', 'mongrel', 'jibe', 'michael', 'howard', 'ha', 'said', 'claim', 'peter', 'hain', 'tori', 'leader', 'act', 'like', 'attack'

可以看到,对于分词结果,词干提取能够对单词进行还原,得到其对应的词根;停用词剔除则可以将单词中的干扰数据进行去除,得到比较理想的文本数据。

2.1.3 生成语料词表

考虑到后续TF-IDF分析还会使用词表,所以先将词表写入csv文件,写入过程中直接将标签向量化:0- tech;1- business;2- sport;3- entertainment;4- politics

# 6.词表写入代码片段
# 介绍:将清洗后的英文文本分词结果写入csv文件
def write2csv(stopWords,labels):

    contents = []
    for item in stopWords:
        contents.append(" ".join(item))
    with open('fenci_data.csv', "w",newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['contents', 'labels'])
        for idx in range(len(contents)):
            writer.writerow([contents[idx], labels[idx]])

而后本实验调用nltk中的FreqDist统计了预处理后的词频,主要统计分词结果中词频最高的50个单词,其函数主体如下:

# 7.词频统计代码片段
# 介绍:对清洗后的英文文本分词结果进行词频统计
def get_wordFrequency(stopWords):
    for words in stopWords:
        freq_dist = FreqDist(words)
        # for k, v in freq_dist.items():
        #     print(str(k) + ':' + str(v))
    standard_freq_vector = freq_dist.most_common(50)
    return standard_freq_vector

输出结果:

('howard', 14), ('mr', 13), ('said', 8), ('hi', 8), ('parti', 7), ('labour', 6), ('michael', 5), ('tori', 5), ('tell', 5), ('elect', 5)

2.2 文本向量化

权重计算是指通过特征权重来衡量特征项在文档表示中的重要程度,给特征词赋予一定的权重来衡量统计文本特征词,TF-IDF是用于数据分析和信息处理经典的权重计算技术。TF-IDF技术的核心思想是如果某个特征词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来做权重计算。
本实验主要使用Scikit-Learn中的CountVectorizer和TfidfTransformer两个类来计算词频和TF-IDF值。其中,CountVectorizer主要作用是将文本词转换为词频矩阵的形式,再调用fit_transform()函数计算各个词语出现的次数;而后使用TfidfTransformer实现统计vectorizer变量中每个词语的TF-IDF值,TF-IDF值采用矩阵数组的形式存储,每一行数据代表一个文本语料,每一行的每一列都代表其中一个特征对应的权重,得到TF-IDF后就可以运用各种数据分析算法进行分析。

# 8.文本向量化代码片段
# 介绍:将词表中的文本进行向量化
# 特征提取及文本向量化
corpus = TextCollection(stopWords)
name,tf,idf,tf_idf=[],[],[],[]
for item in corpus:
    name.append(item)
    tf.append(corpus.tf(item,corpus))
    idf.append(item)
    tf_idf.append(corpus.tf_idf(item,corpus))
df_dic={"word":name,"TF value":tf,"IDF value":idf,"TF_IDF":tf_idf}
data = pd.DataFrame(df_dic)

3 基于TF-IDF和SVM的英文文本分类

3.1 数据预处理

数据预处理部分主要参照本文第二部分,包括文本分词、词干提取、剔除停用词、文本向量化等操作,这里不再赘述。值得注意的是,最终需要得到文本向量及其对应的标签,这部分的主体代码如下:

# 9.数据预处理代码片段
# 介绍:文本数据及标签预处理
def category2label(data):
	# 文本标签转化为数值标签,方便后续分类计算
    status_dict = data['category'].unique().tolist()
    return data['category'].apply(lambda x: status_dict.index(x))


def textProcessing(data):
    # 文本数据转化为TD-IDF向量
    input_txt=data['text']
    words=get_words(input_txt)
    stemWords=get_stemWords(words)
    stopWords=get_stopWords(stemWords)
    data['contents']=stopWords

    contents=[]
    for item in data['contents']:
        contents.append(' '.join(item))

    vectorizer = CountVectorizer()
    transformer = TfidfTransformer()
    tfidf = transformer.fit_transform(vectorizer.fit_transform(contents))
    word = vectorizer.get_feature_names()
    print("单词数量:", len(word))
    X = coo_matrix(tfidf, dtype=np.float32).toarray()
    return X

3.2 数据划分及模型构建评估

将预处理后的数据使用sklearn中的model_selection库,按照7:3的比例划分为训练集和测试集,利用训练数据进行模型训练,训练结束后再利用测试数据进行模型评估。
调用sklearn中的SVC多分类模型进行模型训练随后使用混淆矩阵对模型的精度进行计算,粗略对模型进行评估,这部分的主体代码如下:

# 10.数据划分及模型构建评估
# 介绍:利用划分后的数据进行模型训练及评估
def train_test(X,Y):

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.3,random_state=1)
    clf = SVC(probability=True).fit(X_train,y_train)
    y_pred = clf.predict(X_test)
    y_pred_np = np.array(y_pred)
    correct_score = (y_pred_np == y_test).sum()
    print("模型的准确率为:{}".format(100 * correct_score / y_test.shape[0]))
    my_confusion_matrix(y_test,y_pred)

3.3 利用混淆矩阵分析实验结果

将混淆矩阵转化为热力矩阵,如图4所示。
可以发现:
(1)模型整体预测效果较好,各类的预测误差都较小。
(2)对于sport、entertainment、business而言,误差分别只有1、1、2,预测精度高于误差为5的tech和politics,其中以样本基数大的sport精度最高。
(3)除business这类以外,其余四个类别的FN数量都为2,其中以样本基数大的sport类召回率最高。
在这里插入图片描述

# 11.绘制混淆矩阵代码片段
# 介绍:利用混淆矩阵绘制热力图
def plot_confusion_matrix(cm, classes, normalize=False, title='confusion matrix', cmap=plt.cm.Blues):
    plt.figure()
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=90)
    plt.yticks(tick_marks, classes)

    plt.axis("equal")

    ax = plt.gca()
    left, right = plt.xlim()
    ax.spines['left'].set_position(('data', left))
    ax.spines['right'].set_position(('data', right))
    for edge_i in ['top', 'bottom', 'right', 'left']:
        ax.spines[edge_i].set_edgecolor("white")

    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        num = '{:.2f}'.format(cm[i, j]) if normalize else int(cm[i, j])
        plt.text(j, i, num,
                 verticalalignment='center',
                 horizontalalignment="center",
                 color="white" if num > thresh else "black")


    plt.xlabel('True')
    plt.ylabel('Predict')
    plt.tight_layout()
    plt.savefig('confusion_matrix.png', transparent=True, dpi=800)

    plt.show()

附录:实验源码及数据

关注微信公众号:炼丹小天才
回复nlp1即可获得实验源码及数据

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现 使用 Helsinki-NLP 中英文翻译本地部署 - python 实现。 通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高,资源占用少,对于翻译要求不高的应用场景可以使用,比如单词,简单句式的中英文翻译。 阅读详情

相关推荐

自然语言处理NLP 2022年最新综述:An introduction to Deep Learning in Natural Language Processing

论文题目:An introduction to Deep Learning in Natural Language Processing: Models, techniques, and tools 摘要:深度学习技术在NLP中的应用;NLP研究中的主要资源,包括软件,硬件和受欢迎的语料库;主要局限性

weixin_42567789的博客 9917

Helsinki-NLP/opus-mt-en-zh和facebook/nllb-200-distilled-600M区别

简单的说,Helsinki-NLP/opus-mt-en-zh是一个机器翻译模型,可以进行英语和中文之间的翻译,而Facebook/nllb-200-distilled-600M是一个自然语言处理模型,适用于多种NLP任务,如分类、命名实体识别和情感分析等。Helsinki-NLP/opus-mt-en-zh和Facebook/nllb-200-distilled-600M是两种截然不同的模型,它们的结构也完全不同。这种情况,所以建议还是使用Helsinki-NLP/opus-mt-zh。

lishijie258的博客 4072

Deep Learning in NLP (一)词向量和语言模型

这篇博客是我看了半年的论文后,自己对 Deep Learning 在 NLP 领域中应用的理解和总结,在此分享。其中必然有局限性,欢迎各种交流,随便拍。   Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果。关于这个原因,引一条我比较赞同的微博。 @王威廉:Steve Renals算了一下icassp录取文章题目中包

zhoubl668的专栏:远帆,梦之帆! 6万+

使用模型Helsinki-NLP/opus-mt-en-zh实现英译中

使用模型Helsinki-NLP/opus-mt-en-zh实现英译中

我的博客 3311

chatGLM基于incontext learning原理微调nlp任务

chatGLM基于incontext learning原理微调nlp任务

小张学AI 999

强推 | 学习自然语言处理(NLP)的学习方法和资料合集

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。 作者:乐雨泉,优秀的nlp学习者,在各类技术论坛和网站署名yuq...

简书博客搬家测试账号 1218

自然语言处理实战:基于Awesome-Machine-Learning的NLP应用开发教程

Awesome-Machine-Learning是一个精心策划的机器学习资源列表,特别专注于CoreML技术,为开发者提供了丰富的工具和模型支持。本教程将带你探索如何利用该项目资源快速构建自然语言处理(NLP)应用,从环境搭建到模型部署,全程干货满满! ## 为什么选择Awesome-Machine-Learning进行NLP开发? Awesome-Machine-Learning汇集了大量C

gitblog_01069的博客 292

《自然语言处理实战入门》NLP未来发展方向

自然语言处理在深度学习的支撑下取得了迅猛发展,总结的过去5年ACL文章中自然语言发展的主要工作,包括 Word embeddings、LSTM、Encode decoder、RNN、Pre-trainedmodel 等,这些技术推动了自然语言的应用,包括基于神经网络的机器翻译,预训练模型演化,阅读理解技术等。

shiter编写程序的艺术 1402

探索自然语言处理的新星: Contrastive Learning-NLP-Papers

探索自然语言处理的新星: Contrastive Learning-NLP-Papers 去发现同类优质开源项目:https://gitcode.com/ 该项目是一个综合性的资源库,专注于收集和整理关于自然语言处理(NLP)中对比学习(Contrastive Learning)的最新研究论文。由维护,该仓库不仅提供了一个方便的知识导航系统,还为研究人员、开发人员和爱好者提供了一扇深入了解这一领域...

gitblog_00056的博客 392

Qlearning在自然语言处理中的应用

Q-learning在自然语言处理中的应用 1. 背景介绍 1.1 自然语言处理概述 自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,旨在使计算机能够理解和生成人类语

AI天才研究院 1020

中文翻译英文模型,opus-mt-en-zh

中文翻译英文模型,opus-mt-en-zh

Deep Learning for NLP · 解读NLP深度学习的各类模型

陈桂敏(Derek),毕业于中山大学计算机系,现职腾讯,追求技术,方向大数据分析和自然语言处理领域。转载自 机器之心。

carrots 1880

Helsinki-NLP 中英文翻译本地部署 - python 实现 模型

Helsinki-NLP 中英文翻译本地部署 - python 实现 模型 * 中文翻译为英文 * 英文翻译为中文 本地部署,自然语言相关。

nlp自然语言处理_免费自然语言处理(NLP)课程及教材分享

16套免费的NLP课程及经典教材分享。 1、自然语言处理圣经《自然语言处理综述 第三版》 Dan Jurafsky and James Martin https://web.stanford.edu/~jurafsky/slp3/ 2、视频课程《深度学习与自然语言处理-2018》 Richard Socher (Stanford University) https://...

weixin_39573136的博客 535

Helsinki-NLP 中英文翻译模型opus-mt-en-zh/opus-mt-zh-en

# Python本地离线运行机器翻译: 中英文翻译模型说明: 英语到中文: Helsinki-NLP/opus-mt-en-zh 中文到英语: Helsinki-NLP/opus-mt-zh-en

Python本地离线运行机器翻译代码示例 基于Hugging Face

# Python本地离线运行机器翻译代码示例 基于Hugging Face 本项目演示了如何调用Hugging Face的大模型实现本地离线实现机器翻译,Python代码简洁易懂,方便上手,能够快速实现强大的离线翻译功能。 使用方法: 1. 安装 transformers 和 tokenizers 库 pip install transformers tokenizers 2. 运行 translation_en_zh.py 进行英译汉翻译;运行 translation_zh_en.py 进行汉译英翻译。 翻译模型库: 英语到中文: Helsinki-NLP/opus-mt-en-zh 中文到英语: Helsinki-NLP/opus-mt-zh-en 中文到日语: Helsink-NLP/opus-mt-zh-ja 中文到法语: Helsink-NLP/opus-mt-zh-fr 在 Hugging Face 可以查找更多模型,替换程序中的模型名字即可。

自然语言处理(六): Deep Learning for NLP: Feedforward Networks

Instead of raw counts, we can weight words using TF-IDF or indicators (0 or 1 depending on presence of words) 我们可以使用 TF-IDF 或指示器(0或1取决于单词的存在)来为单词加权,而不是原始计数。- L1-norm: sum of absolute values of all parameters (W, b, etc) 所有参数(W、 b 等)的绝对值之和。Embeddings。

Abner98414的博客 1763

Qlib+backtrader:2014.1.1-2023.9.20最新回测结果,可以实盘吗?

今年以来,在研究了qlib和backtrader的基础上,把二者结合起来进行了一个策略研究。简单说就是用qlib在200只股票的股票池中进行滚动训练与预测(walk forward),总体数据范围是2005到2023年,以20日间隔滚动训练和预测,最终得到2014.1.1-2023.9.20共10年测试期的收益率预测结果。将预测结果代入backtrader进行回测,得到如下回测结果。

qtbgo的博客 1783

【大模型】Prompt Learning 提示学习

传统的监督学习任务,是去训练一个模型P(y|x),接收x作为输入,去预测y。Prompt learning则依赖于预训练语言模型P(x),通过引入合适的模版template将输入x调整为完形填空格式的x’,调整后的输入x’里含有某些空槽,利用语言模型P将空槽填充后就可以推断出对应的y。例如对于情感分析任务,传统的做法就是训练一个判别模型,去预测输入x对应的标签是positive或者negative,但是如果是prompt learning,则是利用合适模版,将输入x调整为 [x], it is [z]。

酒酿小圆子呀~ 2594

SpringBoot项目整合Knife4j接口文档

写满接口信息的文档,每条接口包括:请求参数,响应参数,接口地址,接口名称,请求类型,请求格式,备注。

诨号无敌鸭的博客 1017

import-im6.q16: attempt to perform an operation not allowed by the security policy `PS‘ @ error/cons

这六个 policy 是使用 XML 格式描述的安全策略。要将其中的限制注释掉,在每个 policy 开始和结束的标记之间添加注释标记“

m0_60657960的博客 1908
上一篇: 【PytorchLearning】基于 UNet 的肺部影像语义分割案例保姆教程
下一篇: 【开源AI平台】Determined调研
Marlowee
博客等级 码龄8年 5万+粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Marlowee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值