目录

引言

一、项目背景与目标

二、环境准备

三、数据获取与探索

3.1 数据获取

3.2 数据探索

四、数据预处理

4.1 文本清洗

4.2 分词

4.3 标签编码

4.4 数据集划分

4.5 特征提取

五、模型构建与训练

5.1 逻辑回归模型

5.2 LSTM 模型

六、模型评估

6.1 逻辑回归模型评估

6.2 LSTM 模型评估

6.3 模型结果可视化

七、模型优化

八、模型部署

8.1 保存模型

8.2 搭建 Web 服务


引言

在人工智能迅猛发展的今天,文本分类作为自然语言处理(NLP)领域的基础任务,在情感分析、垃圾邮件识别、新闻分类等诸多场景中都有着广泛的应用。本文将以 "电商评论情感分析" 为具体案例,带大家进行一次完整的文本分类模型实战。从数据获取与预处理,到模型构建、训练、评估,再到最后的模型部署,每个环节都会详细讲解并附上可运行的代码,让即使是初学者也能轻松跟上节奏,亲身体验从 0 到 1 构建一个文本分类模型的全过程。

一、项目背景与目标

在电商行业蓬勃发展的当下,用户的评论数据蕴含着巨大的价值。这些评论中包含了用户对商品的真实感受和评价,商家可以通过分析这些评论了解用户的需求和意见,从而改进产品和服务;而对于其他消费者来说,这些评论也能为他们的购买决策提供重要参考。

本次实战项目的目标就是构建一个能够对电商评论进行情感分析的文本分类模型。具体来说,就是要让模型能够自动判断一条电商评论是正面的还是负面的,实现对评论情感的二分类。通过这个项目,我们不仅能掌握文本分类模型的构建方法,还能将其应用到实际的业务场景中,发挥模型的实用价值。

二、环境准备

在开始项目之前,我们需要先准备好相应的开发环境。本次实战将使用 Python 作为开发语言,主要用到以下几个库:

  • pandas:用于数据处理和分析
  • numpy:用于数值计算
  • scikit - learn:提供了丰富的机器学习算法和工具,用于数据预处理、模型训练和评估等
  • tensorflow/keras:用于构建和训练深度学习模型
  • jieba:用于中文文本分词
  • flask:用于模型部署,搭建简单的 Web 服务

下面是环境安装的代码:

# 安装所需库pip install pandas numpy scikit-learn tensorflow jieba flask安装完成后,我们就可以导入这些库,开始项目的后续工作了。# 导入库import pandas as pdimport numpy as npimport jiebaimport refrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import LabelEncoderfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrixfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, Embedding, LSTM, SpatialDropout1Dfrom tensorflow.keras.preprocessing.text import Tokenizerfrom tensorflow.keras.preprocessing.sequence import pad_sequencesfrom tensorflow.keras.utils import to_categoricalfrom tensorflow.keras.callbacks import EarlyStoppingimport flaskfrom flask import request, jsonify

三、数据获取与探索

3.1 数据获取

本次实战使用的电商评论数据可以从公开的数据集平台获取,比如 Kaggle、天池等。这里我们假设已经获取了一份包含评论内容和对应情感标签的数据集,数据集的格式为 CSV,包含 "comment" 和 "sentiment" 两列,其中 "comment" 是评论内容,"sentiment" 是情感标签,取值为 "positive"(正面)或 "negative"(负面)。

我们可以使用 pandas 库来读取数据集:

# 读取数据集data = pd.read_csv('ecommerce_comments.csv')

3.2 数据探索

数据探索是了解数据特征的重要步骤,通过数据探索我们可以知道数据的基本情况,比如数据量、数据分布等,为后续的数据预处理和模型构建提供依据。


