Python 高级实战:基于自然语言处理的情感分析系统
前言
在大数据和人工智能迅猛发展的今天,自然语言处理(NLP)作为人工智能的重要分支,已经深入到我们的日常生活和工作中。情感分析作为NLP中的一个重要应用,广泛应用于市场分析、舆情监控和客户反馈等领域。本文将讲述一个基于Python实现的情感分析系统,旨在帮助大家进一步提升在NLP领域的技能。
一:工具准备
“工欲善其事,必先利其器。”在开始我们的实战之前,首先需要准备好必备的工具。我们将使用的主要工具有Python编程语言及其相关库。
1.1 Python安装与环境配置
首先,确保你已经安装了Python。如果尚未安装,可以从Python官网下载并安装最新版本。在终端中运行以下命令确认安装成功:
python --version
1.2 安装必要的库
我们将使用一些常用的库来实现情感分析的功能,主要包括nltk
、sklearn
、pandas
和matplotlib
。可以通过以下命令安装这些库:
pip install nltk scikit-learn pandas matplotlib
以下是每个库的作用:
库 | 作用 |
---|---|
nltk | 提供丰富的自然语言处理工具和数据集,用于文本处理、分词、词性标注、情感分析等任务。 |
sklearn | 提供一系列机器学习算法和工具,用于数据预处理、特征提取、模型训练和评估。 |
pandas | 提供高效的数据结构和数据分析工具,常用于数据清洗、处理和分析。 |
matplotlib | 提供灵活和强大的绘图工具,用于生成各种图表和可视化数据。 |
1.3 下载NLTK数据
NLTK库提供了丰富的自然语言处理工具和数据集。在使用前,我们需要下载一些必要的数据集:
import nltk
nltk.download('punkt')
nltk.download('vader_lexicon')
NLTK库中的punkt
和vader_lexicon
的作用:
库/工具 | 作用 |
---|---|
NLTK库 | 提供丰富的自然语言处理工具和数据集,适用于文本处理、分类、标注、解析、语义推理等任务 |
punkt | 用于句子分割和单词分割,使用无监督学习方法识别句子边界和单词边界 |
vader_lexicon | VADER情感词典,用于从文本中提取情感得分(正面、负面、中性)并计算综合情感得分 |
二:数据获取与预处理
“做工的人,常以苦力相期。”获取和清洗数据是情感分析中的重要步骤。我们将从网络上抓取用户评论数据,并对其进行预处理。
2.1 确定数据源
我们以IMDb电影评论为例,抓取其评论数据。目标网址为:IMDb Movie Reviews
2.2 编写数据抓取代码
以下是一个抓取IMDb电影评论的示例代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd# 获取单个页面的评论数据
def get_reviews(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')reviews = soup.find_all('div', class_='text show-more__control')data = [review.get_text() for review in reviews]return data# 爬取多页的评论数据
def scrape_all_reviews(base_url, pages):all_reviews = []for i in range(pages):url = f"{base_url}&page={i+1}"reviews = get_reviews(url)all_reviews.extend(reviews)return all_reviews# 主程序
if __name__ == '__main__':base_url = 'https://www.imdb.com/title/tt0111161/reviews?ref_=tt_ql_3'pages = 5 # 爬取前5页的评论reviews = scrape_all_reviews(base_url, pages)# 保存数据到CSV文件df = pd.DataFrame(reviews, columns=['Review'])df.to_csv('imdb_reviews.csv', index=False)print("数据已保存到imdb_reviews.csv")
以上代码展示了如何利用requests
获取网页内容,通过BeautifulSoup
解析网页,并提取评论数据。最后,将数据保存到CSV文件中,以便后续分析使用。
三:情感分析模型构建
在获取了数据之后,我们需要构建一个情感分析模型,对评论进行情感分类。
3.1 数据读取与预处理
首先我们读取刚才保存的CSV文件,并对数据进行简单的预处理。
import pandas as pd
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import string# 读取数据
df = pd.read_csv('imdb_reviews.csv')# 数据清洗与预处理
def preprocess_text(text):tokens = word_tokenize(text.lower())tokens = [t for t in tokens if t.isalpha() and t not in stopwords.words('english')]return ' '.join(tokens)df['ProcessedReview'] = df['Review'].apply(preprocess_text)
print(df.head())
3.2 构建情感分析模型
我们将使用VADER
情感分析器,这是一种基于规则的情感分析工具,适用于社交媒体文本。
from nltk.sentiment.vader import SentimentIntensityAnalyzer# 初始化VADER情感分析器
sid = SentimentIntensityAnalyzer()# 计算每条评论的情感得分
df['SentimentScore'] = df['ProcessedReview'].apply(lambda x: sid.polarity_scores(x)['compound'])# 根据情感得分分类
df['Sentiment'] = df['SentimentScore'].apply(lambda x: 'positive' if x > 0 else ('negative' if x < 0 else 'neutral'))
print(df.head())
3.3 模型评估
为了评估我们的情感分析模型,我们可以使用一些统计指标和可视化工具。这里代码的作用是统计情感分析结果中各情感类别的数量,并绘制情感分布图。
import matplotlib.pyplot as plt# 统计各情感类别的数量
sentiment_counts = df['Sentiment'].value_counts()# 绘制情感分布图
plt.figure(figsize=(8, 6))
plt.bar(sentiment_counts.index, sentiment_counts.values, color=['green', 'red', 'grey'])
plt.title('Sentiment Distribution')
plt.xlabel('Sentiment')
plt.ylabel('Count')
plt.show()
四:高级应用与优化
在实际应用中,我们还可以进一步优化和扩展情感分析模型,以满足不同的需求。
4.1 使用机器学习模型
除了基于规则的方法,我们还可以使用机器学习模型来进行情感分析。以下是一个使用sklearn
库中LogisticRegression
模型的示例。这里的代码展示了如何使用机器学习模型进行情感分析。它包含了特征提取、数据集划分、模型训练和评估的完整流程。:
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report# 特征提取
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(df['ProcessedReview'])
y = df['Sentiment'].map({'positive': 1, 'negative': 0, 'neutral': 2})# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练逻辑回归模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)# 预测并评估模型
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred, target_names=['negative', 'neutral', 'positive']))
4.2 实时情感分析系统
我们还可以构建一个实时情感分析系统,利用Flask框架将其部署为Web服务。
from flask import Flask, request, jsonifyapp = Flask(__name__)# 预加载模型和向量化器
vectorizer = TfidfVectorizer(max_features=5000)
model = LogisticRegression(max_iter=1000)
# 假设我们已经训练并保存了模型和向量化器
# vectorizer.fit_transform(...)
# model.fit(...)@app.route('/predict', methods=['POST'])
def predict():data = request.get_json()review = data['review']processed_review = preprocess_text(review)X = vectorizer.transform([processed_review])prediction = model.predict(X)sentiment = 'positive' if prediction == 1 else ('negative' if prediction == 0 else 'neutral')return jsonify({'sentiment': sentiment})if __name__ == '__main__':app.run(debug=True)
五:总结
“世事洞明皆学问,人情练达即文章。”通过本次实战案例,我们从数据抓取入手,构建了一个基于Python的情感分析系统,并展示了如何使用VADER和机器学习模型进行情感分析。希望通过这篇文章,能够帮助高级开发者更好地理解和掌握NLP在情感分析中的应用。
在这个数据驱动的时代,情感分析作为NLP的重要应用,具有广泛的实际意义。希望大家在不断学习和实践中,能够在NLP领域开拓出属于自己的天地,推动技术的发展和应用。
附录:完整代码
以下是本文涉及的完整代码,方便读者参考与学习。
import requests
from bs4 import BeautifulSoup
import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from flask import Flask, request, jsonify# 下载必要的NLTK数据
nltk.download('punkt')
nltk.download('vader_lexicon')# 获取单个页面的评论数据
def get_reviews(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')reviews = soup.find_all('div', class_='text show-more__control')data = [review.get_text() for review in reviews]return data# 爬取多页的评论数据
def scrape_all_reviews(base_url, pages):all_reviews = []for i in range(pages):url = f"{base_url}&page={i+1}"reviews = get_reviews(url)all_reviews.extend(reviews)return all_reviews# 数据预处理
def preprocess_text(text):tokens = word_tokenize(text.lower())tokens = [t for t in tokens if t.isalpha() and t not in stopwords.words('english')]return ' '.join(tokens)# 主程序:数据抓取与保存
if __name__ == '__main__':base_url = 'https://www.imdb.com/title/tt0111161/reviews?ref_=tt_ql_3'pages = 5 # 爬取前5页的评论reviews = scrape_all_reviews(base_url, pages)# 保存数据到CSV文件df = pd.DataFrame(reviews, columns=['Review'])df.to_csv('imdb_reviews.csv', index=False)print("数据已保存到imdb_reviews.csv")# 读取数据
df = pd.read_csv('imdb_reviews.csv')
df['ProcessedReview'] = df['Review'].apply(preprocess_text)# 初始化VADER情感分析器
sid = SentimentIntensityAnalyzer()# 计算每条评论的情感得分
df['SentimentScore'] = df['ProcessedReview'].apply(lambda x: sid.polarity_scores(x)['compound'])# 根据情感得分分类
df['Sentiment'] = df['SentimentScore'].apply(lambda x: 'positive' if x > 0 else ('negative' if x < 0 else 'neutral'))# 统计各情感类别的数量
sentiment_counts = df['Sentiment'].value_counts()# 绘制情感分布图
plt.figure(figsize=(8, 6))
plt.bar(sentiment_counts.index, sentiment_counts.values, color=['green', 'red', 'grey'])
plt.title('Sentiment Distribution')
plt.xlabel('Sentiment')
plt.ylabel('Count')
plt.show()# 使用机器学习模型进行情感分析
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(df['ProcessedReview'])
y = df['Sentiment'].map({'positive': 1, 'negative': 0, 'neutral': 2})# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练逻辑回归模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)# 预测并评估模型
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred, target_names=['negative', 'neutral', 'positive']))# 构建实时情感分析系统
app = Flask(__name__)@app.route('/predict', methods=['POST'])
def predict():data = request.get_json()review = data['review']processed_review = preprocess_text(review)X = vectorizer.transform([processed_review])prediction = model.predict(X)sentiment = 'positive' if prediction == 1 else ('negative' if prediction == 0 else 'neutral')return jsonify({'sentiment': sentiment})if __name__ == '__main__':app.run(debug=True)
相关文章:

