《深度学习》【项目】自然语言处理——情感分析 <上>

目录

一、项目介绍

1、项目任务

2、评论信息内容

3、待思考问题

1)目标

2)输入字词格式

3)每一次传入的词/字的个数是否就是评论的长度

4)一条评论如果超过32个词/字怎么处理?     

5)一条评论如果没有32个词/字怎么处理?     

6)如果语料库中的词/字太多是否可以压缩?     

7)被压缩的词/字如何处理?     

二、项目实施

1、读取文件,建立词表

1)代码内容

2)部分内容拆分解析

3)代码运行结果

4)调试模式

2、评论删除、填充,切分数据集

1)代码内容

2)运行结果

3)调试模式


一、项目介绍

1、项目任务

        对微博评论信息的情感分析,建立模型,自动识别评论信息的情绪状态。

2、评论信息内容

3、待思考问题

        1)目标

                将每条评论内容转换为词向量。

        2)输入字词格式

                每个词/字转换为词向量长度(维度)200,使用腾讯训练好的词向量模型有4960个维度,需要这个模型或者文件可私信发送。

        3)每一次传入的词/字的个数是否就是评论的长度

                应该是固定长度,如何固定长度接着看,固定长度每次传入数据与图像相似,例如输入评论长度为32,那么传入的数据为32*200的矩阵,表示这一批词的独热编码,200表示维度

        4)一条评论如果超过32个词/字怎么处理?     

                超出的直接删除后面的内容

        5)一条评论如果没有32个词/字怎么处理?     

                缺少的内容,统一使用一个数字(非词/字的数字)替代,项目中使用<PAD>填充

        6)如果语料库中的词/字太多是否可以压缩?     

                可以,某些词/字出现的频率比较低,可能训练不出特征。因此可以选择频率比较高的词来训练,项目中选择4760个。

        7)被压缩的词/字如何处理?     

                可以统一使用一个数字(非词/字的数字)替代,即选择了评论固定长度的文字后,这段文字内可能有频率低的字,将其用一个数字替代,项目内使用<UNK>替代

二、项目实施

1、读取文件,建立词表

        1)代码内容

                将下列代码写入命名为vocab_create.py的文件内,方便见名知义调用内部函数

