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

目录

一、项目介绍

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 = 0
        for line in tqdm(f):  # 逐行读取文件内容,并显示循环的进度条
            if i == 0:     # 跳过文件中的第1行表头无用内容,然后使用continue跳过当前当次循环
                i += 1
                continue
            lin = line[2:].strip()   # 使用字符串切片,获取评论内容,剔除标签和逗号,不用split分割,因为评论内容中可能会存在逗号。
            if not lin:     # 如果lin中没有内容则continue,表示没有内容,跳过这一行
                continue
            for 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_freq
        vocab_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 torch

UNK,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 = 0
        for line in tqdm(f):   # 遍历文件内容的每一行,同时展示进度条
            if i == 0:   # 此处循环目的为了跳过第一行的无用内容
                i += 1
                continue
            if not line:   # 筛选是不是空行,空行则跳过
                continue
            label = int(line[0])   # 返回当前行的标签,整型
            content = line[2:].strip('\n')  # 取出标签和逗号后的所有内容,同时去除前后的换行符
            words_line = []   # 用于存放每一行评论的每一个字对应词库的索引值
            token = tokenizer(content)   # 将每一行的内容进行分字,返回一个列表
            seq_len = len(token)    # 获取一行实际内容的长度
            if pad_size:  # 非0即True
                if 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 id
            for 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)调试模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[每周一更]-(第119期):“BP”大揭秘:生物学与金融学中的微小单位竟有如此大不同!

最近&#xff08;2024.09.29&#xff09;央行要把存量房贷在LPR&#xff08;贷款市场报价利率&#xff09;基础上&#xff0c;降低30BP&#xff0c;刚好基因行业内&#xff0c;也有bp的概念&#xff0c;通过发音无法区分&#xff0c;以下就讲解下生物学的bp和金融学的BP的概念的…

【汇编语言】寄存器(内存访问)(三)—— 字的传送

文章目录 前言1. 字的传送2. 问题一3. 问题一的分析与解答4. 问题二5. 问题二的分析与解答结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言…

Linuxtop命令查看CPU、内存使用率、解释

1. top 命令 top 是最常用的实时监控工具之一&#xff0c;可以显示 CPU 的总利用率以及各个进程的 CPU 使用情况。在Linux命令行直接输入top即可查看动态原始数据 top 在 top 命令的输出中&#xff0c;最上面的一行会显示 CPU 的使用情况&#xff1a; us&#xff08;User&a…

day01-Qt5入门

day01-Qt5入门 1.下载Qtcreate 官网地址&#xff1a;http://qt-project.org/downloads 2.配置环境变量 将类似于 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin 的目录添加到环境变量中 3.创建一个新项目 输入自己的项目名称&#xff0c;后面默认下一部 4.运行第一个项目 在窗口…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年&#xff0c;CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream&#xff0c;这是…

Windows环境apache控制台命令行启动、停止、重启httpd服务

Windows环境apache控制台命令行启动、停止、重启httpd服务 启动&#xff1a;httpd -k start 重启&#xff1a;httpd -k restart 停止&#xff1a;httpd -k stop 需指定服务的名称&#xff1a;后面各自加上 -n 服务名 例如&#xff1a;启动指定服务的名称 httpd -k start -n 服务…

LDR6500协议芯片:诱骗取电协议,OTG数据同时实现功能芯片

在当前的电子设备市场中&#xff0c;随着USB Type-C接口的广泛应用&#xff0c;用户对充电和数据传输的需求日益提升。为了满足这一需求&#xff0c;乐得瑞科技凭借其深厚的技术积累和创新能力&#xff0c;推出了LDR6500——一款专为USB Type-C Bridge设备设计的USB PD&#xf…

CVE-2024-30269 DataEase配置信息泄露

文章目录 免责声明漏洞描述fofa影响版本漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 DataEase是一个开源的数据可视化分析工具&#xff0c;可以连接…

IPv6 DNS简介