Python 高级实战:基于自然语言处理的情感分析系统
前言 在大数据和人工智能迅猛发展的今天,自然语言处理(NLP)作为人工智能的重要分支,已经深入到我们的日常生活和工作中。情感分析作为NLP中的一个重要应用,广泛应用于市场分析、舆情监控和客户反馈等领域。本文将讲述…...

ruby面试题
ruby 基础 1、each、map、collect的区别 each: 仅遍历数组,并做相应操作,数组本身不发生改变。 map:遍历数组,并做相应操作后,返回新数组(处理),原数组不变。 collect: 跟map作用一样。 collect! map!: 多了一个作…...

Android U Settings 应用中 APN 菜单实现的代码逻辑
功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…...

java时间处理工具类
效果 最近7天:2024年6月21日-2024年6月27日过去一周、最近一周:2024年6月16日-2024年6月22日过去三个月:2024年3月-2024年6月近半年、过去半年:2023年12月-2024年6月去年:2023年1月-2023年12月过去3年:202…...
Android高级面试_2_IPC相关
Android 高级面试-3:语言相关 1、Java 相关 1.1 缓存相关 问题:LruCache 的原理? 问题:DiskLruCache 的原理? LruCache 用来实现基于内存的缓存,LRU 就是最近最少使用的意思,LruCache 基于L…...