from tqdm import tqdm   # 导入进度条函数
import pickle as pkl   # 将序列化对象保存为一个二进制字节流文件MAX_VOCAB_SIZE = 4760   # 词表长度限制长度,总共10000+个无重复的字
UNK,PAD = '<UNK>','<PAD>'   # 未知字,padding符号  今天天气真好,我咁要去打球->今天天气真好,我<UNK>要去打球<PAD><PAD><PAD><PAD><PAD>def build_vocab(file_path,max_size,min_freq):  # 参数分别表示,文件地址、词表最大长度、剔除的最小词频数"""函数功能:基于文本内容建立词表vocab,vocab中包含语料库中的字”"""tokenizer = lambda x: [y for y in x]    # 定义了一个函数tokenizer,功能为分字,返回一个列表,存放每一个字vocab_dic = {}   # 用于保存字的字典,键值对,键为词,值为索引号with open(file_path,'r',encoding='UTF-8') as f:   # 打开评论文件i = 0for line in tqdm(f):  # 逐行读取文件内容,并显示循环的进度条if i == 0:     # 跳过文件中的第1行表头无用内容,然后使用continue跳过当前当次循环i += 1continuelin = line[2:].strip()   # 使用字符串切片,获取评论内容,剔除标签和逗号,不用split分割,因为评论内容中可能会存在逗号。if not lin:     # 如果lin中没有内容则continue,表示没有内容,跳过这一行continuefor word in tokenizer(lin):  # 遍历列表里的每一个元素,tokenizer(lin)将每一行的评论中的每个字符分成单独的一个,然后存入列表vocab_dic[word] = vocab_dic.get(word,0)+1   # 统计每个字出现的次数,并以字典保存,字典的get用法,读取键word对应的值,如果没有读取到则将其值表示为0,这里的值表示出现次数,因为这里每出现一次值都加1,键独一无二,值可以相同# 筛选词频大于1的,并排序字典中每个字的值的大小,降序排列,(拆分见下一条代码块)vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq],key=lambda x:x[1],reverse=True)[:max_size]   # 先通过for循环加if条件语句筛选出字典的值大于传入参数min_freq的键值对列表,然后对其排序,最后取出前max_size个元素# 建立新的字典vocab_dic = {word_count[0]:idx for idx,word_count in enumerate(vocab_list)}  # 列表中存放每个元素是一个元组,元组里存放的是键值对的信息,将每个元组遍历出来,给予索引0的值一个索引,以此给每个字符打上索引值,返回一个字典vocab_dic.update({UNK:len(vocab_dic),PAD:len(vocab_dic)+1})   # 在字典中更新键值对  {'<UNK>':4760,'<PAD>':4761}print(vocab_dic)  # 打印全新的字典# 保存字典,方便直接使用pkl.dump(vocab_dic,open('simplifyweibo_4_moods.pkl','wb'))   # 此时统计了所有的文字,并将每一个独一无二的文字都赋予了独热编码,将上述的字典保存为一个字节流文件print(f'Vocab size:{len(vocab_dic)}')   # 将评论的内容,根据你现在词表vocab_dic,转换为词向量return vocab_dic  # 输入文件地址,对内部文件进行处理,设定最大长度,返回该文件里的所有独一无二的字符及其对应的索引的字典,其中包含两个填充字符及其索引,一个是填充未知字,一个是填充符号"""词库的创建"""
# 此处设置下列判断语句来执行的目的是为了防止外部函数调用本文件时运行下列代码
if __name__ == '__main__':   # 当自己直接执行本文件代码,会运行main,中的代码vocab = build_vocab('simplifyweibo_4_moods.csv',MAX_VOCAB_SIZE,1)print('vocab')# 如果是调用本代码,则不会执行main中的代码
        2)部分内容拆分解析
vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] > min_freq],key=lambda x:x[1],reverse=True)[:max_size]vocab_list = []   # 空列表,存放元组形式的空列表
for a in vocab_dic.items():   # 遍历出来字典中的键值对,用a表示if a[1] > min_freq:   # 判断键值对的值是否大于min_freqvocab_list.append(a)
vocab_list = sorted(vocab_list,key=lambda x:x[1],reverse=True)  # 使用sorted函数排序,key表示排序的依据,使用匿名函数,并索引键值对的值排序,reverse为布尔值,是否降序
vocab_list = vocab_list[ : max_size]   # 索引前max_size个值

        3)代码运行结果

        4)调试模式

2、评论删除、填充,切分数据集

        1)代码内容

                将下列代码放入创建的文件名为load_dataset.py的文件中,后面还有代码需要往里增加

