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,看这一篇就够了