版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大数据技术在会计与财务中的应用作者:张敏等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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2.2《养成亲社会行为》教学设计 2026-2027学年度道德与法治八年级上册 统编版
- 蓝色5S整改工作汇报
- 合规转利润:降本增效全指南(2026)《GBT 39259-2020绿色制造 制造企业绿色供应链管理 物料清单要求》
- 合规转利润:降本增效全指南(2026)《GBT 39182-2020家用和类似用途热泵热水器安装规范》
- 合规转利润:降本增效全指南(2026)《GBT 39113-2020鞋类 鞋类和鞋类部件中存在的限量物质 苯酚的测定》
- 江苏省镇江市镇江外国语学校2025-2026学年九年级(下)月考化学试卷(4月份)(含答案)
- 2026年浙江省高中数学三角函数专题训练题库
- 湖北省部分学校2027届高三上学期9月开学学业评估物理试卷(含答案)
- 合规转利润:降本增效全指南(2026)《GBT 39039-2020高强度钢氢致延迟断裂评价方法》
- 网络安全风险2026年网络安全合规协议
- 智慧医疗分级评价方法及标准(2025版 官方完整版)
- 井工煤矿生产时期排水技术规范
- JJG 1061-2010液体颗粒计数器
- 人教版三年级数学下册第五单元大单元教学任务单
- JB T 7689-2012悬挂式电磁除铁器
- 光电功能材料与器件
- E7房屋建筑工程竣工验收报告书(辽宁省)
- 如何阅读文献
- 保健食品(第二版)PPT完整全套教学课件
- 【电气专业】15D501建筑物防雷设施安装
- 地面大理石及花岗石等铺贴工艺及技术要求
评论
0/150
提交评论