IPv6网络中的每台主机都是由IPv6地址来标识的&#xff0c;用户只有获得待访问主机的IPv6地址&#xff0c;才能够成功实现访问操作。对于用户来讲&#xff0c;记住主机的IPv6地址是相当困难的&#xff0c;因此设计了一种字符串形式的主机命名机制&#xff0c;这就是域名系统。用…

Java面试题———SpringBoot篇

目录 1、项目中为什么选择SpringBoot 2、SpringBoot的自动装配原理 3、SpringBoot的核心注解是哪个 4、SpringBoot中的starter是干什么的 5、SpringBoot可以有哪些方式加载配置 6、bootstrap.yml和application.yml有何区别 7、SpringBoot读取配置的方式有几种 8、Spring…

[Vue3核心语法] ref、reactive响应式数据

定义: ref用来定义&#xff1a;基本类型数据、对象类型数据&#xff1b; reactive用来定义&#xff1a;对象类型数据。 使用原则: 若需要一个基本类型的响应式数据&#xff0c;必须使用ref。 若需要一个响应式对象&#xff0c;层级不深&#xff0c;ref、reactive都可以。 …

高斯分布、均值与标准差:详细讲解与案例分析

目录 一、高斯分布的定义二、均值的意义三、标准差的作用四、均值与标准差在高斯分布中的关系五、实际应用中的高斯分布六、总结 高斯分布&#xff0c;又称为正态分布&#xff0c;是统计学和概率论中最重要的分布之一。它不仅在理论上有着极其重要的地位&#xff0c;而且在实际…

从HCI和空口分析HFP通话和eSCO建立

背景 HFP作为经典蓝牙通话建立和断开的协商服务&#xff0c;通话数据则是通过eSCO链路进行传输&#xff0c;下面以手机和蓝牙耳机为例&#xff0c;结合HCI和空口分析从HFP连接建立&#xff0c;到AT命令协商会话&#xff0c;再到eSCO通话数据链路的建立 。 1&#xff1a;HFP连…

C# 实操高并发分布式缓存解决方案

1. CAP 原则 CAP 原则也称为布鲁尔定理&#xff0c;由 Eric Brewer 在 2000 年提出&#xff0c;描述了分布式系统中的三个核心属性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Partition Tol…

【Linux】Linux常见指令及权限理解

1.ls指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文…

Golang | Leetcode Golang题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; func constructRectangle(area int) []int {w : int(math.Sqrt(float64(area)))for area%w > 0 {w--}return []int{area / w, w} }

鸿蒙网络编程系列21-使用HttpRequest上传任意文件到服务端示例

1. 前述文件上传功能简介 在前述文章鸿蒙网络编程系列11-使用HttpRequest上传文件到服务端示例中&#xff0c;为简化起见&#xff0c;只描述了如何上传文本类型的文件到服务端&#xff0c;对文件的大小也有一定的限制&#xff0c;只能作为鸿蒙API演示使用&#xff0c;在实际开…

深度学习-24-基于keras的十大经典算法之残差网络ResNet

文章目录 1 残差网络(ResNet)1.1 ResNet简介1.2 ResNet结构2 模型应用2.1 加载数据2.2 构建模型SimpleResNet2.2.1 simple_resnet_block2.2.2 SimpleResNet2.2.3 实例化模型2.2.4 模型训练2.2.5 模型预测2.3 构建模型ResNet182.3.1 residual_block2.3.2 ResNet182.3.3 训练模型…

无人机之三维航迹规划篇

一、基本原理 飞行环境建模&#xff1a;在三维航迹规划中&#xff0c;首先需要对飞行环境进行建模。这包括对地形、障碍物、气象等因素进行准确的测量和分析&#xff0c;以获得可行的飞行路径。 飞行任务需求分析&#xff1a;根据无人机的任务需求&#xff0c;确定航迹规划的…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型&#xff08;加载预测器&#xff09;3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中&#xff0c;有shape_predictor_68_face_landmarks.dat预测器&#xff0c;这是一个…