《人工智能导论》实验4 循环神经网络(RNN)文本情感分类_第1页
《人工智能导论》实验4 循环神经网络(RNN)文本情感分类_第2页
《人工智能导论》实验4 循环神经网络(RNN)文本情感分类_第3页
《人工智能导论》实验4 循环神经网络(RNN)文本情感分类_第4页
《人工智能导论》实验4 循环神经网络(RNN)文本情感分类_第5页
全文预览已结束

下载本文档

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

文档简介

实验4循环神经网络(RNN)文本情感分类一、实验目的及要求理解循环神经网络(RNN)处理序列数据的基本思想,理解“记忆”与隐藏状态的概念。掌握文本预处理流程:分词、构建词表、序列填充(padding)。掌握使用Keras构建Embedding+LSTM情感分类模型的方法。能够评估模型在测试集上的准确率,并对新评论进行情感预测。理解RNN与CNN/MLP在数据结构和适用场景上的差异。二、实验学时2学时(建议时间分配:讲解10分钟,任务实践70分钟,总结报告10分钟)三、实验前准备软件环境:Python3.8及以上,建议使用JupyterNotebook或VSCode。依赖库:NumPy、Matplotlib、TensorFlow(包含Keras)。安装命令如下:pipinstallnumpymatplotlibtensorflow知识储备:已学习教材第6.4节(循环神经网络)内容,了解序列数据、隐藏状态、LSTM的基本概念。在JupyterNotebook中运行绘图代码前,建议先执行`%matplotlibinline`,以保证图像正常显示。四、实验任务任务1加载与预处理IMDB数据(15分钟)构造模拟情感分析数据集:定义51个词的词汇表(索引0为填充符,1–10为正面词、11–20为负面词、21–50为中性词);生成2,000条评论序列,并用0填充到长度50,使其维度一致。任务2构建Embedding+LSTM模型(15分钟)搭建网络:Embedding层(将词索引映射为16维词向量)→LSTM层(32个单元,dropout=0.2)→Dense输出层(Sigmoid二分类)。任务3训练与评估模型(25分钟)使用Adam优化器和binary_crossentropy损失函数训练模型;记录训练曲线;在模拟测试集上评估准确率。任务4预测新评论情感(10分钟)构造包含较多正面词或负面词的示例序列,预测其情感倾向及置信度。任务5讨论RNN的局限(5分钟)简要讨论RNN的长程依赖问题,以及LSTM如何通过门控机制缓解该问题;提及Transformer作为后续发展方向。参考代码以下为完整可运行代码:#实验九:循环神经网络(RNN)文本情感分类

importwarnings

warnings.filterwarnings('ignore')

importnumpyasnp

importmatplotlib.pyplotasplt

importtensorflowastf

fromtensorflowimportkeras

fromtensorflow.kerasimportlayers

fromtensorflow.keras.preprocessing.sequenceimportpad_sequences

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.metricsimportaccuracy_score,classification_report

#设置中文字体

plt.rcParams['font.sans-serif']=['SimHei','MicrosoftYaHei','ArialUnicodeMS']

plt.rcParams['axes.unicode_minus']=False

print("TensorFlow版本:",tf.__version__)

#1.构造模拟情感分析数据集(无需联网下载)

#词表说明:1-10为正面词,11-20为负面词,21-50为中性词

vocab_size=51

max_len=50

n_samples=2000

np.random.seed(42)

defgenerate_review(label):

length=np.random.randint(25,41)

iflabel==1:#正面评论

n_pos=np.random.randint(7,12)

n_neg=np.random.randint(1,4)

else:#负面评论

n_pos=np.random.randint(1,4)

n_neg=np.random.randint(7,12)

n_neu=length-n_pos-n_neg

words=[]

words.extend(np.random.randint(1,11,size=n_pos).tolist())

words.extend(np.random.randint(11,21,size=n_neg).tolist())

words.extend(np.random.randint(21,51,size=max(0,n_neu)).tolist())

np.random.shuffle(words)

returnwords

all_reviews=[]

labels=[]

