《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx

上传人:极速器 文档编号:591430 上传时间:2025-09-01 格式:DOCX 页数:9 大小:31.05KB
下载 相关 举报
《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx_第1页
第1页 / 共9页
《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx_第2页
第2页 / 共9页
《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx_第3页
第3页 / 共9页
《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx_第4页
第4页 / 共9页
《自然语言处理技术》——实训13 基于LSTM实现情感分析.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、项目3深入文本进阶处理基于LSTM实现情感分析1实训目标(1) 熟练进行情感语料的读取,以及评论词语的向量化。(2) 熟练使用torch库中的LSTM类构建LSTM模型。(3) 熟练掌握LSTM模型接收训练数据进行训练的步骤。(4) 熟练掌握LSTM模型预测效果测试的方法。2实训环境环境版本说明Windows1064电脑操作系统Python3.8.5Python语言版本pandas1.3.0主要用于数据读取、清洗等操作NumPy1.21.6主要用于Python中的数值计算jieba0.42.1主要用于文本分词Gensim4.2.0主要用于检索文本、计算文本相似度、训练词向量、建模主题等Matp

2、lotlib3.3.0主要用于数据可视化PaddlePaddle2.4.2是一个深度学习框架,提供了高效的计算框架和优化算法PaddleSpeech1.2.0主要用于语音和音频中的各种关键任务的开发scikit-leam1.0.2广泛地用于统计分析和机器学习建模等数据科学领域Librosa0.8.1主要用于分析一般的音频信号,是一个非常强大的Python语音信号处理的第三方库NLTK3.5是一个常用的自然语言处理工具包,可用于文本处理、语义分析、词性标注等SciPy1.7.3是一个科学计算工具包,可用于数学、科学、工程学等领域pyttsx32.9.0主要用于将文本转换成语音3实训说明情感分析的

3、数据来源为某电商平台的热水器评论数据,其中正面评论10677条,负面评论10428条。本任务的目的是通过构建模型识别各条评论的情感倾向,即情感分析,正面评论为1,负面评论为0。情感分析基本流程如图3-1所示。图3-1情感分析流程图4实训步骤4.1 读取正负情感语料由于情感分析的目的是将数据划分为正面和负面标签,故需将正负语料的数据进行“贴标签”处理,正面评论标签为1,负面评论标签为0,读取语料数据如代码3-1所示。代码3-1读取语料数据importpandasaspd#读取正负情感语料dataset=pd.read-csv(,.dataChnSentiCorp-htLall.csv).drop

4、na()df=dataset,label,review,reviews=df.review.values.tolist()labels=df.label.values.tolist()reviews=df.review.values.tolist()labels=df.label.values.tolist()4.2 评论词语向量化由于数据为评论文本的形式,不能直接用于建模,所以需要对评论数据进行文本的分词处理,计算每个词语出现的频次,将分词结果进行向量化,变为模型可以识别的数据形式。由于每一串索引的长度并不相等,所以为了方便模型的训练,需要将索引的长度标准化,这里每条评论取50个词作为标准。

5、最后再将数据划分为训练集和测试集以便建模训练。将评论文本中的词语向量化,并划分数据,如代码3-2所示。代码3-2词语向量化并划分数据importjieba#分词,去除停用词,生成词汇表withopen(.datastopwordsHIT.txt,r)asf:stopwords-list=line.strip()forlineinf.readlines()#加载停用词表并去重vocab=#词汇表forreviewinreviews:text=review#使用结巴分词库对文本进行分词disease_List=list(set(jieba.cut(text)#去除停用词filtered=wforw

6、indisease_Listif(wnotinStoPWOrdsist)vocab.cxtend(filtered)#将分词结果加入词汇表vocab=list(set(vocab)#去重# 将词汇表中的词语映射为数字IDVocab=dict()Vocab.setdefault(,0)foriinrange(len(vocab):Vbcabvocabi=i+1# 将评论文本转化为数字ID序列defgeneratejds(review):text=reviewdisease_List=list(set(jieba.cut(text)filtered=wforwindisease_Listif(wn

7、otinstopwords_list)|res=Vocabvalforvalinfilteredreturnres# 将评论的数字ID序列标准化,使它们具有相同的长度pad-size=50#每条评论的长度input_ids=#记录评论的数字ID序列label=#记录评论的标签foriinrange(len(df):ids=generate-ids(reviewsi)#将评论文本转化为数字ID序列iflen(ids)pad_size:ids=ids+0*(pad_size-len(ids)#在数字ID序列末尾填充0else:ids=ids:pad_size#如果数字ID序列超过了指定的长度,那么