docker封禁对外端口映射
docker比linux防火墙规则优先级要高,一旦在docker里面配置了对外服务端口的话在iptable里面封不掉,需要通过下面的方法进行封禁: 这里我的宿主机IP地址是10.5.1.244,docker 内部网络ip段是默认的172.17段的,以下为命令࿱…...

【leetcode系列】567.字符串的排列(滑动窗口)
题目 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句话说,s1 的排列之一是 s2 的 子串 。 示例 示例 1: 输入:s1 “ab” s2…...

情感分析方法与实践
第1关:情感分析的基本方法 情感分析简介 情感分析,又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。在日常生活中,情感分析的应用非常普遍,下面列举几种常见的…...

迁移学习——CycleGAN
CycleGAN 1.导入需要的包2.数据加载(1)to_img 函数(2)数据加载(3)图像转换 3.随机读取图像进行预处理(1)函数参数(2)数据路径(3)读取文…...

【软件测试】对于测试中的bug,我们真正了解了吗?
目录 1.软件测试的生命周期 1.1.软件测试阶段流程 1.2.各流程的任务 2.什么是bug 2.1.bug的概念 2.2.怎么描述bug 2.3.bug的级别 2.4.bug的生命周期 1.软件测试的生命周期 在学习bug前,我们先来学习一下软件测试的生命周期,也就是测试人员进行测…...

