电影评论情感分析:数据加载、分析与预处理
立即解锁
发布时间: 2025-09-03 00:09:51 阅读量: 9 订阅数: 13 AIGC 


自然语言处理入门指南
# 电影评论情感分析:数据加载、分析与预处理
## 1. 情感分析任务概述
情感分析旨在检测电影评论中的积极和消极情感,这与之前尝试过的垃圾邮件过滤和作者归属任务有概念上的相似性。在垃圾邮件过滤中,目标是区分“垃圾邮件”和“正常邮件”;作者归属任务是将文本分配给特定作者;而情感分析则是将评论标记为“积极”或“消极”。因此,可以将情感分析视为一个二元分类问题,并应用类似的机器学习方法。
## 2. 数据集介绍
2002 年的一篇论文《Thumbs up? Sentiment Classification using Machine Learning Techniques》首次提出了机器学习方法进行情感分析,并定义了该任务。论文附带了一个数据集,最初包含 700 条积极和 700 条消极评论,后来扩展到版本 2.0,包含 1000 条积极和 1000 条消极评论。这些评论从 IMDb 收集,并根据星级评分标注了情感极性。下载的数据集将积极和消极评论分别存储在 `pos/` 和 `neg/` 子文件夹中,以纯文本文件形式保存,便于提取情感极性标签。
## 3. 数据加载与预处理
### 3.1 读取数据
使用 Python 的 `os` 功能读取数据,代码如下:
```python
import os, codecs
def read_in(folder):
files = os.listdir(folder) #A
a_dict = {}
for a_file in sorted(files):
if not a_file.startswith("."):
with codecs.open(folder + a_file, encoding='ISO-8859-1', errors ='ignore') as f: #B
file_id = a_file.split(".")[0].strip() #C
a_dict[file_id] = f.read()
f.close()
return a_dict #D
```
### 3.2 初始化字典
将上述代码应用于积极和消极评论的子文件夹,创建两个 Python 字典 `pos_dict` 和 `neg_dict`:
```python
folder = "review_polarity/txt_sentoken/" #A
pos_dict = read_in(folder + "pos/")
print(len(pos_dict))
print(pos_dict.get(next(iter(pos_dict)))) #B
neg_dict = read_in(folder + "neg/")
print(len(neg_dict))
print(neg_dict.get(next(iter(neg_dict)))) #C
```
运行上述代码,输出结果显示每个字典包含 1000 条评论,示例如下:
```
1000
films adapted from comic books have had plenty of success , whether they're about superheroes ( batman , superman , spawn ) , […]
1000
plot : two teen couples go to a church party , drink and then drive .
they get into an accident . […]
```
### 3.3 数据存储验证
通过检查字典中的数据与原始文件内容是否一致,进行“健全性检查”,确保数据正确上传并理解其表示方式。
### 3.4 数据思考
在这一步,可以思考以下问题:
- 数据中的类别是如何分布的?
- 需要对这些数据进行多少处理?
- 这对积极和消极评论之间是否有明显差异?如果不知道评论来自哪个子文件夹,能否轻松检测其极性,有哪些线索可以帮助判断?
## 4. 数据深入分析
### 4.1 统计指标
对评论数据集进行一系列标准的定量检查,测量以下指标:
- 评论的平均单词长度
- 平均句子长度
- 词汇量(不同单词的数量)
- 词汇多样性(类型 - 标记比率)
### 4.2 代码实现
```python
def tokenize(text):
text.replace("\n", " ")
return text.split() #A
def statistics(a_dict):
length = 0
sent_length = 0
num_sents = 0
vocab = [] #B
for review in a_dict.values():
length += len(tokenize(review))
sents = review.split("\n")
num_sents += len(sents)
for sent in sents:
sent_length += len(tokenize(sent))
vocab += tokenize(review)
avg_length = float(length)/len(a_dict)
avg_sent_length = float(sent_length)/num_sents
vocab_size = len(set(vocab))
diversity = float(length)/float(vocab_size)
return avg_length, avg_sent_length, vocab_size, diversity #C
categories = ["Positive", "Negative"]
rows = []
rows.append(["Category", "Avg_Len
```
0
0
复制全文
相关推荐










