Task 4 基于深度学习的文本分类1_基于tf的文本分类-程序员宅基地

技术标签: NLP学习  

Task 4 基于深度学习的文本分类1

与传统机器学习不同,深度学习即提供特征提取功能,也可以完成分类的功能。

4.1 学习目标

1.学习FastText的使用和基础原理
2.学会使用验证集进行调参

4.2 现有文本表示方法的缺陷

上一章节介绍了几种文本表示方法:
1.One-hot
2.Bag of Words
3.N-gram
4.TF-IDF
上述方法或多或少都存在一定的问题:转换得到的向量维度很高,需要较长的训练时间;没有考虑单词与单词之间的关系,只是进行了统计。
与上述方法不同,深度学习也可以用于文本表示,还可以将其映射到一个低维空间,比如:FastText,Word2Vec和Bert。本章先介绍FastText。

4.2.1 FastText

fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
FastText是一个三层的神经网络,包含输入层,隐含层,输出层:
在这里插入图片描述
使用keras可以实现FastText网络结构:
在这里插入图片描述
FastText在文本分类上相较于TF-IDF的优点:
1.FastText使用单词的Embedding叠加获得的文档向量,将相似的句子分为一类。
2.FastText学习到的Embedding空间维度较低,可以快速进行训练。
关于Embedding的含义:
Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2)。那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。
通俗的翻译可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量。相似词映射到相似方向。

4.2.2 基于FastText的文本分类

FastText可以快速的在CPU上进行训练,最好的实践方法就是官方开源的 版本.
安装FastText可以使用pip install fasttext直接安装,也可以在 这里.找到适合自己的版本下载后安装。
分类模型:

import pandas as pd
from sklearn.metrics import f1_score

#转换为FastText需要的格式
train_df = pd.read_csv('data/train_set.csv', sep='\t', nrows=15000)
train_df['label_ft'] = '__label__' + train_df['label'].astype(str)
train_df[['text', 'label_ft']].iloc[:-5000].to_csv('train.csv', index=None, header=None, sep='\t')

import fasttext
model = fasttext.train_supervised('train.csv', lr=1, wordNgrams=2, verbose=2, minCount=1, epoch=25, loss="hs")
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))

结果:0.8235765814370285
这里使用的数据量较小,增加训练集数量后,精度也会相应增加。在5W条训练样本时,验证集得到可以到0.89~0.90左右。

4.2.3 如何使用验证集调参

训练时,模型的参数在一定程度上会影响模型的精度,该如何去选择这些参数呢?方法如下:
1.通过阅读文档,弄清楚参数的大致含义,了解哪些参数会增加模型的复杂度。
2.通过在验证集上进行模型精度验证,判断模型是否存在过拟合或者欠拟合的问题;
在这里插入图片描述
可以使用10折交叉验证,每折使用9/10的数据进行训练,剩下1/10作为验证集检验模型的效果。需要注意每折的划分必须保证标签的分与整个数据集的分布一致。

label2id = {
    }
for i in range(total):
	label = str(all_labels[i])
	if label not in label2id:
		label2id[label] = [i]
	else:
		label2id[label].append(i)

通过10折划分,一共得到10份分布一致的数据,索引分别为0到9,每次通过将一份数据作为验证集,剩余数据作为训练集,获得所有数据的10种分割。一般来说,可以使用最后一份,即索引为9的一份作为验证集,索引0-8的作为训练集,然后基于验证集的结果调整超参数,使得模型性能更优。

4.3 小结

本章介绍了FastText的原理,并且创建了基础的分类模型。然后介绍了10折交叉验证划分数据集。

4.4 作业

1.阅读FastText的参数,尝试修改参数,得到更好的分数。
参数含义:
train_supervised parameters :
input # training file path (required)
lr # learning rate [0.1]
dim # size of word vectors [100]
ws # size of the context window [5]
epoch # number of epochs [5]
minCount # minimal number of word occurences [1]
minCountLabel # minimal number of label occurences [1]
minn # min length of char ngram [0]
maxn # max length of char ngram [0]
neg # number of negatives sampled [5]
wordNgrams # max length of word ngram [1]
loss # loss function {ns, hs, softmax, ova} [softmax]
bucket # number of buckets [2000000]
thread # number of threads [number of cpus]
lrUpdateRate # change the rate of updates for the learning rate [100]
t # sampling threshold [0.0001]
label # label prefix [‘label’]
verbose # verbose [2]

2.基于验证集的结果调整超参数,使得模型性能更优。
调参可以使用贝叶斯优化方法:

import pandas as pd
from sklearn.metrics import f1_score
from bayes_opt import BayesianOptimization
import fasttext# 导入fasetext


def rf_cv(lr, wordNgrams,epoch,dim):

    model = fasttext.train_supervised('train.csv', lr=lr, wordNgrams=int(wordNgrams), 
                                  verbose=2, minCount=1, epoch=int(epoch),dim=int(dim))#训练模型

    val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]# 预测
    return f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro')#输出f1值

