深度循环模型架构与情感分析实践
立即解锁
发布时间: 2025-09-05 01:57:03 阅读量: 3 订阅数: 23 AIGC 

### 深度循环模型架构与情感分析实践
#### 1. 深度循环模型架构的演进
循环神经网络(RNN)在处理序列数据方面发挥着重要作用,而长短期记忆网络(LSTM)更是对循环网络进行了革新,它能够高效处理更长的序列。以下是一些LSTM的高级变体:
- **扩展和双向LSTM**:1997年最初发明的LSTM只有输入和输出门,2000年开发出了带有遗忘门的扩展LSTM,如今被广泛使用。2005年,双向LSTM诞生,其概念与双向RNN类似。
- **多维RNN(MDRNNs)**:2007年发明,用与数据维度相同数量的连接取代了RNN单元之间的单个循环连接,在视频处理等二维数据处理中很有用。
- **堆叠LSTM**:虽然单层LSTM网络似乎克服了梯度消失和爆炸的问题,但堆叠更多LSTM层在学习复杂模式方面更有帮助,例如在语音识别等任务中。不过,这种模型训练速度较慢,且不可并行化。
- **门控循环单元(GRU)**:2014年发明,旨在学习长期依赖关系,同时有效处理梯度爆炸和消失问题。它只有一个状态和两个门(重置门和更新门)。
- **网格LSTM**:2015年开发,是MDLSTM模型的继任者,将LSTM单元排列成多维网格,单元在数据的时空维度以及网络层之间连接。
- **门控正交循环单元**:2017年设计,结合了GRU和酉RNN的思想,通过使用正交矩阵解决梯度问题。
#### 2. 基于情感分析的RNN训练实践
接下来,我们将使用PyTorch进行一个文本分类任务——情感分析,模型输入一段文本,输出1(积极情感)或0(消极情感)。
##### 2.1 加载和预处理文本数据集
- **导入依赖库**:
```python
import os
import time
import numpy as np
from tqdm import tqdm
from string import punctuation
from collections import Counter
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
torch.use_deterministic_algorithms(True)
```
- **读取数据**:使用IMDb情感分析数据集,包含25000条电影评论(12500条积极,12500条消极)。
```python
review_list = []
label_list = []
for label in ['pos', 'neg']:
for fname in tqdm(os.listdir(f'./aclImdb/train/{label}/')):
if 'txt' not in fname:
continue
with open(os.path.join(f'./aclImdb/train/{label}/', fname), encoding="utf8") as f:
review_list += [f.read()]
label_list += [label]
print ('Number of reviews :', len(review_list))
```
- **预处理文本数据**:
- 转换为小写并去除标点符号。
- 统计词频并排序。
```python
review_list = [review.lower() for review in review_list]
review_list = [''.join([letter for letter in review if letter not in punctuation]) for review in tqdm(review_list)]
reviews_blob = ' '.join(review_list)
review_words = reviews_blob.split()
count_words = Counter(review_words)
total_review_words = len(review_words)
sorted_review_words = count_words.most_common(total_review_words)
print(sorted_review_words[:10])
```
- **创建词到整数的映射**:
```python
vocab_to_token = {word:idx+1 for idx, (word, count) in enumerate(sorted_review_words)}
print(list(vocab_to_token.items())[:10])
```
- **将评论转换为数字列表**:
```python
reviews_tokenized = []
for review in review_list:
word_to_token = [vocab_to_token[word] for word in review.split()]
reviews_tokenized.append(word_to_token)
print(review_list[0])
print()
print (reviews_tokenized[0])
```
- **编码情感标签**:
```python
encoded_label_list = [1 if label =='pos' else 0 for label in label_list]
reviews_len = [len(review) for review in reviews_tokenized]
reviews_tokenized = [reviews_tokenized[i] for i, l in enumerate(reviews_len) if l>0 ]
encoded_label_list = np.array([encoded_label_list[i] for i, l in enumerate(reviews_len) if l> 0 ], dtype='float32')
```
- **统一序列长度**:定义序列长度为512,对短序列进行填充,长序列进行截断。
```python
def pad_sequence(reviews_tokenized, sequence_length):
padded_reviews = np.zeros((len(reviews_tokenized), sequence_length), dtype = int)
for idx, review in enumerate(reviews_tokenized):
review_len = len(review)
if review_len <= sequence_length:
zeroes = list(np.zeros(sequence_length-review_len))
new_sequence = zeroes+review
elif review_len > sequence_length:
new_sequence = review[0:sequence_length]
padded_reviews[idx,:] = np.array(new_sequence)
return
```
0
0
复制全文
相关推荐









