cnn 验证集 参与训练吗_使用Sentencepiece +CNN进行文本分类

2023-11-09

1 前言

Sentencepiece是google开源的文本Tokenzier工具,其主要原理是利用统计算法,在语料库中生成一个类似分词器的工具,外加可以将词token化的功能;对比开源的分词器,它会将频繁出现的字符串作为词,然后形成词库进行切分,所以它会切分的粒度会更大些。

例如“机器学习领域“这个文本,按jieba会分“机器/学习/领域”,但你想要粒度更大的切分效果,如“机器学习/领域”或者不切分,这样更有利于模型捕捉更多N-gram特征。为实现这个,你可能想到把对应的大粒度词加到词表中就可以解决,但是添加这类词是很消耗人力。然而对于该问题,利用sentencepiece可以得到一定程度解决,甚至能完美解决你的需求。

基于上述的场景,本项目主要探究利用sentencepiece进行文本分类,对比开源的分词器,会有怎样的效果
。在实验中,选择的是中文新闻文本数据集,对比的开源分词器选择的是jieba。若想对sentencepiece有更多的了解,可以查看sentencepiece原理与实践。

2 环境

python3
tensorflow2.0
jieba
sentencepiece
numpy

3 数据集及前期处理

本实验同样是使用THUCNews的一个子集进行训练与测试,数据集请自行到THUCTC:一个高效的中文文本分类工具包下载,请遵循数据提供方的开源协议;

文本类别涉及10个类别:categories = ['体育', '财经', '房产', '家居', '教育', '科技', '时尚', '时政', '游戏', '娱乐'],每个分类6500条数据;

cnews.train.txt: 训练集(5000*10)cnews.val.txt: 验证集(500*10)
cnews.test.txt: 测试集(1000*10)

训练所用的数据,可以下载:链接: https://pan.baidu.com/s/1DOgxlY42roBpOKAMKPPKWA, 密码: up9d

其实,本项目是基于词级别的CNN for text classification, 只是这个词一个从jieba切分过来的,一个是sentencepiece训练的模型识别出来的。在预处理过程中,本项目中只是简单的过滤标点符号,数字类型的词,具体code体现在loader.py 文中的 re_han=re.compile(u"([u4E00-u9FD5a-zA-Z]+)")。

4 超参数说明

class TextConfig():

    embedding_size=100    #dimension of word embedding
    vocab_size=8000     #number of vocabulary

    seq_length=600        #max length of sentence

    num_filters=128       #number of convolution kernel
    filter_sizes=[2,3,4]
    num_classes=10
    hidden_unit=128

    drop_prob=0.5          #droppout
    lr= 1e-3               #learning rate

    num_epochs=10          #epochs
    batch_size=64          #batch_size
    spm=True               #use sentencepiece

    train_dir='./data/cnews.train.txt'
    val_dir='./data/cnews.val.txt'
    test_dir='./data/cnews.test.txt'
    vocab_dir='./data/vocab.txt'

在与jieba对比的时, 默认设定的vocab_size=8000, spm参数控制是否use sentencepiece,其他参数都是一致的;./data/vocab.txt是用jieba切分后前8000的高频词;

5 实验对比

(1) 训练和验证准确率对比

(2) 训练中损失变化对比

从训练结果来看,二者相差并不大,利用spm+cnn在验证集上有一定的提升,但在测试集jieba+cnn表现好一些。通过这些微小数据对比,个人觉得利用sentencepiece相对jieba这类正规分词器来说,更容易过拟合些,换个角度来说,它捕捉的特征更多些,但也带来更多噪声特征的影响。

(3) 载入数据集的消耗时间

对比jieba分词器,sentencepiece切分效率是它的近6倍,基于这个优势,是可以看出sentencepiece的使用价值的,尤其当处理文档级文本的时候。

(4) 是不是词表越大越好
在与jieba对比中,设定的是8000个高频词,可能有疑问:是不是词表越大效果会越好?对此,本实验在spm+cnn模型下,对比了词表8000,20000,320000(sentencepiece能训练的最大词表),效果如下:

可以看出,随着词表增大,在训练集上更早的达到“潜在的最好效果”,而在验证集上的表现越来越差。理论上不是词表越大越好吗,它毕竟降低了未登录词出现的概率。其实,我想是这样的,该新闻数据集的各个label区分度是很高的,也就是说影响每个label的特征都是很明显的,而且这些影响特征都是可用高频词汇组合出来的。如果加大词表,就相当于training过程中,让model学到很多label的噪声特征,导致在验证集上效果降低。

还有一个原因:该数据集不论基于字,词,或者加上word2vec词向量,它的train_accuracy都很高;如果一个数据集的train_accuracy较低,增加词表应该会有正向的提升。