rf_bo = BayesianOptimization(
    rf_cv,
    {
    
    'lr':(0.001,2),
    'wordNgrams': (2, 6),
    'epoch': (8, 30),
    'dim':(60,600)
    }
)

rf_bo.maximize()

第一个参数是我们的优化目标函数,第二个参数是我们所需要输入的超参数名称,以及其范围。

|   iter    |  target   |    dim    |   epoch   |    lr     | wordNg... |
-------------------------------------------------------------------------
|  1        |  0.8389   |  103.0    |  21.61    |  0.4715   |  3.989    |
|  2        |  0.7764   |  123.4    |  19.76    |  0.2017   |  2.315    |
|  3        |  0.8693   |  356.4    |  27.2     |  1.462    |  5.929    |
|  4        |  0.8735   |  209.3    |  20.82    |  1.998    |  3.542    |
|  5        |  0.8723   |  290.8    |  26.28    |  0.457    |  2.828    |
|  6        |  0.8711   |  207.9    |  20.11    |  1.796    |  4.146    |
|  7        |  0.8745   |  239.3    |  23.68    |  1.377    |  3.204    |
|  8        |  0.853    |  323.0    |  12.71    |  0.9987   |  3.346    |
|  9        |  0.09211  |  266.6    |  8.0      |  0.001    |  6.0      |
|  10       |  0.1185   |  310.9    |  30.0     |  0.001    |  6.0      |
|  11       |  0.8675   |  226.1    |  15.05    |  1.635    |  5.776    |
|  12       |  0.8617   |  341.9    |  14.21    |  0.6688   |  2.609    |
|  13       |  0.8136   |  360.6    |  9.077    |  2.0      |  6.0      |
|  14       |  0.06795  |  225.3    |  30.0     |  0.001    |  2.0      |
|  15       |  0.8678   |  237.3    |  13.04    |  2.0      |  5.957    |
|  16       |  0.8487   |  214.9    |  8.833    |  2.0      |  4.95     |
|  17       |  0.8682   |  342.7    |  27.58    |  2.0      |  6.0      |
|  18       |  0.02293  |  371.2    |  23.2     |  0.01911  |  3.282    |
|  19       |  0.87     |  351.2    |  19.17    |  1.633    |  5.009    |
|  20       |  0.4848   |  109.0    |  8.254    |  0.2686   |  3.916    |
|  21       |  0.8097   |  332.8    |  8.0      |  2.0      |  6.0      |
|  22       |  0.8366   |  91.3     |  29.95    |  0.4541   |  4.21     |
|  23       |  0.8707   |  250.7    |  30.0     |  2.0      |  6.0      |
|  24       |  0.8696   |  84.88    |  16.14    |  2.0      |  6.0      |
|  25       |  0.02293  |  74.65    |  26.0     |  0.01381  |  3.487    |
|  26       |  0.8234   |  91.36    |  8.716    |  0.6761   |  2.719    |
|  27       |  0.874    |  279.2    |  29.72    |  0.8131   |  3.492    |
|  28       |  0.8754   |  196.6    |  8.0      |  2.0      |  2.0      |
|  29       |  0.02293  |  188.4    |  19.42    |  0.007377 |  2.679    |
|  30       |  0.8732   |  248.9    |  19.68    |  1.083    |  2.146    |
=========================================================================

最优结果: 0.8754
最优参数参数dim = 196.6,epoch = 8.0,lr = 2.0,wordNgram = 2.0

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33253721/article/details/107609277

智能推荐

JDK源码解读由浅入深(一) 从源码分析equals和==_jdk源码 字符串比较为什么用==-程序员宅基地

文章浏览阅读276次。好久没写代码,也不知为何,上一趟csdn,难的看不懂,简单的不屑看,眼高手低说的就是我了。。也不知道从什么地方提高自己,对我来说,什么东西似乎都能说上一点,但是再往后,知识储备就不足了,再继续写下去也怕误人子弟。也许有生之年,我能补完自己之前埋下的坑呢?。。这次准备长期写下去的就是源码解读,有一说一,我不喜欢像某些csdn的5年,10年的账号一样,一天到晚发一些基础知识,啃老本,我甚至怀疑..._jdk源码 字符串比较为什么用==

Gstreamer函数使用总结_gst_parse_launch-程序员宅基地

文章浏览阅读2.6k次,点赞5次,收藏16次。1、GSteamer的基本API的使用2、创建元件并且链接起来3、添加衬垫,添加回调,手动链接衬垫4、打印gstreamer的版本信息5、gstreamer封装的argparse6、创建gst元件对象7、查看插件8、链接元件9、箱柜(箱柜本身是一个元件,但是它内部还可以是一串链接起来的元件)10、bus总线..._gst_parse_launch

Linux Qt deb包制作_dh-make教程-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏14次。前言Linux系统的软件一般有.deb和.rpm格式的安装包,即Linux系统用的是"Debian Packager"软件包管理器,就可以安装.deb的安装包,下面说的就是.deb的制作。如需了解.rpm ,点击"Red-Hat Package Manager"红帽软件包管理器。制作工具制作前,系统环境中需要安装有dh-make 、devscripts,可用下面命令安装:sudo apt-get install dh-make devscripts制作deb包这里制作一个Qt开发软件的deb包_dh-make教程

