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 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前…...
【高考志愿】机械工程
目录 一、专业概述 二、学科特点 三、就业前景 四、机械工程学科排名 五、专业选择建议 高考志愿选择机械工程,这是一个需要深思熟虑的决定,因为它不仅关乎未来的学习和职业发展,更是对自我兴趣和潜能的一次重要考量。 一、专业概述 机…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...