(4) spm不同词表下切分效果对比
在训练sentencepiece,可以设定输出词表的大小。本实验训练了8000,20000,320000三个级别的spm model,对比jieba,看看它们切分文本的效果,如下:

对比显示:随着词表增大,spm切分的粒度越来越大;三个spm模型都将“新浪体育讯北京时间”当一个词块,说明语料库中该词块出现的频率很高;在spm_320000模型下,将“洛杉矶湖人主场迎战新奥尔良黄蜂”切在一起,粒度是相当的大,直接是将一句话当成一个词块。

此外,可以看出spm_8000下粒度太细了,很多单字情况,这种情况明显是没有jieba效果好,也就影响了模型的训练,试想:如果在训练spm模型的时候,是不是可以限定下词的长度,只要长度2以上的高频词汇,是不是再去词token化效果会好些。

我之前也尝试:让jieba先切分下,形成词列表,然后再用sentencepiece去训练,这样二者就有种互补的效果,一来减少jieba因为词库的原因导致很多高频词组切开的影响,二来可利用sentencepiece的切分效率。但在实际操作中,并没有实现,不知道是对开源的sentencepiece工具没搞清楚,还是它本事就有这个问题。之前也有朋友遇到同样的问题,也与他探讨过,当目前还是没解决...

6 结语

利用sentencpiece代替分词器进行下游任务,是完全可行的,一来它与正规分词器对比效果是相当的,二来它的切分效率很高,可降低模型在token化消耗的时间,这对在工业上应用是合适的。只是在使用过程中,可调式下词表大小,不宜过高,但也要具体场景具体对比看下,是否有必要把词表加大。此外,如果在领域性很强的任务时,或者在做multi-label任务时,我想sentencpiece带来的效果应该更明显。当然,上述提到的问题,若能解决,会让sentencpiece在中文处理上更有价值。对此感兴趣的朋友,若有啥问题,可与我私下交流~

7 参考

  1. Text classification with CNN and Word2vec
  2. sentencepiece原理与实践
  3. SentencePiece

更多文章可关注笔者公众号:自然语言处理算法与实践

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cnn 验证集 参与训练吗_使用Sentencepiece +CNN进行文本分类 的相关文章

  • 算法编程7:一个四位数 abcd,满足 abcd * 4 = dcba,求这个数

    描述 一个四位数 abcd 满足 abcd 4 dcba 求这个数 编程实现1 for i in list range 1000 2500 num2 i 4 a i 1000 b i 1000 100 c i 1000 100 10 d i
  • 序列化错误小结:SerializationFailedException

    公司项目 不提供具体代码 仅提供思路 问题描述 错误报告MultipartRequest无法实现序列化 问题解决1 发生SerializationFailedException时 第一时间根据错误报告定位错误类 发现MultipartReq
  • 分布式事务专题之9、分布式事务解决方案之最大努力通知型

    目录 1 支付宝充值案例 假如我们自己有一个电商系统 支持用户使用支付宝充值 流程如下 2 用户支付流程 是一个同步的过程 用户在浏览器发起充值请求 gt 电商服务 电商服务生成充值订单 状态为0 待支付 0 待支付 100 支付成功 20
  • 软件产品质量模型

    ISO IEC 9126是国际标准组织 ISO 制订的用于评估软件质量的国际标准1 ISO IEC 9126标准由6个特性和27个子特性组成 是评价软件质量的国际标准1 ISO IEC 9126已经被ISO IEC 25010取代 后者是国
  • STM32刷Micropython固件参考指南

    STM32刷Micropython固件指南 其实刷固件和普通的程序下载烧录无多大的差异 主要是其他因数的影响导致刷固件或刷完固件无法运行的情况和相关问题 刷固件教程 固件下载 目前所支持的stm32型号有这些 stm32f0 stm32f4
  • linux进阶05——Makefile(二)

    1 源代码 main c int main printf hello world n fun1 fun2 fun1 c void fun1 printf this is fun1 n fun2 c void fun2 printf this
  • BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT 个人翻译 并不权威 paper https arxiv org pdf 1810 04805 pdf BERT Pre training of Deep Bidirectional Transformers for Languag
  • sql语句大全+实例讲解

    1 创建3张表 学生表创建 CREATE table student Sno CHAR 9 PRIMARY KEY Sname CHAR 20 UNIQUE Ssex char 2 Sage SMALLINT Sdept char 20 课
  • LCD 驱动

    LCD的型号是 CM162 4 有U1 U2 外形尺寸 L W H mm 80 36 12 点数 mm 5 8 内藏控制器 SPLC 780 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 GND VDD VO
  • vue3+element-plus+js 对列表查询/重置条件 组件简单封装

    在写后台管理的时候会有很多列表 列表上面一般会有查询条件 对列表进行搜索查询 所以就想封装成为组件 就不需要每个页面写一堆的代码 直接循环出来进行遍历即可 1 封装子组件searchForm组件
  • 利用Bat命令批量修改文件名

    因为科研需求 需要把文件名规范统一命名 整体思路 先获得原始文件名字 带后缀 再导到excel里搞好新名字 构建好Bat的ren函数 完成修改 具体措施 1 读取原本文件名称 在相应的文件目录下 新建一个文本文件 并且打开输入 dir b
  • 移动端物理像素和设备独立像素

    https blog csdn net aiolos1111 article details 51880223 https www cnblogs com samwu p 5341056 html http www softwhy com
  • ifconfig命令详解

    在CU论坛里看到一个关于google面试的帖子 当中提到的一个面试题就是ifconfig命令的用法 所以今天就趁些机会在网上找了一些关于ifconfig的文章 转到这边来 大家一起学习 以下转自 http www photox cn IT
  • linux之date命令

    date 命令用于 显示 或 设置系统的时间或日期 格式 date 参数 日期格式 注意 date后面有一个空格 否则无法识别命令 shell对空格是很严格的 1 Linux date命令参数 日期时间格式符号 H 小时 以00 23来表示
  • x = torch.cat((x1, x2), dim=1) dim是什么意思,决定什么变量

    在这个例子中 x torch cat x1 x2 dim 1 意思是将 x1 和 x2 按照第一维拼接起来 得到新的 tensor x 变量 dim 1 决定了拼接的维度
  • re学习(29)攻防世界-CatFly(复原反汇编)

    因为这是一个 dll文件 在Linux上运行一下 找到主要函数 以及由上面三部分对应的代码部分 int64 fastcall main int a1 char a2 char a3 size t v3 rbx int16 v5 4 rsp
  • Docker安装Elasticsearch 8.x 、Kibana 8.x等

    这里我使用的是8 2 0版本 同时内容会介绍ik分词和elastic head的安装 elasticsearch java的配置 1 下载ik分词器插件 下载地址 https github com medcl elasticsearch a
  • 年轻人 vs 存款

    近日 有调查称 大概五分之一的年轻人存款在一万元以内 10万元存款是一个 坎 存款超过10万就会超过53 7 的人 年轻人 存款 两个词碰撞在一起 引来了广泛的关注和讨论 你认为年轻人存款难吗 可以从以下几个角度发表你的看法 存款 角度一
  • Redis入门之一

    设置后台进程 进入redis conf中的136行改成 yes 设置后台进程 修改bind 改成qianfeng01 改密码 找到第500行左右 requorepass 改成123456 登录的代码 查看 ps ef grep redis