Packer-Fuzzer一款好用的前端高效安全扫描工具
★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、Packer Fuzzer介绍 Packer Fuzzer是一款针对Webpack…...

解决卸载TabX explorer软件后导致系统文件资源管理器无法正常使用问题
最近安装了最新版本的鲁大师,安装过程中不小心同时安装了捆绑软件TabX explorer。这个软件和系统自带的文件资源管理器很像,最后弹出会员到期才发现,这个不是系统文件资源管理器,是第三方的文件资源管理器,就按正常流程…...

qt for android 使用打包sqlite数据库文件方法
1.在使用sqlite数据库时,先将数据库文件打包,放置在assets中如下图: 将文件放置下android中的assets下的所有文件都会打包在APK中,可以用7zip查看apk文件 2.在qt代码读取数据文件,注意在assets下的文件都是Read-Only,需…...

MYBATIS大于等于、小于等于的写法
mybatis使用的是xml格式的文件。使用>和<号的时候,会存在与xml的标签的规范冲突。需要写成如下形式,否则会报错。 第一种写法 原符号 替换符号 < < < <> > > >& & &…...

基于堆叠长短期记忆网络 Stacked LSTM 预测A股股票价格走势
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...

SpringCloud Alibaba Sentinel基础入门与安装
GitHub地址:https://github.com/alibaba/Sentinel 中文文档:https://sentinelguard.io/zh-cn/docs/introduction.html 下载地址:https://github.com/alibaba/Sentinel/releases Spring Cloud Alibaba 官方说明文档:Spring Clou…...

Arduino IDE下载、安装和配置
文章开始先把我自己网盘里的安装包分享给大家,链接:https://pan.baidu.com/s/1cb2_3m0LnuSKLnWP_YoWPw?pwdwwww 提取码:wwww 里面一个是Arduino IDE的安装包,另一个是即将发布的版本。 第一个安装包打开直接按照我的步骤安装就…...

SOBEL图像边缘检测器的设计
本项目使用FPGA设计出SOBEL图像边缘检测器,通过分析项目在使用过程中的工作原理和相关软硬件设计进行分析详细介绍SOBEL图像边缘检测器的设计。 资料获取可联系wechat 号:comprehensivable 边缘可定义为图像中灰度发生急剧变化的区域边界,它是图像最基本…...

Day35:2734. 执行字串操作后的字典序最小字符串
Leetcode 2734. 执行字串操作后的字典序最小字符串 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为: 选择 s 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前…...

