4.5 深度学习应用_第1页
4.5 深度学习应用_第2页
4.5 深度学习应用_第3页
4.5 深度学习应用_第4页
4.5 深度学习应用_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据技术在会计与财务中的应用作者:张敏等2026/9/8《大数据技术在会计与财务中的应用》配套课件第4章·4.5深度学习在文本分析中的应用2026/9/7目录4.5.1文本分类中的深度学习模型分类和介绍4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析的应用4.5深度学习在文本分析中的应用|02/17掌握文本分析的基本技术后,下面我们将介绍深度学习技术在文本分析中的应用。之前所述的正则提取、情感分析和机器学习方法主要基于人工提取的特征,然后使用机器学习算法进行分类。这种方法的缺点在于,人工提取的特征可能不是最优的。深度学习技术可以自动提取最优的特征,因此在文本分析中有着越来越广泛的应用。4.5.1文本分类中的深度学习模型分类和介绍4.5深度学习在文本分析中的应用|03/17在文本分析领域,常用的深度学习模型包括:(1)卷积神经网络(CNN)(2)循环神经网络(RNN)及其变体。(3)长短期记忆网络(LSTM)。(4)Transformer和基于Transformer的模型(如BERT、GPT系列)。4.5.1文本分类中的深度学习模型分类和介绍4.5深度学习在文本分析中的应用|04/17接下来我们依然通过具体的代码,利用Keras深度学习库来学习LSTM模型在文本分类中的应用,以下是Python代码和相关解释:(1)导入相关库并进行文本预处理。如前所述,准备阶段的工作至关重要。#导入相关库

fromkeras.datasetsimportimdb

fromtensorflowimportkeras

importtensorflowastf

importpandasaspd

importnumpyasnp

fromkeras.layersimportLSTM,Activation,Dropout,Dense,Input

fromkeras.layersimportEmbedding

fromkeras.modelsimportModel

importstring

importre

fromkeras.preprocessing.textimportTokenizer

fromsklearn.preprocessingimportLabelBinarizer

fromkeras.preprocessing.sequenceimportpad_sequences

importkeras

fromsklearn.model_selectionimporttrain_test_split

#本节我们依旧采用IMDB数据库,这是一个情感分类数据库,包含了50000条电影评论,每条评论都被标记为正面或负面。我们将使用RNN和LSTM来对这些评论进行情感分类。#读取数据4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|05/17#读取数据data=pd.read_csv(r"IMDBDataset.csv")

#转换为小写

data['review']=data['review'].str.lower()

#定义一些停用词,这些词在文本中没有实际意义,会被去除stopwords=["a","about","above","after","again","against","all","am","an","and","any","are","as","at","be","because","been","before","being","below","between","both","but","by","could","did","do","does","doing","down","during","each","few","for","from","further","had","has","have","having","he","he'd","he'll","he's","her","here","here's","hers","herself","him","himself","his","how","how's","i","i'd","i'll","i'm","i've","if","in","into","is","it","it's","its","itself","let's","me","more","most","my","myself","nor","of","on","once","only","or",other","ought","our","ours","ourselves","out","over","own","same","she","she'd","she'll","she's","should","so","some","such","than","that","that's","the","their","theirs","them","themselves","then","there","there's","these","they","they'd","they'll","they're","they've","this","those","through","to","too","under","until","up","very","was","we","we'd","we'll","we're","we've","were","what","what's","when","when's","where","where's",which","while","who","who's","whom","why","why's","with","would","you","you'd","you'll","you're","you've","your","yours","yourself","yourselves"]

#定义一个函数,用于去除停用词defremove_stopwords(data):

data['reviewwithoutstopwords']=data['review'].apply(lambdax:''.join([wordforwordinx.split()ifwordnotin(stopwords)]))

returndata

4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|06/17#定义一个函数,用于去除html标签

defremove_tags(string):

result=re.sub('<.*?>','',string)

returnresult

#去除停用词

data_without_stopwords=remove_stopwords(data)

#去除html标签

data_without_stopwords['clean_review']=data_without_stopwords['reviewwithoutstopwords'].apply(lambdax:remove_tags(x))

data_without_stopwords['clean_review']=data_without_stopwords['clean_review'].str.replace('[{}]'.format(string.punctuation),'')#去除标点符号reviews=data_without_stopwords['clean_review']