随机推荐

  • 数据挖掘基础之数据库

    最近出现的一种数据库结构是数据仓库 1 3 2 小节 这是一种多个异种数据源在单个站点以统一的模式组织的存储 以支持管理决策 数据仓库 技术包括数据清理 数据集成和联机分析处理 OLAP OLAP 是一种分析技术 具有汇总 合并和聚集功能
  • RSA算法Java版(不要求支持大数)但实现了(dog

    RSA算法 支持大数 题目描述 C 中数据的类型与长度参考 因此 C 最大能支持的十进制是19位的整数 如果要支持更大的整数 需要实现Big Number类 RSA目前比较安全的密钥长度是2048位二进制 即是617位的十进制 因此 C 自
  • grafana 使用 Node Exporter for Prometheus Dashboard 监控服务器基础信息

    使用 Node Exporter for Prometheus Dashboard 监控服务器CPU 内存 磁盘 IO 网络 流量 温度等指标 当需要监控服务器的CPU 内存 磁盘 IO 网络 流量 温度等指标 可以使用 grafana 的
  • Eclipse 直接开发HANA UI5 ABAP等(提供完整配套软件 和jar包及操作文档)_SAP刘梦_新浪博客...

    之前写了HANA Studio 安装 ABAP UI5 插件等等 现在写下直接用Eclipse 有人说了现象 打开HANA Studio 做HANA建模 然后呢 打开个eclipse 做UI5 其实没必要 本来HAHA studio就是ec
  • Vue源码解读(六):update和patch

    Vue 的 update 是实例上的一个私有方法 主要的作用就是把 VNode 渲染成真实的 DOM 它在首次渲染和数据更新的时候被调用 在数据更新的时候会发生新 VNode 和 旧 VNode 对比 获取差异更新视图 我们常说的 diff
  • ChatGPT Plus价格太贵,可以约上三五知己一起上车体验一下,这个项目就能帮到你

    对于想体验ChatGPT PLus的小伙伴 可能觉得自己一个人一个月花费20美元 相对于人民币每月137多 确实是一个不少的开支 如果 几个人合作一个账号 这样负担就减少了 刚好 最近逛github发现刚好有一个这样的项目 项目介绍 Cha
  • is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 2.6 GB

    背景 执行一个kylin任务 然后报错 TaskAttempt killed because it ran on unusable nodekylin1 dtwave dev local 8041 Container released on
  • excel发给别人图片全是代码_PHP读取Excel内的图片(附代码)

    php中文网最新课程 每日17点准时技术干货分享 今天接到了一个从Excel内读取图片的需求 在网上查找了一些资料 基本实现了自己的需求 不过由于查到的一些代码比较久远 里面一些库方法已经被移除不存在了 所以不能直接移植到自己的项目里 需要
  • 在python中如何让一个函数分段执行呢?

    在python中如何让一个函数分段执行呢 原因 最新在写分针的逻辑 最开始讲一大段代码分成好几个小的函数 讲函数放进数组中 每一帧执行一个 但总是觉得这样写不够优美 今天看到其他大神的代码 记录一下思路 前提要理解generator pyt
  • 【论文写作】——设置正文和标题格式

    目录 一 设置正文格式 二 设置标题格式 一 设置正文格式 找到功能区的样式 右键正文样式 点击修改 左下角选择字体 设置字体的字形字号 也可选择对正文的段落格式进行修改 二 设置标题格式 可直接将文中同一级别的大纲进行折叠 然后直接设置同
  • 拓数派发布新一代云原生虚拟数仓PieCloudDB

    3 月 14 日 2023 拓数派 Infinite Possibilities 战略暨新产品发布会在上海圆满落幕 拓数派创始人兼 CEO 冯雷 Ray Von 重磅发布基于新一代云原生数仓虚拟化打造的全新 PieCloudDB 云上云 版
  • (手工)【sqli-labs24】二次注入:原理、利用过程

    目录 推荐 一 手工 SQL注入基本步骤 二 Less24 POST Second Order injections Real treat Stored injections 简介 GET注入 二次注入 第一步 获知目标账号并注册 第二步
  • Git在码云上传大文件-lfs

    lfs的安装网上搜索 安装好后以下操作 注意 大文件使用SSH传输 上传前先配置好码云的私钥 git init 创建本地仓库环境 git lfs install 安装大文件上传应用 git lfs track 追踪要上传的大文件 表示路径下
  • 小程序拒绝摄像头授权,重新允许无法调起摄像头

    小程序拒绝摄像头授权 重新允许无法调起摄像头 公司项目需要做到自动拍照功能 发现如果用户拒绝了授权 再重新引导用户授权后 无法重新调用摄像头 然后做了各种尝试 发现是页面渲染camera问题 当用户进入页面拒绝或者允许授权时这个标签都已经被
  • Mysql 复习笔记- 基础篇3 [常见增删改查]

    Mysql 复习笔记 基础篇 3 常见增删改查 声明 此笔记不会出现比如说Mysql发展历史这种问题 多为实用的命令和使用中的必要知识 请海涵 这篇文档我们不会对查询进行复习 我们将会把查询的操作的部分放到了后面的查询文档中 我们将复习到级
  • qt 按钮单击的信号_QPushButton 点击信号分析

    QPushButton 点击信号分析 QPushButton有三个很重要的信号跟点击有关 pressed clicked toggled 表面上看 pressed和clicked都会在点击按钮时触发 它们有什么区别呢 toggled好像有时
  • React18:创建React项目(手动)

    项目结构 常规的React项目需要使用npm 或yarn 作为包管理器来对项目进行管理 并且React官方为了方便我们的开发 为我们提供react scripts包 包中提供了项目开发中的大部分依赖 大大的简化了项目的开发 开发步骤 1 创
  • GPIO口的脚本配置之——全志H3script.bin

    此脚本的作用之一是配置GPIO的默认状态 如 功能 内部电阻状态 驱动能力等 1 但是直接打开script bin 文件则会出现乱码 那么我们怎么才可以打开并更改该脚本的配置呢 在路径uboot kernel orangepi sdk to
  • PyTorch分布式训练进阶:这些细节你都注意到了吗?

    导语 pytorch作为目前主流的深度学习训练框架之一 可以说是每个算法同学工作中的必备技能 此外 pytorch提供了极其方便的API用来进行分布式训练 由于最近做的工作涉及到一些分布式训练的细节 在使用中发现一些之前完全不会care的点
  • cnn 验证集 参与训练吗_使用Sentencepiece +CNN进行文本分类

    1 前言 Sentencepiece是google开源的文本Tokenzier工具 其主要原理是利用统计算法 在语料库中生成一个类似分词器的工具 外加可以将词token化的功能 对比开源的分词器 它会将频繁出现的字符串作为词 然后形成词库进