# 查看数据的前5行print(data.head())# 查看数据的形状(行数和列数)print('数据形状:', data.shape)# 查看情感标签的分布情况print('情感标签分布:')print(data['sentiment'].value_counts())# 查看评论内容的长度分布data['comment_length'] = data['comment'].apply(lambda x: len(x))print('评论长度描述统计:')print(data['comment_length'].describe())# 绘制评论长度的直方图import matplotlib.pyplot as pltplt.hist(data['comment_length'], bins=50)plt.xlabel('评论长度')plt.ylabel('频数')plt.title('评论长度分布直方图')plt.show()

通过以上代码,我们可以了解到数据集的基本情况。比如,数据集中有多少条评论,正面和负面评论的比例如何,评论内容的长度大致在什么范围等。如果发现数据分布不均衡,比如正面评论远多于负面评论,我们可能需要在后续的数据预处理中进行相应的处理,如过采样、欠采样等。

四、数据预处理

数据预处理是文本分类任务中非常关键的一步,直接影响模型的性能。文本数据通常包含大量的噪声,需要进行清洗、分词等处理,将其转化为模型能够理解的数值形式。

4.1 文本清洗

文本清洗的目的是去除文本中的噪声,比如特殊符号、数字、标点符号等,只保留有意义的汉字。

 
# 定义文本清洗函数def clean_text(text):# 去除特殊符号和数字text = re.sub(r'[^\u4e00-\u9fa5]', ' ', text)# 去除多余的空格text = re.sub(r'\s+', ' ', text).strip()return text# 对评论内容进行清洗data['cleaned_comment'] = data['comment'].apply(clean_text)

4.2 分词

由于中文文本不像英文文本那样有天然的分隔符,所以需要进行分词处理,将连续的汉字序列切分成一个个独立的词语。这里我们使用 jieba 库进行分词。

 
# 定义分词函数def segment_text(text):# 分词words = jieba.cut(text)# 过滤掉长度为1的词语(可选)words = [word for word in words if len(word) > 1]# 拼接成字符串,用空格分隔return ' '.join(words)# 对清洗后的评论进行分词data['segmented_comment'] = data['cleaned_comment'].apply(segment_text)

4.3 标签编码

情感标签是文本型的("positive" 和 "negative"),我们需要将其转化为数值型,方便模型处理。这里我们使用 LabelEncoder 进行编码,将 "positive" 编码为 1,"negative" 编码为 0。

# 标签编码label_encoder = LabelEncoder()data['label'] = label_encoder.fit_transform(data['sentiment'])

4.4 数据集划分

我们需要将数据集划分为训练集和测试集,其中训练集用于模型训练,测试集用于评估模型的性能。通常我们将 70% - 80% 的数据作为训练集,其余的数据作为测试集。

# 划分训练集和测试集X = data['segmented_comment']y = data['label']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

这里使用了 stratify=y 参数,确保训练集和测试集中情感标签的分布与原始数据集一致。

4.5 特征提取

文本数据经过分词后,还是字符串形式,我们需要将其转化为数值型的特征向量。常用的特征提取方法有词袋模型(Bag of Words)、TF - IDF 等。这里我们使用 TF - IDF 进行特征提取。

# TF-IDF特征提取tfidf_vectorizer = TfidfVectorizer(max_features=5000) # 只保留出现频率最高的5000个词X_train_tfidf = tfidf_vectorizer.fit_transform(X_train).toarray()X_test_tfidf = tfidf_vectorizer.transform(X_test).toarray()

max_features=5000 表示只保留出现频率最高的 5000 个词,这样可以减少特征维度,提高模型的训练速度。

五、模型构建与训练

在文本分类任务中,常用的模型有朴素贝叶斯、支持向量机(SVM)、逻辑回归以及深度学习模型(如 LSTM、CNN 等)。本节我们将分别构建一个基于逻辑回归的机器学习模型和一个基于 LSTM 的深度学习模型,并进行训练。

5.1 逻辑回归模型

逻辑回归是一种简单而有效的分类算法,在文本分类任务中经常被使用。