for_inrange(n_samples//2):

all_reviews.append(generate_review(1))

labels.append(1)

for_inrange(n_samples//2):

all_reviews.append(generate_review(0))

labels.append(0)

#加入10%标签噪声,模拟真实场景

n_noise=int(0.1*n_samples)

noise_idx=np.random.choice(n_samples,n_noise,replace=False)

foriinnoise_idx:

labels[i]=1-labels[i]

sequences=pad_sequences(all_reviews,maxlen=max_len,padding='post')

labels=np.array(labels)

X_train,X_test,y_train,y_test=train_test_split(

sequences,labels,test_size=0.2,random_state=42

)

print(f"训练样本:{X_train.shape},测试样本:{X_test.shape}")

print(f"词汇表大小:{vocab_size},序列最大长度:{max_len}")

#2.构建Embedding+LSTM模型

model=keras.Sequential([

layers.Input(shape=(max_len,)),

layers.Embedding(input_dim=vocab_size,output_dim=16),

layers.LSTM(32,dropout=0.2,recurrent_dropout=0.2),

layers.Dense(1,activation='sigmoid')

])

model.summary()

pile(optimizer='adam',

loss='binary_crossentropy',

metrics=['accuracy'])

#3.训练

print("\n开始训练LSTM模型...")

history=model.fit(X_train,y_train,epochs=5,batch_size=64,

validation_split=0.1,verbose=1)

#4.评估

test_loss,test_acc=model.evaluate(X_test,y_test,verbose=0)

print(f"\n测试集准确率:{test_acc:.4f}")

y_pred_prob=model.predict(X_test,verbose=0)

y_pred=(y_pred_prob>0.5).astype(int).flatten()

print("\n分类报告:")

print(classification_report(y_test,y_pred,target_names=['负面','正面']))

#5.绘制训练曲线

plt.figure(figsize=(12,5))

plt.subplot(1,2,1)

plt.plot(history.history['loss'],label='训练损失')

plt.plot(history.history['val_loss'],label='验证损失')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.title('损失曲线')

plt.legend()

plt.grid(True)

plt.subplot(1,2,2)

plt.plot(history.history['accuracy'],label='训练准确率')

plt.plot(history.history['val_accuracy'],label='验证准确率')

plt.xlabel('Epoch')

plt.ylabel('Accuracy')

plt.title('准确率曲线')

plt.legend()

plt.grid(True)

plt.show()

#6.预测新序列

#构造一条正面序列(包含较多1-10的词)和一条负面序列(包含较多11-20的词)

sample_positive=np.array([[1,3,5,7,9,2,4,6,25,30,35,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0]])

sample_negative=np.array([[12,14,16,18,11,13,15,17,28,33,40,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0]])

prob_pos=model.predict(sample_positive,verbose=0)[0][0]

prob_neg=model.predict(sample_negative,verbose=0)[0][0]

print(f"\n正面样本预测置信度:{prob_pos:.4f}")

print(f"负面样本预测置信度:{prob_neg:.4f}")预期结果(参考)训练5个epoch后,测试集准确率通常可达0.89–0.91。训练损失和验证损失同步下降;若验证损失明显上升,说明出现过拟合,可减少epoch或增加dropout。对示例序列的预测结果:正面样本置信度接近1,负面样本置信度接近0。结果记录表项目数值/结果说明词汇表大小51(含填充符0)序列最大长度50测试集准确率LSTM情感分类效果训练epoch数课堂建议5正面评论预测置信度示例输出负面评论预测置信度示例输出五、实验重点、难点重点:文本序列的预处理、Embedding层的作用、LSTM对序列依赖的建模、二分类任务的评估。难点:理解RNN的隐藏状态如何在时间步之间传递信息;理解LSTM门控机制如何解决长程依赖问题。六、操作要点本实验使用模拟生成的序列数据,无需联网下载;数据集在代码中自动生成,便于课堂快速复现。为控制训练时间,课堂上演示时使用5个epoch和51个词的词汇表;课后可尝试替换为IMDB真实影评数据。预测新序列时,需要保证词索引与训练时一致,并使用相同的max_len进行填充。建议将模型训练与预测分开运行,避免在课堂上临时训练导致时间不足。七、注意事项文本数据需要先进

温馨提示

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

评论

0/150

提交评论