#这一步是将数据转换为list,因为keras的tokenizer只接受list类型的数据reviews_list=[]

foriinrange(len(reviews)):

reviews_list.append(reviews[i])

sentiments=data_without_stopwords['sentiment']

#这里是把positive的标签转换为1,negative的标签转换为0,因为机器学习模型只能接受数字类型的标签

y=np.array([1ifsentiment=="positive"else0forsentimentinsentiments])4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|07/17(2)划分训练集和测试集并定义和训练分词器。接下来对数据集进行划分,将数据集划分成训练集和测试集。训练集用于训练模型,测试集用于检验模型的表现。#划分训练集和测试集,测试集占20%X_train,X_test,Y_train,Y_test=train_test_split(reviews_list,y,test_size=0.2,random_state=45)

#下面我们来设定Tokenizer。需要注意的是,无论我们把num_words这个参数设定为多少,tokenizer都会自动把所有词按照词频降序排序。但是当我们调用tokenizer.texts_to_sequences()时,只有前num_words个词会被考虑在内,其他词会被舍弃。所以这里的目的是把词频较低的词舍弃掉,以减少计算量。tokenizer=Tokenizer(num_words=5000)

#用训练集训练tokenizertokenizer.fit_on_texts(X_train)

#为了确定词汇表的大小,我们需要知道有多少个不同的单词。我们可以通过tokenizer.word_index来获得。words_to_index=tokenizer.word_index需要注意,计算机无法识别文字语言,因此我们要将单词转化为向量。这里我们不再使用自己训练的词向量,而是使用预训练的Glove词向量。Glove词向量比我们自己训练的词向量更加准确,因为它是利用了维基百科的语料库训练出来的。4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|08/17#以下这个函数是用来读取glove词向量的,返回的是一个字典,key是单词,value是对应的词向量

#glove是一个txt文件,每一行的第一个元素是单词,后面的元素是对应的词向量

defread_glove_vector(glove_vec):

withopen(glove_vec,'r',encoding='UTF-8')asf:

words=set()

word_to_vec_map={}

forlineinf:

w_line=line.split()

#glove文件每一行的第一个元素是单词

curr_word=w_line[0]

#glove文件每一行的后面的元素是词向量

word_to_vec_map[curr_word]=np.array(w_line[1:],dtype=np.float64)

returnword_to_vec_map

#调用该函数,得到词向量字典,每一个单词对应一个50维的词向量

word_to_vec_map=read_glove_vector('glove.6B.50d.txt')

#下面这个参数maxLen是用来限制每个评论的长度的,如果评论的长度大于150,那么就截取前150个单词,这叫truncating,如果评论的长度小于150,那么就在评论的后面填充0,这叫padding

maxLen=1504.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|09/17(3)构建模型的embedding层结构。我们首先开始构建LSTM模型的embedding层,这一层的作用是将文本数据转换为词向量,方便计算机处理,这一步的关键步骤是先确定几个参数,分别是单词的个数,词向量的维度,以及每个文本的长度。#定义词汇表的大小vocab_len=len(words_to_index)

#定义词向量的维度,test是一个单词,也可以换成其他单词

embed_vector_len=word_to_vec_map['test'].shape[0]

#初始化词向量矩阵,行数为词汇表的大小,列数为词向量的维度

emb_matrix=np.zeros((vocab_len,embed_vector_len))

forword,indexinwords_to_index.items():

embedding_vector=word_to_vec_map.get(word)

ifembedding_vectorisnotNone:

emb_matrix[index,:]=embedding_vector

#这个定义的是一个字典,key是单词,value是对应的词向量,这里是把词向量矩阵的每一行都赋值为对应的词向量

embedding_layer=Embedding(input_dim=vocab_len,output_dim=embed_vector_len,input_length=maxLen,weights=[emb_matrix],trainable=False)

#上述代码定义了整个神经网络的第一层,也就是embedding层,input_dim是词汇表的大小,output_dim是词向量的维度,input_length是每个评论的长度(我们已经设定为150了),weights是词向量矩阵,trainable=False表示词向量矩阵不参与训练

#经过这一层之后,每个评论都会变成一个150*50的矩阵,也就是每个评论有150个词,每个词用一个50维的词向量表示。4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|10/17(4)构建LSTM模型。我们开始构建LSTM模型,具体的结构是embedding层,LSTM层以及全连接层。Embedding层将文本数据转换为词向量,LSTM层用于提取文本中的特征,全连接层用于分类。#定义整个模型的结构,input_shape是输入的维度,也就是这种格式的矩阵(评论的数量,150)defimdb_rating(input_shape):