from tqdm import tqdm
import pickle as pkl
import random
import torchUNK,PAD = '<UNK>','<PAD>'  # 未知字,padding符号
def load_dataset(path,pad_size=70):   # path为文件地址,pad_size为单条评论字符的最大长度contents = []   # 用来存储转换为数值标号的句子,元祖类型,里面存放每一行每一个字的对应词库的索引、每一行对应的标签、每一行的实际长度70及以内vocab = pkl.load(open('simplifyweibo_4_moods.pkl','rb'))   # 读取vocab词表文件,rb二进制只读tokenizer = lambda x:[y for y in x]    # 自定义函数用来将字符串分隔成单个字符并存入列表with open(path,'r',encoding='utf8') as f:  # 打开评论文件i = 0for line in tqdm(f):   # 遍历文件内容的每一行,同时展示进度条if i == 0:   # 此处循环目的为了跳过第一行的无用内容i += 1continueif not line:   # 筛选是不是空行,空行则跳过continuelabel = int(line[0])   # 返回当前行的标签,整型content = line[2:].strip('\n')  # 取出标签和逗号后的所有内容,同时去除前后的换行符words_line = []   # 用于存放每一行评论的每一个字对应词库的索引值token = tokenizer(content)   # 将每一行的内容进行分字,返回一个列表seq_len = len(token)    # 获取一行实际内容的长度if pad_size:  # 非0即Trueif len(token) < pad_size:   # 如果一行的字符数少于70,则填充字符<PAD>,填充个数为少于的部分的个数token.extend([PAD]*(pad_size-len(token)))else:   # 如果一行的字大于70,则只取前70个字token = token[:pad_size]   # 如果一条评论种的宁大于或等于70个字,索引的切分seq_len = pad_size   # 当前评论的长度# word to idfor word in token:  # 遍历实际内容的每一个字符words_line.append(vocab.get(word,vocab.get(UNK)))  # vocab为词库,其中为字典形式,使用get去获取遍历出来的字符的值,值可表示索引值,如果该字符不在词库中则将其值增加为字典中键UNK对应的值,words_line中存放的是每一行的每一个字符对应的索引值contents.append((words_line,int(label),seq_len))  # 将每一行评论的字符对应的索引以及这一行评论的类别,还有当前评论的实际内容的长度,以元组的形式存入列表random.shuffle(contents)   # 随机打乱每一行内容的顺序"""切分80%训练集、10%验证集、10%测试集"""train_data = contents[ : int(len(contents)*0.8)]   # 前80%的评论数据作为训练集dev_data = contents[int(len(contents)*0.8):int(len(contents)*0.9)]   # 把80%~90%的评论数据集作为验证数热test_data = contents[int(len(contents)*0.9):]    # 90%~最后的数据作为测试数据集return vocab,train_data,dev_data,test_data   # 返回词库、训练集、验证集、测试集,数据集为列表中的元组形式if __name__ == '__main__':vocab,train_data,dev_data,test_data = load_dataset('simplifyweibo_4_moods.csv')print(train_data,dev_data,test_data)print('结束')
        2)运行结果

        3)调试模式

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

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

相关文章

【论文阅读】SRCNN

学习资料 论文题目&#xff1a;Learning a Deep Convolutional Network for Image Super-Resolution&#xff08;学习深度卷积网络用于图像超分辨率&#xff09;论文地址&#xff1a;link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码&#xff1a;作者提出的…

zabbix报警设置

文章目录 I 通过脚本媒介,调用钉钉电话API。配置脚本设置脚本媒介II 配置发送邮件的信息案例:配置163邮箱配置接收媒介创建动作知识扩展DING 2.0 发钉钉钉机器人自定义webhookzabbix执行远程命令I 通过脚本媒介,调用钉钉电话API。 zabbix可以通过脚本调用钉钉电话API,需要…

工程文件参考——STM32+HAL+SPI主从机通讯

文章目录 前言CubeMX设置SPI设置NSS设置 SPI从机代码SPI主机代码 前言 关于如何简单的写一个稳定的SPI主从机通讯&#xff0c;思路很简单 1、SPI高速传输的时候很容易出现错位之类的问题&#xff0c;CRC的校验首先是必要的。在STM32中SPI使用DMA通讯可以自动执行CRC的校验&…

Linux——Harbor(容器镜像 管理项目)

镜像拉取存在一定的问题&#xff0c;出现原因在于&#xff1a; 使用官方公共仓库中的镜像。 拉取的镜像&#xff0c;主要保存在一下仓库中&#xff1a; docker.io //Docker hub 最大的官方维护的公共镜像仓库&#xff0c;一般都会提供所有项目的最新版镜像&#xff0c;镜像…

springboot 整合 快手 移动应用 授权 发布视频 小黄车

前言&#xff1a; 因快手文档混乱&#xff0c;官方社区技术交流仍有很多未解之谜&#xff0c;下面3种文档的定义先区分。 代码中的JSON相关工具均用hutool工具包 1.快手 移动双端 原生SDK 文档https://mp.kuaishou.com/platformDocs/develop/mobile-app/ios.html 2.快手 Api 开…

物联网智能项目(含案例说明)

物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来&#xff0c;实现设备之间的互联互通&#xff0c;并通过数据采集、传输、处理和分析&#xff0c;实现智能化管理和控制的项目。以…

Qt入门教程:创建我的第一个小程序