# 构建逻辑回归模型from sklearn.linear_model import LogisticRegressionlr_model = LogisticRegression(max_iter=1000)lr_model.fit(X_train_tfidf, y_train)

5.2 LSTM 模型

LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),能够很好地处理序列数据,在 NLP 任务中表现出色。

由于 LSTM 模型需要输入的是序列数据,而我们之前使用 TF - IDF 提取的是特征向量,不太适合 LSTM。所以我们需要使用 Tokenizer 对文本进行处理,将其转化为序列。

# 文本序列处理tokenizer = Tokenizer(num_words=5000) # 只保留出现频率最高的5000个词tokenizer.fit_on_texts(X_train)X_train_seq = tokenizer.texts_to_sequences(X_train)X_test_seq = tokenizer.texts_to_sequences(X_test)# 序列填充,使所有序列长度一致max_sequence_length = 100 # 序列的最大长度X_train_pad = pad_sequences(X_train_seq, maxlen=max_sequence_length)X_test_pad = pad_sequences(X_test_seq, maxlen=max_sequence_length)# 构建LSTM模型embedding_dim = 128lstm_model = Sequential()lstm_model.add(Embedding(input_dim=5000, output_dim=embedding_dim, input_length=max_sequence_length))lstm_model.add(SpatialDropout1D(0.2))lstm_model.add(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2))lstm_model.add(Dense(units=1, activation='sigmoid'))# 编译模型lstm_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# 打印模型结构lstm_model.summary()# 训练模型early_stopping = EarlyStopping(monitor='val_loss', patience=3, mode='min') # 早停法,防止过拟合history = lstm_model.fit(X_train_pad, y_train, batch_size=32, epochs=20, validation_data=(X_test_pad, y_test), callbacks=[early_stopping])

六、模型评估

模型训练完成后,我们需要在测试集上对模型进行评估,了解模型的性能。常用的评估指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 值等。

6.1 逻辑回归模型评估

# 逻辑回归模型预测y_pred_lr = lr_model.predict(X_test_tfidf)# 计算准确率accuracy_lr = accuracy_score(y_test, y_pred_lr)print('逻辑回归模型准确率:', accuracy_lr)# 打印分类报告print('逻辑回归模型分类报告:')print(classification_report(y_test, y_pred_lr))# 打印混淆矩阵print('逻辑回归模型混淆矩阵:')print(confusion_matrix(y_test, y_pred_lr))

6.2 LSTM 模型评估

# LSTM模型预测y_pred_lstm_prob = lstm_model.predict(X_test_pad)y_pred_lstm = (y_pred_lstm_prob > 0.5).astype(int).flatten()# 计算准确率accuracy_lstm = accuracy_score(y_test, y_pred_lstm)print('LSTM模型准确率:', accuracy_lstm)# 打印分类报告print('LSTM模型分类报告:')print(classification_report(y_test, y_pred_lstm))# 打印混淆矩阵print('LSTM模型混淆矩阵:')print(confusion_matrix(y_test, y_pred_lstm))通过对比两个模型的评估指标,我们可以看出哪个模型的性能更好。一般来说,在文本分类任务中,LSTM 等深度学习模型的性能会优于传统的机器学习模型,但训练成本也更高。

6.3 模型结果可视化

为了更直观地了解模型的训练过程和性能,我们可以对模型的训练损失和准确率进行可视化。

# 绘制LSTM模型的训练损失和验证损失曲线plt.plot(history.history['loss'], label='训练损失')plt.plot(history.history['val_loss'], label='验证损失')plt.xlabel('Epoch')plt.ylabel('Loss')plt.title('LSTM模型训练损失和验证损失曲线')plt.legend()plt.show()# 绘制LSTM模型的训练准确率和验证准确率曲线plt.plot(history.history['accuracy'], label='训练准确率')plt.plot(history.history['val_accuracy'], label='验证准确率')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.title('LSTM模型训练准确率和验证准确率曲线')plt.legend()plt.show()

