【NLP案例】基于 Naive Bayes + CountVectorizer 的 IMDB 电视节目评论情感分类

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

一、引言

  情感分析是自然语言处理(NLP)领域的一个重要应用,它可以帮助我们从文本数据中提取情感倾向。本文将通过一个实际案例,展示如何使用 Python 的机器学习库 Scikit-Learn,结合 CountVectorizer 和 Naive Bayes 分类器,对 IMDB 电视节目评论进行情感分类。我们将详细分析数据预处理、特征提取、模型训练、预测和评估的全过程。
在这里插入图片描述

二、数据集介绍

本次使用的数据集是 IMDB 电视节目评论数据集,包含数千条评论及其对应的评分。数据集的结构如下:

  • Review ID:每条评论的唯一标识符。
  • Show ID:电视节目的 ID。
  • Rating (out of 10):用户给出的评分,范围从 1 到 10。
  • Review:用户提供的详细评论。

我们将基于评论文本和评分,训练一个情感分类模型,判断评论的情感倾向是正面还是负面。数据来源于:IMDB TV Show Reviews

三、技术工具

  • Python版本: 3.9
  • 代码编辑器: Jupyter Notebook
  • 数据处理库: pandas, numpy
  • NLP工具: NLTK
  • 机器学习库: Scikit-Learn

四、数据预处理

4.1 数据导入

  首先,我们需要导入必要的库,并加载数据集。

import pandas as pd
import string
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
import nltk
from nltk.corpus import stopwords

# 导入数据
df = pd.read_csv('/kaggle/input/imdb-tv-show-reviews/imdb_tvshows.csv')

# 查看数据
print(df.head())
# 查看数据维度
print(df.shape)

在这里插入图片描述

4.2 数据清洗

  在进行情感分析之前,我们需要对评论文本进行清洗,包括小写化、去除标点符号和停用词。

  首先查看英文停用词情况:

# Access and display the list of English stopwords
print(stopwords.words('english'))

在这里插入图片描述

# 下载NLTK的停用词
nltk.download('stopwords')

# 定义清洗文本的函数
def clean_text(text):
    # 转换为小写
    text = text.lower()
    # 去除标点符号
    text = ''.join([char for char in text if char not in string.punctuation])
    # 分词
    words = text.split()
    # 去除停用词
    words = [word for word in words if word not in stopwords.words('english')]
    return ' '.join(words)

# 应用清洗函数
df['cleaned_review'] = df['Review'].apply(clean_text)

在这里插入图片描述

4.3 数据可视化

  评论的情感倾向正面和负面的词云图:

import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np

df['Sentiment'] = df['Rating (out of 10)'].apply(lambda x: 'positive' if x >= 6 else 'negative')
# Separate cleaned reviews
positive_reviews = df[df['Sentiment'] == 'positive']['cleaned_review']
negative_reviews = df[df['Sentiment'] == 'negative']['cleaned_review']

# Transform using same vectorizer
tfidf_pos = vectorizer.transform(positive_reviews)
tfidf_neg = vectorizer.transform(negative_reviews)

# Avg TF-IDF per word
pos_avg = np.asarray(tfidf_pos.mean(axis=0)).ravel()
neg_avg = np.asarray(tfidf_neg.mean(axis=0)).ravel()

# Map word -> avg tfidf
vocab = vectorizer.get_feature_names_out()
pos_freq = {vocab[i]: pos_avg[i] for i in range(len(vocab))}
neg_freq = {vocab[i]: neg_avg[i] for i in range(len(vocab))}

# Identify truly positive distinctive words: where pos_avg > neg_avg
distinct_pos = {word: pos_freq[word] for word in pos_freq if pos_freq[word] > neg_freq.get(word, 0)}
# Same for negative
distinct_neg = {word: neg_freq[word] for word in neg_freq if neg_freq[word] > pos_freq.get(word, 0)}

# Keep top N
topN = 50
distinct_pos_top = dict(sorted(distinct_pos.items(), key=lambda x: x[1], reverse=True)[:topN])
distinct_neg_top = dict(sorted(distinct_neg.items(), key=lambda x: x[1], reverse=True)[:topN])

# Generate word clouds
pos_wordcloud = WordCloud(width=600, height=400, background_color='white').generate_from_frequencies(distinct_pos_top)
neg_wordcloud = WordCloud(width=600, height=400, background_color='black', colormap='Reds').generate_from_frequencies(distinct_neg_top)

# Plot positive
plt.figure(figsize=(10,5))
plt.imshow(pos_wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title("Distinctive Positive Words (TF-IDF)")
plt.show()

# Plot negative
plt.figure(figsize=(10,5))
plt.imshow(neg_wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title("Distinctive Negative Words (TF-IDF)")
plt.show()

在这里插入图片描述
在这里插入图片描述

五、特征提取

  接下来,我们需要将文本数据转换为数值特征,以便机器学习模型能够处理。这里我们使用 CountVectorizer。

# 准备数据
X = df['cleaned_review']
y = df['Sentiment']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用CountVectorizer向量化
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

在这里插入图片描述

六、模型训练

  我们使用 Naive Bayes 分类器,因为它在文本分类任务中表现良好,且易于理解和解释。

from sklearn.naive_bayes import MultinomialNB

# 训练模型
model = MultinomialNB()
model.fit(X_train_vec, y_train)

在这里插入图片描述

七、模型评估

  接下来,我们对模型进行评估,查看其在测试集上的表现。

# 预测
y_pred = model.predict(X_test_vec)

# 评估
print("Accuracy:", accuracy_score(y_test, y_pred) * 100)
print("Classification Report:\n", classification_report(y_test, y_pred, zero_division=0))

在这里插入图片描述

八、结果分析

  从评估结果可以看出,模型的准确率达到了87.44%,这表明模型在情感分类任务上表现良好。然而,我们也注意到,模型在识别负面评论方面表现较差,这可能与数据集中的类别不平衡有关。未来,我们可以通过数据增强、调整模型参数或尝试其他算法来进一步提高模型的性能。 在这一份数据上的准确率结果比【NLP案列】基于 Logistic Regression + TF-IDF 的 IMDB 电视节目评论情感分类的87.68%要点一些;

九、总结

  本文通过一个实际案例,展示了如何使用 Naive Bayes 和 CountVectorizer 进行情感分类。我们从数据预处理、特征提取、模型训练到评估,详细介绍了每个步骤。希望本文能够为读者提供一个清晰的机器学习项目流程,帮助读者更好地理解和应用情感分析技术。

十、未来工作

  • 数据增强:通过增加数据量或使用数据增强技术来提高模型的泛化能力。
  • 模型优化:尝试其他机器学习算法,如 SVM、随机森林或深度学习模型,以进一步提高分类性能。
  • 特征工程:探索其他特征提取方法,如 Glove或 Word2Vec,以获取更丰富的文本特征。

  希望本文能够为读者提供有价值的参考,欢迎在评论区交流讨论!

  注: 博主目前收集了6900+份相关数据集,有想要的可以领取部分数据:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云天徽上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值