本章教程&#xff0c;主要介绍如何编写一个简单的QT小程序。主要是介绍创建项目的过程。 一、打开QT软件编辑器 这里使用的是QT5.14.2版本的&#xff0c;安装教程参考以往教程&#xff1a;https://blog.csdn.net/qq_19309473/article/details/142907096 二、创建项目 到这里&am…

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…

Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范&#xff0c;其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码&#xff08;为了阅…

【机器学习】朴素贝叶斯算法|商品评论情感分析案例介绍及代码实现

文章目录 朴素贝叶斯算法朴素贝叶斯算法介绍概率数学基础复习朴素贝叶斯算法-利用概率值进行分类的一种机器学习算法贝叶斯公式朴素贝叶斯算法拉普拉斯平滑系数 朴素贝叶斯API案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

架构设计笔记-11-未来信息综合技术

知识要点 云原生架构原则包括&#xff1a;服务化原则、弹性原则、可观测原则、韧性原则、所有过程自动化原则、零信任原则和架构持续演进原则。 区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可…

CVE-2022-26965靶机渗透

​ 开启环境 ​ ​ 进入环境 ​ ​ 使用弱口令admin登录 ​ ​ 利用cms主题构造木马 ​ 需要将主题中的info.php文件修改&#xff0c;再打包成zip再上传&#xff0c;通过网络搜索找到Github中的Pluck CMS&#xff0c;进入后随便下载任一主题 https://github.com/sear…

服务性能优化之mybatis-plus 开启与关闭 SQL 日志打印

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;mybatis-plus 开启与关闭 SQL 日志打印 第一&#xff1a;开启打印 Mybatis-plus 需要通过下面的方式开启控制台 SQL 日志打印 myba…

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈

在科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术&#xff0c;试图借助其变革力量在竞争中突围&#xff0c;然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…

4K变倍镜头特点

1、高分辨率成像&#xff1a; ① 能够呈现清晰、细腻的图像&#xff0c;可清晰快速地识别出被测物体的微小细节、特征以及潜在的缺陷等。例如在芯片外观瑕疵检测中&#xff0c;能清晰地分辨出芯片上的刮痕、污渍、破损、引脚缺失等问题。 ② 相比传统的变倍镜头&#xff0c;在…

LabVIEW提高开发效率技巧----队列使用

在LabVIEW开发中&#xff0c;队列是实现并行处理、数据传递和任务调度的关键机制之一&#xff0c;合理使用队列可以有效提高程序性能并避免内存问题。结合队列长度限制和其他队列相关技巧&#xff0c;以下是队列使用的详细说明&#xff1a; 1. 队列长度限制 限制队列的长度可以…

全面讲解C++

数据类型 1.1 基本数据类型 1.1.1 整型&#xff08;Integer Types&#xff09; 整型用于表示整数值&#xff0c;分为以下几种类型&#xff1a; int&#xff1a;标准整数类型&#xff0c;通常为4字节&#xff08;32位&#xff09;。short&#xff1a;短整型&#xff0c;通常…

量子数字签名概述

我们都知道&#xff0c;基于量子力学原理研究密钥生成和使用的学科称为量子密码学。其内容包括了量子密钥分发、量子秘密共享、量子指纹识别、量子比特承诺、量子货币、秘密通信扩展量子密钥、量子安全计算、量子数字签名、量子隐性传态等。虽然各种技术发展的状态不同&#xf…

FreeRTOS学习总结

背景&#xff1a;在裸机开发上&#xff0c;有时候我们需要等待某个信号或者需要延迟时&#xff0c;CPU的运算是白白浪费掉了的&#xff0c;CPU的利用率并不高&#xff0c;我们希望当一个函数在等待的时候&#xff0c;可以去执行其他内容&#xff0c;提高CPU的效率&#xff0c;同…

windows修改文件最后修改时间

一、需要修改日期的文件 背景:有时候我们需要做一些文件定期删除的操作,但是测试时候并不一定有符合测试的文件,这时候就需要可以方便的修改文件的最后修改时间。 系统环境:windows 测试文件:如上 修改时间方式:windows 脚本。 二、测试脚本 (1) 脚本 # 指定文件路径 …