通过这些曲线,我们可以判断模型是否存在过拟合或欠拟合的情况。如果训练损失不断下降,而验证损失却开始上升,说明模型出现了过拟合。

七、模型优化

如果模型的性能不理想,我们可以进行模型优化。常用的优化方法有:

  1. 调整模型参数:比如逻辑回归的正则化参数、LSTM 的隐藏层单元数、学习率等。
  1. 增加特征维度:可以适当增加 TF - IDF 保留的词的数量,或者使用词向量(如 Word2Vec、GloVe)作为特征。
  1. 数据增强:对于文本数据,可以进行同义词替换、随机插入、随机删除等操作,增加训练数据量。
  1. 集成学习:将多个模型的预测结果进行融合,提高模型的性能。

下面以调整 LSTM 模型的隐藏层单元数为例,进行模型优化:

 
# 调整LSTM模型的隐藏层单元数lstm_model_optimized = Sequential()lstm_model_optimized.add(Embedding(input_dim=5000, output_dim=embedding_dim, input_length=max_sequence_length))lstm_model_optimized.add(SpatialDropout1D(0.2))lstm_model_optimized.add(LSTM(units=128, dropout=0.2, recurrent_dropout=0.2)) # 将隐藏层单元数从64调整为128lstm_model_optimized.add(Dense(units=1, activation='sigmoid'))# 编译模型lstm_model_optimized.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# 训练模型history_optimized = lstm_model_optimized.fit(X_train_pad, y_train, batch_size=32, epochs=20, validation_data=(X_test_pad, y_test), callbacks=[early_stopping])# 评估优化后的LSTM模型y_pred_lstm_optimized_prob = lstm_model_optimized.predict(X_test_pad)y_pred_lstm_optimized = (y_pred_lstm_optimized_prob > 0.5).astype(int).flatten()accuracy_lstm_optimized = accuracy_score(y_test, y_pred_lstm_optimized)print('优化后的LSTM模型准确率:', accuracy_lstm_optimized)

八、模型部署

模型训练好之后,我们需要将其部署到实际应用中,让用户能够方便地使用。这里我们使用 flask 搭建一个简单的 Web 服务,实现对电商评论情感的在线预测。

8.1 保存模型

首先,我们需要将训练好的模型和相关的预处理工具保存下来,以便在部署时使用。

# 保存逻辑回归模型import joblibjoblib.dump(lr_model, 'lr_model.pkl')joblib.dump(tfidf_vectorizer, 'tfidf_vectorizer.pkl')joblib.dump(label_encoder, 'label_encoder.pkl')# 保存LSTM模型lstm_model.save('lstm_model.h5')import jsonwith open('tokenizer_config.json', 'w', encoding='utf-8') as f:json.dump(tokenizer.get_config(), f, ensure_ascii=False)

8.2 搭建 Web 服务

使用 flask 搭建 Web 服务,实现接收用户输入的评论内容,调用模型进行预测,并返回预测结果的功能。

# 加载模型和预处理工具lr_model = joblib.load('lr_model.pkl')tfidf_vectorizer = joblib.load('tfidf_vectorizer.pkl')label_encoder = joblib.load('label_encoder.pkl')from tensorflow.keras.models import load_modellstm_model = load_model('lstm_model.h5')from tensorflow.keras.preprocessing.text import tokenizer_from_jsonwith open('tokenizer_config.json', 'r', encoding='utf-8') as f:tokenizer_config = json.load(f)tokenizer = tokenizer_from_json(tokenizer_config)# 创建flask应用app = flask.Flask(__name</doubaocanvas>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92634.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92634.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92634.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust学习心得---特征对象和泛型区别

区别特性泛型&#xff08;静态分发&#xff09;特征对象&#xff08;动态分发&#xff09;决策时机编译时单态化&#xff08;生成具体类型的代码&#xff09;运行时通过vtable查找方法运行性能零运行时开销&#xff08;直接内联调用&#xff09;有额外开销&#xff08;指针跳转…