#这个是整个模型的输入,维度是(评论的数量,150)每个评论有150个单词,每个数字代表一个单词在词汇表中的索引

X_indices=Input(input_shape)

#这里是把输入的数字序列转换为词向量序列,维度是(评论的数量,150,50)

embeddings=embedding_layer(X_indices)

#这里是LSTM层,128是LSTM层的神经元数量,return_sequences=True表示返回整个序列,而不是只返回最后一个时间步的输出,维度是(评论的数量,150,128)

X=LSTM(128,return_sequences=True)(embeddings)

#dropout层,防止过拟合,基本的原理是在训练过程中随机地让一部分神经元停止工作,维度不变

X=Dropout(0.6)(X)

X=LSTM(128,return_sequences=True)(X)

X=Dropout(0.6)(X)

X=LSTM(128)(X)

#最后是一个全连接层,维度是(评论的数量,1),激活函数是sigmoid,sigmoid函数可以把一个实数映射到0到1之间,表示概率

X=Dense(1,activation='sigmoid')(X)

model=Model(inputs=X_indices,outputs=X)

returnmodel

model=imdb_rating((maxLen,))4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|11/17(5)对输入的数据进行处理。首先是把文本转换为词向量,然后是对文本进行填充,使得每个文本的长度相同。#这里是把训练集的评论转换为数字序列,维度是(评论的数量,150),作为我们神经网络的输入,150代表每个评论的长度,这个是我们预先设定的参数X_train_indices=tokenizer.texts_to_sequences(X_train)

#padding,填充操作,每个评论的长度不一样,我们需要把他们都填充到150这个长度X_train_indices=pad_sequences(X_train_indices,maxlen=maxLen,padding='post')

X_train_indices.shape(6)模型训练。我们的模型已经包含了embedding层,所以当我们输入这些数字序列时,模型会自动将其转换为词向量。接下来对模型进行训练,这里我们使用了Adam优化器,交叉熵损失函数,以及准确率作为评估指标。#优化器,作用是更新神经网络的参数,使得损失函数最小化adam=tf.optimizers.Adam(learning_rate=0.0001)

#目的是编译模型,loss是损失函数,metrics是评价指标,这里是准确率

pile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])

#batch_size是每次训练的样本数量,epochs是训练的轮数

model.fit(X_train_indices,Y_train,batch_size=64,epochs=15)4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|12/17(7)模型表现的评估。模型训练完毕,接下来我们对模型进行评估,注意评估过程使用的是测试集数据。#把测试集的评论转换为数字序列X_test_indices=tokenizer.texts_to_sequences(X_test)

#填充

X_test_indices=pad_sequences(X_test_indices,maxlen=maxLen,padding='post')

#评估模型,返回的是损失函数值和准确率

#计算准确率,精确率,召回率,F1值

model.evaluate(X_test_indices,Y_test)

fromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score

#预测测试集的标签

y_pred=model.predict(X_test_indices)

#因为我们的标签是0和1,所以我们把预测的概率值四舍五入

y_pred=np.round(y_pred)

4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|13/17#计算准确率

accuracy=accuracy_score(Y_test,y_pred)

#计算精确率

precision=precision_score(Y_test,y_pred)

#计算召回率

recall=recall_score(Y_test,y_pred)

#计算F1值

f1=f1_score(Y_test,y_pred)

print("accuracy:",accuracy)

print("precision:",precision)

print("recall:",recall)

print("f1:",f1)4.5.2深度学习进行文本分类的实战4.5深度学习在文本分析中的应用|14/17(8)使用模型进行预测。最后是预测环节,定义一个函数,利用训练好的模型对新的文本进行情感分类。#在这里我们定义一个函数,用于给数据集中的每一条评论打分defadd_score_predictions(data,reviews_list_idx):#定义新的列,用于存放情感分数,初始化为0

data['sentimentscore']=0

#利用训练好的模型,对评论进行预测

review_preds=model.predict(reviews_list_idx)

#把预测的值存放到新的列中

data['sentimentscore']=review_preds

#以0.5为阈值,大于0.5的评论为positive,小于0.5的评论为negative

pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论