VS2017内利用QtTools配置Qt5.12.4_qt tools-程序员宅基地

文章浏览阅读5.4k次。VS2017内利用QtTools配置Qt5.12.4_qt tools

error: implicit declaration of function ‘traverse‘ is invalid in C99 [-Werror,-Wimplicit-function-de_declaration of function 'assert' is invalid in c99-程序员宅基地

文章浏览阅读548次。error: implicit declaration of function ‘traverse’ is invalid in C99 [-Werror,-Wimplicit-function-declaration]C报错原因:helper function写在了调用函数的后面,而C99语法要求helper function声明在调用函数之前。_declaration of function 'assert' is invalid in c99 [-werror,-wimplicit-funct

Connor学Android - RootView、DecorView、MeasureSpec_android rootview-程序员宅基地

文章浏览阅读715次。Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/pIpx0,话不多说我们马上开始!_android rootview

随便推点

网页JS弹出广告代码,头部,右下角,网页中漂浮,对联广告代码等大全-程序员宅基地

文章浏览阅读238次。01.借鉴:网页JS弹出广告代码,头部,右下角,网页中漂浮,对联广告代码等大全 02.网页头部弹出广告: 03.<!--首页头部广告--> 04.<script src="http://www.ce.cn/inc1/top_ad.js" type="text/javascript" language="javascript"></script&g..._春节 网站弹出banner js代码

hibernate mysql 外键查询null_[解决方法]Hibernate查询部分字段(含外键)出错,报空指针异常...-程序员宅基地

文章浏览阅读138次。假设当前表结构如下:food表字段有foodid,name,外键businessid,外键typebusiness表字段有,name,外键typetype表字段有id,name,foodidHibernate生成的对应POJO分别是Food,Business,Type需要查询food表部分字段,如name和外键businessid则可在Food类中添加只有相应成员变量的构造方法,Food(Stri..._hibernate 外键查询为null

装NOILinux的奇妙经历-程序员宅基地

文章浏览阅读78次。啊啊啊啊啊啊啊啊啊啊终于成功了.从昨天下午3:30折腾到现在呼.光是系统就装了3遍.第一遍的时候先去把noilinux刻在我的U盘上,然后用zsx的U盘来备份.分盘的时候我发现莫名多了一个63GB的盘,就拿来挂载根目录了.不知情地装完以后,拔了zsx的U盘准备还给他,结果系统崩溃了.一脸懵逼地搞鼓了半天,发现他的U盘里全是Linux的系统文件.这才发现是把他的U盘当做硬盘了.我们俩..._noilinux 安装慢

Mac版 Photoshop 2021---PS2021_photoshop 2021mac-程序员宅基地

文章浏览阅读778次,点赞8次,收藏7次。Adobe Photoshop 2021是一款强大的图像处理软件,它可以帮助用户进行各种图像编辑、修饰和合成工作。这款软件拥有先进的图像处理技术,支持多种图像格式,可以轻松实现各种复杂的图像处理任务。它还提供了丰富的滤镜和工具,使用户可以自由地探索创意,制作出令人惊叹的作品。通过不断更新和改进,Photoshop 2021将继续引领图像处理领域的潮流,为用户提供更高效、更智能的工具和服务。以上就是Photoshop 2021的一些特色功能,这些功能可以帮助用户更快速、更高效地完成图像处理工作。_photoshop 2021mac

python爬虫之urllib库学习_直接用urllib.request.urlopen函数可能被反爬虫禁止访问,仍然使用urllib时可-程序员宅基地

文章浏览阅读564次。通过python实现对网络数据的爬取时,通常使用到urllib库,在urllib库中主要有request和parse两个模块,urlopenurlopen()函数用于实现对目标url的访问,例如我们对百度网址进行访问,就可以通过下面的例子re = request.urlopen("http://www.baidu.com")print(re.read())上面代码就会将百度返回的消息打..._直接用urllib.request.urlopen函数可能被反爬虫禁止访问,仍然使用urllib时可以如

A Novel Cascade Binary Tagging Framework for Relational Triple Extraction-程序员宅基地

文章浏览阅读688次。本文提出了关系三元组重叠的问题(一个sentence中有多个三元组,其中三元组中有的实体是同一个)。本文将其建模为级联二级制框架,从原来的f(s,o)→rf(s,o) \rightarrow rf(s,o)→r从实体对找关系的过程,变成fr(s)→of_r(s) \rightarrow ofr​(s)→o给定头实体,针对头实体可能的关系,预测尾实体。即头实体不一定是subject,与multi-QA思想相似。给定标记好的句子xjx_jxj​,和xjx_jxj​中潜在的重叠实体三元组集Tj={(s,r,o_a novel cascade binary tagging framework for relational triple extraction