ESP32-menuconfig(2) -- Application manager

按顺序来说&#xff0c;第二篇本来应该是Security features&#xff0c;但是这块内容应该到小批量才用的到&#xff0c;而一些爱好者可能永远都不会修改这块&#xff0c;所以先看看更常用Application manager&#xff0c;这部分内容也比较少。 Application managerCONFIG_APP_C…

ArgoCD 与 GitOps:K8S 原生持续部署的实操指南

容器技术的爆发让 Kubernetes&#xff08;K8s&#xff09;成为了「云原生时代的操作系统」—— 它能高效编排成千上万的容器&#xff0c;解决弹性伸缩、资源调度等核心问题。但随着企业应用规模扩大&#xff0c;K8s 的「部署与管理」逐渐暴露新的挑战&#xff1a; 多环境&…

Day36--动态规划--1049. 最后一块石头的重量 II,494. 目标和,474. 一和零

Day36–动态规划–1049. 最后一块石头的重量 II&#xff0c;494. 目标和&#xff0c;474. 一和零 遇到难题&#xff0c;思考超过20分钟没有思路的&#xff0c;要跳过&#xff01;不然时间效率太低了。 **看题解同理&#xff0c;看20分钟看不懂的&#xff0c;也要跳过&#xff0…

前端开发技术深度总结报告

前端开发技术深度总结报告 &#x1f4cb; 项目背景 基于 Vue 3 TypeScript Element Plus 的企业级产品管理系统&#xff0c;重点解决产品表单的数据缓存、页面导航、用户体验等核心问题。&#xfffd;&#xfffd; 遇到的问题及解决方案 1. 浏览器控制台错误处理 问题: 大量第…

Linux 单机部署 Kafka 详细教程(CentOS 7+)

系列博客专栏&#xff1a; SpringBoot与微服务实践系列博客Java互联网高级培训教程 一、环境准备 1. 操作系统要求 Kafka 可以在多种 Linux 发行版上运行&#xff0c;本文以 CentOS 7 为例&#xff0c;其他发行版步骤类似&#xff0c;只需调整包管理命令。 2. Java 环境要…

解析工业机器视觉中的飞拍技术

在工业机器视觉的领域&#xff0c;"飞拍"这个术语时常被提起&#xff0c;尤其是在高速检测和动态捕捉的场景中。但你真的了解飞拍是什么吗&#xff1f;它到底如何工作&#xff0c;能为工业应用带来哪些突破性改进呢&#xff1f;让我们一起来解密。1. 飞拍的核心概念 …

[特殊字符]企业游学 | 探秘字节,解锁AI科技新密码

宝子们&#xff0c;想知道全球科技巨头字节跳动的成功秘籍吗&#xff1f;一场企业游学&#xff0c;带你深入字节跳动创新基地&#xff0c;探索AI新科技&#xff0c;揭开规模化增长背后的神秘面纱✨字节跳动&#xff1a;全球经济价值的创造者字节跳动可太牛啦&#xff01;TikTok…

主流大数据框架深度解析:从介绍到选型实战

主流大数据框架深度解析:从介绍到选型实战 在数据驱动的时代,选择合适的大数据处理框架是构建高效、可靠数据平台的关键。 深入剖析 Hadoop MapReduce、Apache Spark、Apache Flink 和 Kafka Streams 四大主流框架,从框架介绍、具体使用场景、优缺点、选择建议到实际案例,…

座舱HMI软件开发架构:核心功能与案例解析

随着智能座舱的持续演进&#xff0c;HMI&#xff08;Human Machine Interface&#xff0c;人与机器交互界面&#xff09;系统已从单一的显示控制器演变为集多屏联动、多模态交互、车载服务集成于一体的智能系统&#xff0c;需要一个多系统、多设备协同运行的复杂架构来支撑。本…

把“思考”塞进 1 KB:我用纯 C 语言给单片机手搓了一个微型 Transformer 推理引擎

