Datawhale零基础入门NLP赛事-04基于深度学习的文本分类1FastText
04基于深度学习的文本分类1-FastText
与传统机器学习不同,深度学习既提供特征提取功能,也可以完成分类的功能。
学习目标
- 学习FastText的使用和基础原理
- 学会使用验证集进行调参
文本表示方法 Part2
现有文本表示方法的缺陷
One-hot、Bag of Words、N-gram、TF-IDF等文本表示方法都或多或少存在一定的问题:
- 转换得到的向量维度很高,需要较长的训练实践;
- 没有考虑单词与单词之间的关系,只是进行了统计。
深度学习也可以用于文本表示,还可以将其映射到一个低维空间。其中比较典型的例子有:FastText、Word2Vec和Bert。
FastText
FastText是一种典型的深度学习词向量的表示方法,它非常简单通过Embedding层将单词映射到稠密空间,然后将句子中所有的单词在Embedding空间中进行平均,进而完成分类操作。
FastText是一个三层的神经网络,输入层、隐含层和输出层。
FastText在文本分类任务上,是优于TF-IDF的:
- FastText用单词的Embedding叠加获得的文档向量,将相似的句子分为一类
- FastText学习到的Embedding空间维度比较低,可以快速进行训练
基于FastText的文本分类
官方开源的版本: https://github.com/facebookresearch/fastText/tree/master/python
安装FastText
- pip安装
pip install fasttext
- 源码安装
git clone https://github.com/facebookresearch/fastText.git cd fastText sudo pip install
FastText需要的数据格式
基于FastText进行文本分类
import pandas as pd from sklearn.metrics import f1_score # 转换为FastText需要的格式 train_df = pd.read_csv('./data/train_set/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.0, 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'))
FastText中使用了两种N-gram
- 字符级别的N-gram,或称Subword N-gram feature、Character N-gram
- 传统意义上的N-gram,或称Word N-gram feature
Fasttext通过编码层面,处理UTF-8编码来实现字符级别N-gram的划分(中文)。
train_supervised的参数中,minn和maxn用于分类器训练时的Character Embedding训练;wordNgrams用于Word N-gram feature,默认为1,即不加入N-gram feature。
如何使用验证集调参
在使用TF-IDF和FastText中,有一些模型的参数需要选择,这些参数会在一定程度上影响模型的精度,那么如何选择这些参数呢?
- 通过阅读文档,要弄清楚这些参数的大致含义,那些参数会增加模型的复杂度
- 通过在验证集上进行验证模型精度,找到模型在是否过拟合还是欠拟合
这里我们使用10折交叉验证,每折使用9/10的数据进行训练,剩余1/10作为验证集检验模型的效果。这里需要注意每折的划分必须保证标签的分布与整个数据集的分布一致。
本章作业
1. 阅读FastText的文档,尝试修改参数,得到更好的分数
model = fasttext.train_supervised('train.csv', lr=1.0, wordNgrams=2, verbose=2, minCount=1, epoch=25, loss="hs") """ 训练一个监督模型, 返回一个模型对象 @param input: 训练数据文件路径 @param lr: 学习率 @param wordNgrams: n-gram个数 @param verbose: 默认为2 @param epoch: 次数 @param minCount: 词频阈值, 小于该值在初始化时会过滤掉 @param loss: 损失函数类型, softmax, ns: 负采样, hs: 分层softmax @param lrUpdateRate: 学习率更新 @return model object """ pass
epoch改为50
wordNgrams改为3
loss改为"ova",one-vs-all loss
2. 基于验证集的结果调整超参数,使得模型性能更优
基于FastText自动调参功能
train_df['label_ft'] = '__label__' + train_df['label'].astype(str) train_df[['text','label_ft']].iloc[:9000].to_csv('train1.csv', index=None, header=None, sep='\t') train_df[['text','label_ft']].iloc[9000:10000].to_csv('valid.csv', index=None, header=None, sep='\t') model = fasttext.train_supervised(input='train1.csv', autotuneValidationFile='valid.csv')
参考资料:
比赛地址
Datawhale零基础入门NLP赛事 - Task4 基于深度学习的文本分类1-fastText
Bag of Tricks for Efficient Text Classification
win10下FastText安装
文本分类模型第一弹:关于Fasttext,看这一篇就够了
- 【学习笔记】Datawhale零基础入门NLP赛事--天池新闻文本分类--Day2数据理解与数据分析
- [不知pandas为何物的纯金小白]Datawhale零基础入门NLP赛事--天池新闻文本分类--Day1理解赛题
- Datawhale NLP入门:Task5 基于深度学习的文本分类2
- DataWhale 零基础入门NLP赛事-新闻文本分类 TASK2 数据读取与数据分析
- 原创 零基础入门NLP(天池学习赛-Task4 基于深度学习的文本分类1
- Datawhale零基础入门NLP——新闻文本分类(一)熟悉赛题(天池比赛)
- 零基础入门NLP(天池学习赛)Task3 基于机器学习的文本分类
- 自然语言处理入门实战2:基于深度学习的文本分类
- Datawhale零基础入门NLP赛事Task 02: 数据读取与数据分析
- Datawhale 零基础入门CV赛事-Task2 数据读取与数据扩增
- Datawhale 零基础入门CV赛事-Task3 字符识别模型
- 【DataWhale学习记录13-02】零基础入门CV赛事-Task04-模型训练与验证
- NLP实践六:Fasttext实现文本分类
- 基于LSTM搭建一个文本情感分类的深度学习模型:准确率往往有95%以上
- Datawhale大作业_基于Bert实现文本分类
- Datawhale 零基础入门CV赛事-Task2 数据读取与数据扩增
- 【DataWhale学习记录13-02】零基础入门CV赛事-Task03-字符识别模型
- 【DataWhale学习记录13-02】零基础入门CV赛事-Task02-数据读取与数据扩增
- 自然语言处理入门实战1:基于机器学习的文本分类
- fastText、TextCNN、TextRNN等,这里有一套NLP文本分类深度学习方法库供你选择