中文文本分类 pytorch实现

前言

使用pytorch实现了TextCNN,TextRNN,FastText,TextRCNN,BiLSTM_Attention,DPCNN,Transformer,开箱即用。

中文数据集

我从THUCNews:THUCTC: 一个高效的中文文本分类工具中抽取了20万条新闻标题,文本长度在20到30之间。一共10个类别,每类2万条。

以字为单位输入模型,使用了预训练词向量:搜狗新闻 Word+Character 300d:GitHub - Embedding/Chinese-Word-Vectors: 100+ Chinese Word Vectors 上百种预训练中文词向量

类别:财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。

数据集、词表及对应的预训练词向量已上传,开箱即用。

模型效果:


bert,ERNIE代码:Bert-Chinese-Text-Classification-Pytorch

1.TextCNN

数据处理:所有句子padding成一个长度:seq_len

1.模型输入:

[batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化, 词向量维度为embed_size:

[batch_size, seq_len, embed_size]

3.卷积层:NLP中卷积核宽度与embed-size相同,相当于一维卷积。

3个尺寸的卷积核:(2, 3, 4),每个尺寸的卷积核有100个。卷积后得到三个特征图:

[batch_size, 100, seq_len-1]

[batch_size, 100, seq_len-2]

[batch_size, 100, seq_len-3]

4.池化层:对三个特征图做最大池化

[batch_size, 100]

[batch_size, 100]

[batch_size, 100]

5.拼接:

[batch_size, 300]

6.全连接:num_class是预测的类别数

[batch_size, num_class]

7.预测:softmax归一化,将num_class个数中最大的数对应的类作为最终预测

[batch_size, 1]

分析:

卷积操作相当于提取了句中的2-gram,3-gram,4-gram信息,多个卷积是为了提取多种特征,最大池化将提取到最重要的信息保留。

2.TextRNN

图片是单向RNN,看个意思就行

1.模型输入: [batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化, 词向量维度为embed_size:

[batch_size, seq_len, embed_size]

3.双向LSTM:隐层大小为hidden_size,得到所有时刻的隐层状态(前向隐层和后向隐层拼接)

[batch_size, seq_len, hidden_size * 2]

4.拿出最后时刻的隐层值:

[batch_size, hidden_size * 2]

5.全连接:num_class是预测的类别数

[batch_size, num_class]

6.预测:softmax归一化,将num_class个数中最大的数对应的类作为最终预测

[batch_size, 1]

分析:

LSTM能更好的捕捉长距离语义关系,但是由于其递归结构,不能并行计算,速度慢。

3.TextRNN+Attention

1.模型输入: [batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化, 词向量维度为embed_size: [batch_size, seq_len, embed_size]

3.双向LSTM:隐层大小为hidden_size,得到所有时刻的隐层状态(前向隐层和后向隐层拼接) [batch_size, seq_len, hidden_size * 2]

4.初始化一个可学习的权重矩阵w
w=[hidden_size * 2, 1]

5.对LSTM的输出进行非线性激活后与w进行矩阵相乘,并经行softmax归一化,得到每时刻的分值:
[batch_size, seq_len, 1]

6.将LSTM的每一时刻的隐层状态乘对应的分值后求和,得到加权平均后的终极隐层值
[batch_size, hidden_size * 2]

7.对终极隐层值进行非线性激活后送入两个连续的全连接层
[batch_size, num_class]

8.预测:softmax归一化,将num_class个数中最大的数对应的类作为最终预测
[batch_size, 1]

分析:
其中4~6步是attention机制计算过程,其实就是对lstm每刻的隐层进行加权平均。比如句长为4,首先算出4个时刻的归一化分值:[0.1, 0.3, 0.4, 0.2],然后

4.TextRCNN

 

1.模型输入: [batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化, 词向量维度为embed_size: [batch_size, seq_len, embed_size]

3.双向LSTM:隐层大小为hidden_size,得到所有时刻的隐层状态(前向隐层和后向隐层拼接) [batch_size, seq_len, hidden_size * 2]

4.将embedding层与LSTM输出拼接,并进行非线性激活:
[batch_size, seq_len, hidden_size * 2 + embed_size]

5.池化层:seq_len个特征中取最大的
[batch_size, hidden_size * 2 + embed_size]

6.全连接后softmax
[batch_size, num_class] ==> [batch_size, 1]

分析:
双向LSTM每一时刻的隐层值(前向+后向)都可以表示当前词的前向和后向语义信息,将隐藏值与embedding值拼接来表示一个词;然后用最大池化层来筛选出有用的特征信息。emm...就做了一个池化,就能称之为RCNN...
需要注意的是,我的实现和论文中略有不同,论文中其实用的不是我们平时见的RNN,其实从图中能看出来,看公式的区别:

传统RNN:

论文中:

符号看不懂不要紧,我给转换一下:

5.FastText

0.用哈希算法将2-gram、3-gram信息分别映射到两张表内。

1.模型输入: [batch_size, seq_len]

2.embedding层:随机初始化, 词向量维度为embed_size,2-gram和3-gram同理:
word: [batch_size, seq_len, embed_size]
2-gram:[batch_size, seq_len, embed_size]
3-gram:[batch_size, seq_len, embed_size]

3.拼接embedding层:
[batch_size, seq_len, embed_size * 3]

4.求所有seq_len个词的均值
[batch_size, embed_size * 3]

5.全连接+非线性激活:隐层大小hidden_size
[batch_size, hidden_size]

6.全连接+softmax归一化:
[batch_size, num_class]==>[batch_size, 1]

分析:
不加N-Gram信息,就是词袋模型,准确率89.59%,加上2-gram和3-gram后准确率92.23%。N-Gram的哈希映射算法见utils_fasttext.py中注释------gram-------处。
N-Gram的词表我设的25W,相对于前面几个模型,这个模型稍慢一点,FastText被我搞成SlowText了。。?但是效果不错呀。。哈哈

有人私信问我这个N-Gram,我大体讲一下。对于N-Gram,我们设定一个词表,词表大小自己定,当然越大效果越好,但是你得结合实际情况,对于2-Gram,5000个字(字表大小)的两两组合有多少种你算算,3-Gram的组合有多少种,组合太多了,词表设大效果是好了,但是机器它受不了啊。
所以N-Gram词表大小的设定是要适中的,那么适中的词表就放不下所有N-Gram了,不同的N-Gram用哈希算法可能会映射到词表同一位置,这确实是个弊端,但是问题不大:5000个字不可能每两个字都两两组合出现,很多两个字是永远不会组成2-Gram的,所以真正出现的N-Gram不会特别多,映射到同一词表位置的N-Gram也就不多了。
N-Gram词表大小我定的25w,比较大了,比小词表训练慢了很多,效果也提升了。这么形容N-Gram词表大小对效果的影响吧:一分价钱1分货,十分价钱1.1分货。

6.DPCNN

1.模型输入: [batch_size, seq_len]

2.经过embedding层:加载预训练词向量或者随机初始化, 词向量维度为embed_size: [batch_size, seq_len, embed_size]

3.进行卷积,250个尺寸为3的卷积核,论文中称这层为region embedding。
[batch_size, 250, seq_len - 3 + 1]

4.接两层卷积(+relu),每层都是250个尺寸为3的卷积核,(等长卷积,先padding再卷积,保证卷积前后的序列长度不变)
[batch_size, 250, seq_len - 3 + 1]

5.接下来进行上图中小框中的操作。
I. 进行 大小为3,步长为2的最大池化,将序列长度压缩为原来的二分之一。(进行采样)
II. 接两层等长卷积(+relu),每层都是250个尺寸为3的卷积核。
III. I的结果加上II的结果。(残差连接)
重复以上操作,直至序列长度等于1。
[batch_size, 250, 1]

6.全连接+softmax归一化:
[batch_size, num_class]==>[batch_size, 1]

分析:
TextCNN的过程类似于提取N-Gram信息,而且只有一层,难以捕捉长距离特征。
反观DPCNN,可以看出来它的region embedding就是一个去掉池化层的TextCNN,再将卷积层叠加。

每层序列长度都减半(如上图所示),可以这么理解:相当于在N-Gram上再做N-Gram。越往后的层,每个位置融合的信息越多,最后一层提取的就是整个序列的语义信息。

7.Transformer
代码已上传

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

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

相关文章

JAVA利用方法实现四道题

目录 1.给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1 2.计算字符串最后一个单词的长度,单词以空格隔开。(注:字符串末尾不以空格为结尾) 3.如果在将所…

前端三件套(HTML + CSS + JS)

前言: 前端三件套,会用就行 毕竟在后面学习JavaWeb,以及在学习vue的时候也有帮助 前端三件套: HTML 定义网页的结构和内容。CSS 负责网页的样式和布局。JavaScript 添加动态交互和功能。 使用到的工具是Visual Studio Code 即…

Android -- [SelfView] 自定义圆盘指针时钟

Android – [SelfView] 自定义圆盘指针时钟 ps:简约圆盘指针时钟&#xff0c;颜色可调、自由搭配&#xff1b;支持阿拉伯数字、罗马数字刻度显示&#xff1b;效果图 使用&#xff1a; <!-- 自定义属性参考 attrs.xml 文件 --> <com.nepalese.harinetest.player.Virg…

边缘计算【智能+安全检测】系列教程--agx orin解决RTC时间问题

因为是离线运行&#xff0c;首要问题是时间不准确&#xff0c;就在主板上加装了纽扣电池&#xff0c;但是会有一系列问题&#xff0c;比如无法将RTC时间回写到系统时间&#xff0c;或者无法将系统时间写到RTC中等等一些列问题。为解决这些问题&#xff0c;一劳永逸的方式&#…

智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快

在当今科技飞速发展的时代&#xff0c;智能家居已经逐渐成为人们生活中不可或缺的一部分。从智能灯光控制到智能家电的联动&#xff0c;每一个细节都在为我们的生活带来便利和舒适。而在众多智能家居产品中&#xff0c;10G 雷达感应开关模块以其独特的优势&#xff0c;正逐渐成…

【源码+文档】基于SpringBoot+Vue旅游网站系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Python Matplotlib:基本图表绘制指南

Python Matplotlib&#xff1a;基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库&#xff0c;它以简单易用和功能丰富而闻名&#xff0c;适合各种场景的数据可视化需求。在数据分析和数据科学领域&#xff0c;Matplotlib 是我们展示数据的有力工具。本文将详细讲…

开源库 FloatingActionButton

开源库FloatingActionButton Github:https://github.com/Clans/FloatingActionButton 这个库是在前面这个库android-floating-action-button的基础上修改的&#xff0c;增加了一些更强大和实用的特性。 特性&#xff1a; Android 5.0 以上点击会有水波纹效果 可以选择自定义…

【Hello World 】

【Hello World 】! C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 几乎每一个程序员都是从Hello World!开始自己的程序人生&#xff0c;作为一个初学编程的小朋友&#xff0c;也需要先编程来输出Hello Wo…

从实验室到生活:超分子水凝胶湿电发电机的应用之路

大家好&#xff01;今天来了解一种新型的绿色湿电发电机&#xff08;MEG&#xff09;——《Green moisture-electric generator based on supramolecular hydrogel with tens of milliamp electricity toward practical applications》发表于《nature communications》&#xf…

零基础学习Java AI Spring AI

零基础学习Java AI Spring AI 随着人工智能&#xff08;AI&#xff09;技术的超速发展&#xff0c;越来越多的开发者开始将目光投向AI应用的开发。作为一名java程序员&#xff0c;如果不转型就会面临淘汰&#xff0c;程序员的世界就是这么的实现。 现在&#xff0c;市面上大多…

【周末推荐】Windows无缝连接iPhone

关注“ONE生产力”&#xff0c;获取更多精彩推荐&#xff01; 又到了周末推荐时间了&#xff0c;今天我们介绍一个Windows内置的功能&#xff0c;能够帮助大家将自己的电脑和iPhone连接在一起。 很多用Windows的小伙伴羡慕macOS可以和iPhone无缝连接&#xff0c;轻松阅读和回…

OV5640摄像模组从入门到精通(1)

本文内容参考&#xff1a; 《OmniVision OV5640 datasheet》 《OV5640 Camera Module — Software Application Notes》 OV5640学习_ov5640手册-CSDN博客 OV5640手册解读-CSDN博客 【FPGA】摄像头模块OV5640-CSDN博客 Camera开发-OV5640(MIPI)-CSDN博客 特此致谢&#x…

el-table type=“selection“换页多选数据丢失的解决办法

element里有一个 reserve-selection属性 设置以后就可以保留之前选中的选项&#xff0c;但还要设置row-key 代码如下&#xff1a; <el-tableref"mytable":data"HostRows"borderv-loading"loading"element-loading-text"正在加载中...&q…

CPU算法分析LiteAIServer视频智能分析平台视频诊断对比度检测:提升视频监控质量的关键技术

在现代安防、工业生产、智能家居等领域&#xff0c;视频监控系统扮演着至关重要的角色。然而&#xff0c;视频质量的好坏直接影响到监控效果&#xff0c;而对比度作为衡量图像质量的重要指标之一&#xff0c;对于视频内容的清晰度和细节表现至关重要。为了应对这一挑战&#xf…

双向 Type-C 转 DP 线:高清视频输出的灵活解决方案

在当今数字化生活中&#xff0c;人们对高效能和高清晰度的需求日益增长。双向 Type-C 转 DP 线应运而生&#xff0c;它以其灵活便捷的特点&#xff0c;为用户提供了一种高清视频输出的解决方案。本文将详细介绍双向 Type-C 转 DP 线的技术原理、适用设备、性能参数以及市场选择…

萤石设备视频接入平台EasyCVR私有化部署视频平台高速公路视频上云的高效解决方案

经济的迅猛发展带来了高速公路使用频率的激增&#xff0c;其封闭、立交和高速的特性变得更加显著。然而&#xff0c;传统的人工巡查方式已不足以应对当前高速公路的监控挑战&#xff0c;监控盲点和响应速度慢成为突出问题。比如&#xff0c;非法占用紧急车道的情况屡见不鲜&…

Spring Boot在信息学科平台建设中的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于保密信息学科平台系统的相关信息成为必…

Chrome与夸克的安全性对比

在当今数字化时代&#xff0c;浏览器的安全性对于用户来说至关重要。Chrome和夸克作为两款流行的浏览器&#xff0c;各有其特点和优势。本文将对这两款浏览器的安全性进行详细对比&#xff0c;帮助用户更好地了解它们之间的差异。&#xff08;本文由https://www.chromegw.com/的…

穿越数据迷宫

第一章 在未来的世界里&#xff0c;人类的生活已经被高度数字化。互联网不再是简单的信息交换平台&#xff0c;而是成为了一个庞大的虚拟世界——“数据迷宫”。在这个世界里&#xff0c;每个人都有一个独特的数字身份&#xff0c;他们的生活、工作、娱乐都离不开这个虚拟空间…