8、将其截断inputjds.append(ids)label.append(int(labelsi)#将标签加入label列表中# 划分训练集和测试集# 将样本随机打乱importnumpyasnprandom-rder=list(range(len(input_ids)np.random.seed(2023)#设置随机种子,以确保每次运行时结果相同np.random,shuffle(random_order)# 将样本分成训练集和测试集input_ids_train=np.array(input_idsiforiinrandom_order:int(len(input_ids)*0.8)y_t

9、rain=np.array(labeliforiinrandom_order|:int(len(input_ids)*0.8)input_ids_test=np.array(inputjdsiforiinrandom_orderint(len(input_ids)*0.8):)y_test=np.array(labeliforiinrandom_order|int(len(input_ids)*0.8):)1)PrintC训练集样本量:1en(inPULidSJrain)Print(测试集样本量:,len(inputjds-test)运行代码3-2,并输出训练集和测试集样本量如下。训练集样本量

10、6212测试集样本量:15534.3模型构建设置模型参数,包括词汇表的大小、词嵌入向量的维度、LSTM层隐藏状态的维度、情感分类的类别数等,最后构建LSTM模型,代码3-3所示。代码3-3模型构建importtorchimporttorch.nnasnn#定义LSTM模型classLSTMModel(nn.Module):def_init_(self,vocab_size,embed_size,hidden_size,num_classes):super(LSTMModel,self)._init_()# 定义词嵌入层Selfembcdding=nn.Embcdding(vocab_size

11、embcd_size)# 定义LSTM层self.Istm=nn.LSTM(embed-size,hiddcn_size,batch_first=True)# 定义全连接层self.fc=nn.Linear(hiddcn_size,num_classes)defforward(self,x):# 将输入的词语ID序列转化为词嵌入向量embedded=self.embedding(x)# 将词嵌入向量输入到LSTM层中out,_=self.lstm(embedded)# 将LSTM层的输出传入全连接层out=self.fc(out:,-1,:)returnout#设置模型的参数vocab_si

12、ze=len(vocab)#词汇表的大小embed_size=100#词嵌入向量的维度hidden_size=128#LSTM层的隐藏状态的维度num_classes=2#情感分类的类别数#创建LSTM模型model=LSTMModel(vocab_size,embed_size,hidden_size,num_classes)在构建基于LSTM的情感分类模型时,使用了3个关键的神经网络层,主要为词嵌入层、LSTM层和全连接层,设置3个神经网络层的函数及其参数说明如表3-1所示。表3-1LSTM模型中的3个关键层函数说明函数说明参数nn.Embedding词嵌入层。将输入的词语ID序列转换为词

13、嵌入向量vocab_size:词汇表大小embed_size:词嵌入向量维度nn.LSTMLSTM层。用于处理序列数据,捕捉长期依赖关系embed_size:词嵌入向量维度hidden_size:隐藏状态维度batch_first:指定输入张量的形状中是否将批处理大小放在第一个维度nn.Linear全连接层。将LSTM层的输出转换为最终的类别预测hidden_size:隐藏状态维度num_classes:情感分类类别数4.4模型训练针对搭建好的模型,设置模型超参数并进行训练设置,其中,损失值设为CrossEntropyLoss,优化器设为“Adam”、每批训练数据个数设为32、总迭代轮次设为1

14、0,如代码3-4所示。代码3-4模型训练importtorch.optimasoptimfromtorch.utils.dataimportDataset,DataLoaderfromtorch.utils.dataimportTensorDataset,RandomSampler,DataLoader,SequentialSampler#定义自定义数据集类classSentimentDataset(Dataset):def_init_(self,data,labels):self.data=dataself,labels=labelsdef_getitem_(self,index):retu

15、rnself.dataindex,self.labelsindexdef_Ien_(self).returnIen(self.data)#设置超参数batch.size=32#每次训练的数据批次大小num_epochs=10#迭代次数# 初始化数据集和数据加载器train_data=TensorDataset(torch.LongTensor(input_ids_train),torch.LongTensor(y-train)# 随机采样器用于在训练数据中随机选取样本组成个baichtrain_sampler=RandomSampler(train_data)trainjoader=DataL

16、oader(train_data,sampler=train_sampler,batch_size=batch_size)test_data=TensorDataset(torch.LongTensor(input_ids_test),torch.LongTensor(y-test)# 顺序采样器用于在测试数据中按顺序选取样本组成一个batchtest_sampler=SequentialSampler(IesCdata)testjoader=DataLoader(test_data,sampler=test_sampler,batch_size=batch_size)# 初始化模型、损失函数

17、和优化器model=LSTMModel(vocab_size,embed_size,hidden_size,num_classes)criterion=nn.CrossEntropyLoss()#交叉燧损失函数optimizer=optim.Adam(model.parameters(),lr=0.001)#Adam优化器# 训练模型total_step=len(trainjoader)#计算总的训练步数forepochinrange(num_epochs):fori,(data,labels)inenumerate(trainjoader):# 正向传播outputs=model(data)

18、loss=criterion(outputs,labels.squeeze()# 反向传播和优化optimizer.zer-grad()loss.backward()optimizer.step()# 打印状态信息if(i+l)%100=0:print(Epoch),Step),Loss:.4f),.format(epoch+l,num_epochs,i+l,total_step,loss.item()在训练深度学习模型时,通常需要将数据集分成多个批次进行训练,在此过程中使用到TensorDataset和DataLoader函数来实现对数据集的处理。TensorDataset和DataLoad

19、er函数的作用及其参数说明如表3-2所示。表32TensorDataset和DataLoader函数的作用及其参数说明函数说明参数TensorDataset将输入数据转换为适合训练的数据集格式torch.LongTensor(input_ids_train):训练数据的输入ID序列torch.LongTensoKyJrain):训练数据的标签DataLoader根据指定的采样器和批次大小创建数据加载器,用于在训练过程中加载数据train_data:TensorDataset格式的训练数据集train_sampler:数据采样器batch_size:每个批次的样本数量同时,在训练深度学习模型时,

20、还需要选择一个优化器来更新模型参数。此代码中使用到Adam优化器。Adam优化器的常用参数说明如表3-3所示。表3-3Adam优化器的常用参数说明参数名称参数说明parameters接收list,表示模型参数,用于更新模型参数,多用于优化器的初始化,无默认值Ir接收noat,表示学习率,又称为步长因子,控制了权重的更新比率,较大的值更新前会有更快的初始学习,而较小的值会令训练收敛到更好的性能。默认为le-3运行模型训练代码后,训练过程输出结果如下。Epoch1/10,Step100/195,Loss:0.4767Epoch2/10,Step100/195,Loss:0.5186Epoch3/1

21、0,Step100/195,Loss:0.5767Epoch4/10,Step100/195,Loss:0.3618Epoch5/10,Step100/195,Loss:0.1925Epoch(6/101,Step100/195,Loss:0.0633Epoch7/10,Step100/195,Loss:0.0628Epoch8/10,Step100/195,Loss:0.2164Epoch9/10,Step100/195,Loss:0.0051Epoch10/10,Step100/195,Loss:0.0053从模型训练代码的运行结果可以看出,模型在测试集上的损失值随着模型训练次数的增加,该

22、值整体呈下降趋势。4.5模型测试对训练好的模型使用测试数据进行测试,输出模型的评价结果,如代码3-5所示。代码3-5模型测试fromsklearnimportmetrics#使用测试数据进行模型测试model.eval()predict=withtorch.no_grad():fordata,labelsintest_loader:outputs=model(data)predicted=torch.max(outputs.data,1)predict.extend(predicted.detach().numpy()#模型评价acc=metrics.accuraCy-SCOre(y_test

23、predict)PrintC测试集的准确率为:,acc)Printc精确率、召回率、Fl值分别为:,)print(metrics.classification_report(y_test,predict)PrintC混淆矩阵为:,)cm=metrics.confusion_matrix(y_test,predict)#7昆淆矩阵print(cm)在评估分类模型的性能时,混淆矩阵是一个很有用的工具。metrics.confusion_matrix函数可以计算一个分类模型的混淆矩阵,可以展示各类别之间的实际值与预测值之间的关系,该函数的常用参数说明如表3-4所示。表3-4metrics.conf

24、usion_matrix函数的常用参数说明参数名称参数说明y_true接收numpy数组或list,表示真实的类别标签,通常是一个一维数组或列表。无默认值y_pred接收numpy数组或list,表示预测的类别标签,通常是一个一维数组或列表。无默认值在模型测试代码,输出模型的评价结果如下。测试集的准确率为:0.819703799098519精确率、召回率、Fl值分别为:precisionrecallfl-scoresupport00.710.770.7451310.880.850.861040accuracy0.821553macroavg0.800.810.801553weightedavg0.820.820.821553混淆矩阵为:394119161879从模型的评价结果可以看出,模型在测试集上的准确率约达到了082,为此,可以认为情感分析模型的效果较好。除此之外,用户还可以通过调整模型的参数以达到更好的效果。5实训小结技术点自评达标未达标能够成功读取语料库能够对评论文本进行分词、去停用词、词语向量化、划分数据等熟练使用torch库中的LSTM类构建LSTM模型能够对LSTM模型接收训练数据进行训练能够对LSTM模型预测效果进行测试心得体会(如遇到的问题及解决方法、存在的不足之处等):

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 论文 > 毕业论文

宁ICP备18001539号-1