标签&#xff1a;TinyML、Transformer、单片机、Cortex-M、量化、KV-Cache、裸机编程 ---- 1. 为什么要在 64 KB SRAM 的 MCU 上跑 Transformer&#xff1f; 2024 年以前&#xff0c;TinyML ≈ CNN CMSIS-NN&#xff0c;做语音唤醒或简单分类就到头了。 但产品同事突然拍脑袋&…

什么是CLI?

什么是CLI&#xff1f;CLI&#xff08;Command Line Interface&#xff09;是命令行界面的缩写&#xff0c;是一种通过文本命令与计算机程序交互的方式。通俗比喻CLI就像是一个"智能助手"&#xff1a;你输入命令&#xff0c;它执行任务就像和机器人对话一样&#xff…

mysql基本sql语句大全

十分想念顺店杂可。。。以下是 MySQL 中常用的基本 SQL 语句大全&#xff0c;按功能分类整理&#xff0c;包含语法和示例&#xff0c;方便参考使用&#xff1a;一、数据库操作&#xff08;DDL&#xff09;用于创建、删除、切换数据库。创建数据库-- 基本语法 CREATE DATABASE […

构建响应式在线客服聊天系统的前端实践 Vue3+ElementUI + CSS3

构建响应式客服聊天系统的前端实践在当今数字化时代&#xff0c;客服系统已成为企业与客户沟通的重要桥梁。一个优秀的在线客服系统不仅需要功能完善&#xff0c;还需要在各种设备上都能提供良好的用户体验。本文将介绍如何构建一个响应式的客服聊天界面&#xff0c;确保在桌面…

C语言memcpy函数详解:高效内存复制的实用工具

目录1. memcpy函数是什么&#xff1f;函数原型2. memcpy函数的用法运行结果&#xff1a;代码解析3. memcpy函数的注意事项3.1 内存区域不重叠3.2 缓冲区大小管理3.3 指针有效性3.4 性能优势3.5 平台兼容性4. 实际应用场景4.1 数组复制4.2 动态内存复制4.3 结构体复制4.4 缓冲区…

多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案

一、背景&#xff1a;新品咖啡风暴与数据库之痛想象一下&#xff1a;某知名咖啡品牌推出限量版“星空冷萃”&#xff0c;通过社交媒体引爆流量。上午10点开售瞬间&#xff0c;APP与网站涌入数十万用户&#xff0c;商品详情页、库存查询请求如海啸般涌向后台。传统架构下&#x…

888. 公平的糖果交换

目录 题目链接&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 总结&#xff1a; 题目链接&#xff1a; 888. 公平的糖果交换 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解题思路&#xff1a; 前一个数组和sumA,后一个数组sumB,然…

Day01 项目概述,环境搭建

软件开发整体介绍 软件开发流程 需求分析&#xff1a;需求规格说明书、产品原型 设计&#xff1a;UI 设计、数据库设计&#xff0c;接口设计 编码&#xff1a;项目代码、单元测试 测试&#xff1a;测试用例、测试报告 上线运维&#xff1a;软件环境安装、配置 角色分工 项…

Perl Socket 编程

Perl Socket 编程 引言 Perl 语言作为一种强大的脚本语言,在系统管理和网络编程领域有着广泛的应用。Socket 编程是网络编程的核心,它允许程序在网络中进行数据传输。本文将详细介绍 Perl 语言中的 Socket 编程,包括 Socket 的概念、创建、通信以及一些高级应用。 Socket…

3 种简单方法备份 iPhone 上的短信 [2025]

短信通常承载着我们工作和私人生活中有价值的信息和美好的回忆&#xff0c;以及我们不想丢失的特别对话。这就是为什么备份 iPhone 短信如此重要的原因。如果出现问题&#xff0c;比如意外删除或系统问题&#xff0c;备份意味着你可以轻松地恢复短信。在本指南中&#xff0c;我…