Python 全栈体系【四阶】(六十一)
第五章 深度学习
十三、自然语言处理(NLP)
5. NLP应用
5.2 文本情感分析
目标:利用训练数据集,对模型训练,从而实现对中文评论语句情感分析。情绪分为正面、负面两种
数据集:中文关于酒店的评论,5265笔用户评论数据,其中2822笔正面评价、其余为负面评价
步骤:同上一案例
模型选择:

代码:
【数据预处理】
# 中文情绪分析:数据预处理部分
import paddle
import paddle.dataset.imdb as imdb
import paddle.fluid as fluid
import numpy as np
import os
import random
from multiprocessing import cpu_count# 数据预处理,将中文文字解析出来,并进行编码转换为数字,每一行文字存入数组
mydict = {} # 存放出现的字及编码,格式: 好,1
code = 1
data_file = "data/hotel_discuss2.csv" # 原始样本路径
dict_file = "data/hotel_dict.txt" # 字典文件路径
encoding_file = "data/hotel_encoding.txt" # 编码后的样本文件路径
puncts = " \n" # 要剔除的标点符号列表with open(data_file, "r", encoding="utf-8-sig") as f:for line in f.readlines():# print(line)trim_line = line.strip()for ch in trim_line:if ch in puncts: # 符号不参与编码continueif ch in mydict: # 已经在编码字典中continueelif len(ch) <= 0:continueelse: # 当前文字没在字典中mydict[ch] = codecode += 1code += 1mydict["<unk>"] = code # 未知字符# 循环结束后,将字典存入字典文件
with open(dict_file, "w", encoding="utf-8-sig") as f:f.write(str(mydict))print("数据字典保存完成!")# 将字典文件中的数据加载到mydict字典中
def load_dict():with open(dict_file, "r", encoding="utf-8-sig") as f:lines = f.readlines()new_dict = eval(lines[0])return new_dict# 对评论数据进行编码
new_dict = load_dict() # 调用函数加载
with open(data_file, "r", encoding="utf-8-sig") as f:with open(encoding_file, "w", encoding="utf-8-sig") as fw:for line in f.readlines():label = line[0] # 标签remark = line[1:-1] # 评论for ch in remark:if ch in puncts: # 符号不参与编码continueelse:fw.write(str(mydict[ch]))fw.write(",")fw.write("\t" + str(label) + "\n") # 写入tab分隔符、标签、换行符print("数据预处理完成")
【模型定义与训练】
# 获取字典的长度
def get_dict_len(dict_path):with open(dict_path, 'r', encoding='utf-8-sig') as f:lines = f.readlines()new_dict = eval(lines[0])return len(new_dict.keys())# 创建数据读取器train_reader和test_reader
# 返回评论列表和标签
def data_mapper(sample):dt, lbl = sampleval = [int(word) for word in dt.split(",") if word.isdigit()]return val, int(lbl)# 随机从训练数据集文件中取出一行数据
def train_reader(train_list_path):def reader():with open(train_list_path, "r", encoding='utf-8-sig') as f:lines = f.readlines()np.random.shuffle(lines) # 打乱数据for line in lines:data, label = line.split("\t")yield data, label# 返回xmap_readers, 能够使用多线程方式读取数据return paddle.reader.xmap_readers(data_mapper, # 映射函数reader, # 读取数据内容cpu_count(), # 线程数量1024) # 读取数据队列大小# 定义LSTM网络
def lstm_net(ipt, input_dim):ipt = fluid.layers.reshape(ipt, [-1, 1],inplace=True) # 是否替换,True则表示输入和返回是同一个对象# 词嵌入层emb = fluid.layers.embedding(input=ipt, size=[input_dim, 128], is_sparse=True)# 第一个全连接层fc1 = fluid.layers.fc(input=emb, size=128)# 第一分支:LSTM分支lstm1, _ = fluid.layers.dynamic_lstm(input=fc1, size=128)lstm2 = fluid.layers.sequence_pool(input=lstm1, pool_type="max")# 第二分支conv = fluid.layers.sequence_pool(input=fc1, pool_type="max")# 输出层:全连接out = fluid.layers.fc([conv, lstm2], size=2, act="softmax")return out# 定义输入数据,lod_level不为0指定输入数据为序列数据
dict_len = get_dict_len(dict_file) # 获取数据字典长度
rmk = fluid.layers.data(name="rmk", shape=[1], dtype="int64", lod_level=1)
label = fluid.layers.data(name="label", shape=[1], dtype="int64")# 定义长短期记忆网络
model = lstm_net(rmk, dict_len)# 定义损失函数,情绪判断实际是一个分类任务,使用交叉熵作为损失函数
cost = fluid.layers.cross_entropy(input=model, label=label)
avg_cost = fluid.layers.mean(cost) # 求损失值平均数
# layers.accuracy接口,用来评估预测准确率
acc = fluid.layers.accuracy(input=model, label=label)# 定义优化方法
# Adagrad(自适应学习率,前期放大梯度调节,后期缩小梯度调节)
optimizer = fluid.optimizer.AdagradOptimizer(learning_rate=0.001)
opt = optimizer.minimize(avg_cost)# 定义网络
# place = fluid.CPUPlace()
place = fluid.CUDAPlace(0)
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program()) # 参数初始化# 定义reader
reader = train_reader(encoding_file)
batch_train_reader = paddle.batch(reader, batch_size=128)# 定义输入数据的维度,数据的顺序是一条句子数据对应一个标签
feeder = fluid.DataFeeder(place=place, feed_list=[rmk, label])for pass_id in range(40):for batch_id, data in enumerate(batch_train_reader()):train_cost, train_acc = exe.run(program=fluid.default_main_program(),feed=feeder.feed(data),fetch_list=[avg_cost, acc])if batch_id % 20 == 0:print("pass_id: %d, batch_id: %d, cost: %0.5f, acc:%.5f" %(pass_id, batch_id, train_cost[0], train_acc))print("模型训练完成......")# 保存模型
model_save_dir = "model/chn_emotion_analyses.model"
if not os.path.exists(model_save_dir):print("create model path")os.makedirs(model_save_dir)fluid.io.save_inference_model(model_save_dir, # 保存路径feeded_var_names=[rmk.name],target_vars=[model],executor=exe) # Executorprint("模型保存完成, 保存路径: ", model_save_dir)
【推理预测】
import paddle
import paddle.fluid as fluid
import numpy as np
import os
import random
from multiprocessing import cpu_countdata_file = "data/hotel_discuss2.csv"
dict_file = "data/hotel_dict.txt"
encoding_file = "data/hotel_encoding.txt"
model_save_dir = "model/chn_emotion_analyses.model"def load_dict():with open(dict_file, "r", encoding="utf-8-sig") as f:lines = f.readlines()new_dict = eval(lines[0])return new_dict# 根据字典对字符串进行编码
def encode_by_dict(remark, dict_encoded):remark = remark.strip()if len(remark) <= 0:return []ret = []for ch in remark:if ch in dict_encoded:ret.append(dict_encoded[ch])else:ret.append(dict_encoded["<unk>"])return ret# 编码,预测
lods = []
new_dict = load_dict()
lods.append(encode_by_dict("总体来说房间非常干净,卫浴设施也相当不错,交通也比较便利", new_dict))
lods.append(encode_by_dict("酒店交通方便,环境也不错,正好是我们办事地点的旁边,感觉性价比还可以", new_dict))
lods.append(encode_by_dict("设施还可以,服务人员态度也好,交通还算便利", new_dict))
lods.append(encode_by_dict("酒店服务态度极差,设施很差", new_dict))
lods.append(encode_by_dict("我住过的最不好的酒店,以后决不住了", new_dict))
lods.append(encode_by_dict("说实在的我很失望,我想这家酒店以后无论如何我都不会再去了", new_dict))# 获取每句话的单词数量
base_shape = [[len(c) for c in lods]]# 生成预测数据
place = fluid.CPUPlace()
infer_exe = fluid.Executor(place)
infer_exe.run(fluid.default_startup_program())tensor_words = fluid.create_lod_tensor(lods, base_shape, place)infer_program, feed_target_names, fetch_targets = fluid.io.load_inference_model(dirname=model_save_dir, executor=infer_exe)
# tvar = np.array(fetch_targets, dtype="int64")
results = infer_exe.run(program=infer_program,feed={feed_target_names[0]: tensor_words},fetch_list=fetch_targets)# 打印每句话的正负面预测概率
for i, r in enumerate(results[0]):print("负面: %0.5f, 正面: %0.5f" % (r[0], r[1]))
6. 附录
6.1 附录一:相关数学知识
向量余弦相似度
余弦相似度使用来度量向量相似度的指标,当两个向量夹角越大相似度越低;当两个向量夹角越小,相似度越高。

在三角形中,余弦值计算方式为 c o s θ = a 2 + b 2 − c 2 2 a b cos \theta = \frac{a^2 + b^2 - c^2}{2ab} cosθ=2aba2+b2−c2,向量夹角余弦计算公式为:
c o s θ = a b ∣ ∣ a ∣ ∣ × ∣ ∣ b ∣ ∣ cos \theta = \frac{ab}{||a|| \times ||b||} cosθ=∣∣a∣∣×∣∣b∣∣ab
分子为两个向量的内积,分母是两个向量模长的乘积。

其推导过程如下:
c o s θ = a 2 + b 2 − c 2 2 a b = x 1 2 + y 1 2 + x 2 2 + y 2 2 + ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 2 x 1 2 + y 1 2 x 2 2 + y 2 2 = 2 x 1 x 2 + 2 y 1 y 2 2 x 1 2 + y 1 2 x 2 2 + y 2 2 = a b ∣ ∣ a ∣ ∣ × ∣ ∣ b ∣ ∣ cos \theta = \frac{a^2 + b^2 - c^2}{2ab} \\ = \frac{\sqrt{x_1^2 + y_1^2} + \sqrt{x_2^2 + y_2^2 }+ \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}}{2 \sqrt{x_1^2 + y_1^2} \sqrt{x_2^2 + y_2^2}} \\ = \frac{2 x_1 x_2 + 2 y_1 y_2}{2 \sqrt{x_1^2 + y_1^2} \sqrt{x_2^2 + y_2^2}} = \frac{ab}{||a|| \times ||b||} cosθ=2aba2+b2−c2=2x12+y12x22+y22x12+y12+x22+y22+(x1−x2)2+(y1−y2)2=2x12+y12x22+y222x1x2+2y1y2=∣∣a∣∣×∣∣b∣∣ab
以上是二维向量的计算过程,推广到N维向量,分子部分依然是向量的内积,分母部分依然是两个向量模长的乘积。由此可计算文本的余弦相似度。
6.2 附录二:参考文献
1)《Python自然语言处理实践——核心技术与算法》 ,涂铭、刘祥、刘树春 著 ,机械工业出版社
2)《Tensorflow自然语言处理》,【澳】图珊·加内格达拉,机械工业出版社
3)《深度学习之美》,张玉宏,中国工信出版集团 / 电子工业出版社
4)网络部分资源
6.3 附录三:专业词汇列表
| 英文简写 | 英文全写 | 中文 |
|---|---|---|
| NLP | Nature Language Processing | 自然语言处理 |
| NER | Named Entities Recognition | 命名实体识别 |
| PoS | part-of-speech tagging | 词性标记 |
| MT | Machine Translation | 机器翻译 |
| TF-IDF | Term Frequency-Inverse Document Frequency | 词频-逆文档频率 |
| Text Rank | 文本排名算法 | |
| One-hot | 独热编码 | |
| BOW | Bag-of-Words Model | 词袋模型 |
| N-Gram | N元模型 | |
| word embedding | 词嵌入 | |
| NNLM | Neural Network Language Model | 神经网络语言模型 |
| HMM | Hidden Markov Model | 隐马尔可夫模型 |
| RNN | Recurrent Neural Networks | 循环神经网络 |
| Skip-gram | 跳字模型 | |
| CBOW | Continous Bag of Words | 连续词袋模型 |
| LSTM | Long Short Term Memory | 长短期记忆模型 |
| GRU | Gated Recurrent Unit | 门控环单元 |
| BRNN | Bi-recurrent neural network | 双向循环神经网络 |
| FMM | Forward Maximum Matching | 正向最大匹配 |
| RMM | Reverse Maximum Matching | 逆向最大匹配 |
| Bi-MM | Bi-directional Maximum Matching | 双向最大匹配法 |
相关文章:
Python 全栈体系【四阶】(六十一)
第五章 深度学习 十三、自然语言处理(NLP) 5. NLP应用 5.2 文本情感分析 目标:利用训练数据集,对模型训练,从而实现对中文评论语句情感分析。情绪分为正面、负面两种 数据集:中文关于酒店的评论&#…...
工控必备C#
微软的C# 语言? QT 熟了以后,Qt 更方便些 方法Signal Slot 感觉上一样 现在更推荐PyQt 来构建,底层还是Qt C 的那些库,Qt 的开源协议有点狗...
【设计模式之基于特性的动态路由映射模式】
在ASP.NET Core中,路由是核心功能之一,用于将HTTP请求映射到相应的控制器操作。虽然“路由驱动设计模式”是一个我刚杜撰出来的设计模式名称,但我们可以基于ASP.NET Core的路由特性,构建一种以路由为中心的设计模式。 以下是一个…...
GB 16807-2009 防火膨胀密封件
防火膨胀密封件是指在火灾时遇火或高温作用能够膨胀,且能辅助建筑构配件使之具有隔火、隔烟、隔热等防火密封性能的产品。 GB 16807-2009 防火膨胀密封件测试项目 测试要求 测试标准 外观 GB 16807 尺寸允许偏差 GB 16807 膨胀性能 GB 16807 产烟毒性 GB …...
从零开始做题:老照片中的密码
老照片中的密码 1.题目 1.1 给出图片如下 1.2 给出如下提示 这张老照片中的人使用的是莫尔斯电报机,莫尔斯电报机分为莫尔斯人工电报机和莫尔斯自动电报机(简称莫尔斯快机)。莫尔斯人工电报机是一种最简单的电报机,由三个部分组…...
考研数学|张宇和武忠祥,强化能不能同时跟?
可以说你跟武老师学明白了,120完全没问题!如果追求更高,宇哥的怀抱也想你敞开! 学长我21年一战数学83,总分没过线,22年二战143,逆袭上岸211!市面上的老师我基本都听过,最…...
【机器学习】——【线性回归模型】——详细【学习路线】
目录 1. 引言 2. 线性回归理论基础 2.1 线性模型概述 2.2 最小二乘法 3. 数学基础 3.1 矩阵运算 3.2 微积分 3.3 统计学 4. 实现与应用 4.1 使用Scikit-learn实现线性回归 4.2 模型评估 5. 深入理解 5.1 多元线性回归 5.2 特征选择 5.3 理解模型内部 6. 实战与项…...
【mysql】常用操作:维护用户/开启远程/忘记密码/常用命令
一、维护用户 1.1 创建用户 -- 语法 > CREATE USER [username][host] IDENTIFIED BY [password];-- 例子: -- 添加用户user007,密码123456,并且只能在本地可以登录 > CREATE USER user007localhost IDENTIFIED BY 123456; -- 添加用户…...
引领AI新时代:深度学习与大模型的关键技术
文章目录 📑前言一、内容概述二、作者简介三、书籍特色四、学习平台与资源 📑前言 在数字化浪潮席卷全球的今天,人工智能(AI)和深度学习技术已经渗透到我们生活的方方面面。从智能手机中的智能语音助手,到…...
STL——常用算法(二)
一、常用拷贝和替换算法 1.copy #include <iostream> #include <vector> #include <algorithm> using namespace std; void printVector(int val) {cout << val << " "; } void test01() {vector<int>v1;for (int i 0; i <…...
MyCAT 2 底层原理
MyCAT 2 底层原理 1. MyCAT 2 架构概述 MyCAT 2 是一款开源的数据库中间件,它通过分库分表、读写分离、动态路由等机制提升数据库系统的性能和扩展性。MyCAT 2 的架构设计灵活,适用于多种数据库类型,包括 MySQL、PostgreSQL 和 SQL Server …...
操作系统实训复习笔记(第7关:生产者消费者问题实践)
目录 第7关:生产者消费者问题实践 第1关:生产者消费者问题实践 1、在主线程中初始化锁为解锁状态 2、访问对象时的加锁操作与解锁操作 3、(生产和消费进程操作后)信号量操作实现进程同步 4、先等待(生产还是消费…...
通过物联网管理多台MQTT设备-基于全志T527开发板
一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关,该网关能够管理多台MQTT设备,通过MQTT协议对设备进行读写操作,同时提供HTTP接口,允许用户通过HTTP协议与网关进行交互,并对设备进行读写操作。 二、系统架…...
Python学习前简介
1.python简介 2.python特点 3.python解释器 4.pyCharm简介 一、python简介 Python是一种高级编程语言,用于多种应用,包括网站开发、数据科学、人工智能、机器学习、桌面应用、网络应用、软件开发、网络爬虫等。它由Guido van Rossum于1991年首次发布&am…...
【Text2SQL 论文】MAGIC:为 Text2SQL 任务自动生成 self-correction guideline
论文:MAGIC: Generating Self-Correction Guideline for In-Context Text-to-SQL ⭐⭐⭐ 莱顿大学 & Microsoft, arXiv:2406.12692 一、论文速读 DIN-SQL 模型中使用了一个 self-correction 模块,他把 LLM 直接生成的 SQL 带上一些 guidelines 的 p…...
2024 年 8 款最佳建筑 3D 渲染软件
你现在使用的3D 渲染软件真得适合你吗? 在建筑和室内渲染当中,市面上有许多3D渲染软件可供选择。然而,并不是每款软件都适合你的需求。本指南将重点介绍2024年精选的8款最佳建筑3D渲染软件,帮助你了解不同的选项,并选…...
MAB规范(3):Chapter6 Glossary 术语表
第6章 - 术语表 此章不做过多的批注,都是些简单的术语解释。...
40python数据分析numpy基础之diag处理矩阵对角线元素
1 python数据分析numpy基础之diag处理矩阵对角线元素 python的numpy库的diag(v,k0)函数,以一维数组的形式返回方阵的对角线元素,或将一维数组转换为方阵(非对角线元素为0)。 方阵:方形矩阵,行数和列数相等…...
ffmpeg+nginx+video实现rtsp流转hls流,web页面播放
项目场景: 最近调试海康摄像头需要将rtsp流在html页面播放,因为不想去折腾推拉流,所以我选择ffmpeg转hls流,nginx转发,html直接访问就好了 1.首先要下载nginx和ffmpeg 附上下载地址: nginx nginx news ffmpeg htt…...
1、Redis系列-Redis高性能原理详解
Redis高性能原理详解 Redis是一款高性能的内存数据库,广泛应用于需要快速读写访问的数据密集型应用中。它的高性能得益于多方面的设计和优化。以下是Redis高性能实现的详细解释: 1. 单线程架构 Redis采用单线程架构来处理客户端请求,这与传…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