【高考志愿】机械工程
目录 一、专业概述 二、学科特点 三、就业前景 四、机械工程学科排名 五、专业选择建议 高考志愿选择机械工程,这是一个需要深思熟虑的决定,因为它不仅关乎未来的学习和职业发展,更是对自我兴趣和潜能的一次重要考量。 一、专业概述 机…...

ffmpeg将mp4转换为swf
文章目录 ffmpeg安装、配置java运行报错 Cannot run program "ffmpeg" ffmpeg命令mp4转为swf示例 ### ffmpeg -i input.mkv -b:v 600 -c:v libx264 -vf scale1920:1080 -crf 10 -ar 48000 -r 24 output.swfmkv转为swf示例 其他文档命令参数简介 需要将mp4转换为swf&a…...

论文学习 --- RL Regret-based Defense in Adversarial Reinforcement Learning
前言 个人拙见,如果我的理解有问题欢迎讨论 (●′ω`●) 原文链接:https://www.ifaamas.org/Proceedings/aamas2024/pdfs/p2633.pdf 研究背景 深度强化学习(Deep Reinforcement Learning, DRL)在复杂和安全关键任务中取得了显著成果,例如自动驾驶。然而,DRL策略容易受…...

【Linux小命令】一文讲清ldd命令及使用场景
一文讲清ldd命令及使用场景 前言下面进入正题:ldd命令 前言 博主今天ubuntu编译go项目出来的一个可执行文件,放centos运行发现居然依赖于XXlib库。然后我一下就想到两个系统库版本不一致,重编。换系统,导项目,配环境……...

自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王
最近,家里的猫咪掉毛严重,简直成了一个活生生的蒲公英,家中、空气中各处都弥漫着猫浮毛甚至所有衣物都覆盖着一层厚厚的猫毛。令人难以置信的是,有时我甚至在抠出的眼屎中都能发现夹杂着几根猫毛。真的超级困扰了。但其实最空气中…...

1373. 二叉搜索子树的最大键值和
Problem: 1373. 二叉搜索子树的最大键值和 文章目录 思路解题方法复杂度Code 思路 解决这个问题的关键在于采用深度优先搜索(DFS)策略,并结合树形动态规划的思想。我们需要设计一个递归函数,它不仅能够遍历整棵树,还能…...

基于java + Springboot 的二手物品交易平台实现
目录 📚 前言 📑摘要 📑系统架构 📚 数据库设计 📚 系统功能的具体实现 💬 登录模块 首页模块 二手商品轮播图添加 💬 后台功能模块 二手商品商品列表 添加二手商品商品 添加购物车 &a…...

Shopee本土店选品有什么技巧?EasyBoss ERP为你整理了6个高效选品的方法!
电商圈有句话叫:七分靠选品,三分靠运营,选品对了,事半功倍,选品错了,功亏一篑! 很多卖家都会为选品发愁,特别对于Shopee本土店卖家来说,要囤货到海外仓,如果…...

3D在线展览馆的独特魅力,技术如何重塑展览业的未来?
在数字化和虚拟现实技术迅猛发展的今天,3D在线展览馆已经成为一种颇具前景的创新形式。搭建3D在线展览馆不仅能够突破传统展览的时空限制,还能为参观者提供身临其境的体验,极大地提升展示效果和用户互动。 一、3D在线展览馆的意义 1、突破时空…...

基于SpringBoot的藏区特产销售平台
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言: Java 数据库: MySQL 技术: SpringBoot框架 工具: MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…...

hudi系列-schema evolution(一)
hudi+flink在非schema on read模式下也表现出了支持一部分的schema evolution功能,本篇中测试一下在非schema on read模式下,发生各种列变更情况时数据写入与读取情况。 flink 1.14.5hudi 0.13.1mor表思路: 选择mor表是因为它的数据文件有avro和parquet两种格式,能覆盖得更…...