fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在文本分类任务中,fastText往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。
1. Fasttext模型架构
fastText之所以效果好,速度快,主要是用到了两种模型训练技巧:一种是利用了词内的n-gram信息;还有一种就是用到了层次化softmax回归。这类似于word2vec的两种训练技巧负采样和层序化softmax方法
1.1 fasttext的模型架构
1.2 层次softmax
1.3 负采样
2. 文本分类应用
2.1 分类问题概述
文本分类任务分为下面三种:
- 二分类:0,1分类,往往这两个分别是对立面,如一句评论是好还是坏
- 单标签多分类:文本被分入到多个类别中,且每个文本只归属一个类别
- 多标签多分类:文本被分人到多个类别中, 但每条文本可以属于多个类别(即被打上多个标签),比如: 输入一段描述, 判断可能是和哪些兴趣爱好有关, 一段描述中可能即讨论了美食, 又太讨论了游戏爱好.
fasttext文本分类任务大致流程:
- 第一步: 获取数据(预处理)
- 第二步: 训练集与验证集的划分
- 第三步: 训练模型
- 第四步: 使用模型进行预测并评估
- 第五步: 模型调优
- 第六步: 模型保存与重加载
本节,大样将以实际的数据来讲解fasttext文本分类的用法
数据讲解:class中存放为10分类中分类名,0~10分别对应十个类别名;dev、test、train_1分别为验证集、测试集和数据集原始样本;stopwords为停用词,用于将样本中出现在停用词中的词去除
2.1 数据预处理
使用 fastText 工具解决文本分类任务时,存放数据集的文本文件必须满足以下两个条件:
- 文本文件中的每一行对应一个样本;
- 样本的类别标签以 __label__name 为前缀放在文档的最前面;
- 样本标签和文档间以一个空格分隔,中文样本分词后需要以空格分隔
- 一条样本若有多个标签,也需要使用一个空格分隔开
2.1.1 数据预处理
对于现有的数据,我们需要将其进行预处理,以变成fasttext模型能够用来训练的数据格式。对于训练、测试及验证集中文本,为下面样式
我们需要将上面处理成下面格式:
- 对于中文文本分词我们可以使用jieba工具来实现。它同样可以把标点符号和词进行拆分。
- 对于英文文本,单词间天然存在空格,不需要额外分隔。但是会存在许多标点符号与单词相连以及大小写不统一,这些因素对我们最终的分类目标没有益处, 反是增加了模型提取分类规律的难度, 可以将其去除或转化
- 对于样本中的数据清洗工作,可以通过停用词或者正则表达式来实现。
案例数据处理代码实现
- pandas读取数据
- 将类别id映射为类别名并在前面加上__label__前缀
- 将文本用jieba进行分词,然后用停用词过滤,再用空格进行拼接
- 标签列和文本列进行互换并遍历保存为文本文件
2.1.2 数据集拆分
对于训练集和测试集在一个文本文件的情况,需要按照4:1的比例拆分训练集测试集。这里可以使用shell命令快捷拆分
2.2 模型训练、预测及评估
2.2.1 模型训练及评估
在模型训练方法train_supervised中,除了送入训练集数据,还可以甚至很多超参数来优化模型。
2.2.2 模型加载及预测
模型预测中,参数k表示最有可能类别个数,为-1则输出所有类别及其概率值。
2.2.3 模型相关属性、方法
2.3 模型优化(调参)
2.3.1 超参数调优
fasttext.train_supervised方法除了送入训练数据之外,还有很多超参数可以设置,以用来优化模型。
其参数列表有:
在真实的生产环境下, 对于fasttext模型一般不会采用费时费力的人工调参, 而都是用自动化最优参数搜索的模式。我们可以通过autotuneValidationFile和autotuneDuration来实现自动化调优。
2.3.2 多标签多分类问题损失函数选择
在2.3.1节中我们讲述了模型训练当中可以调节哪些超参数用以优化模型以及自动化搜索方式获取最优参数组合。在众多参数中,参数loss用于指定损失计算方式,具体有softmax、hs(层次softmax)以及ova(one vs all)。
在实际生产中,针对多标签多分类问题, 使用'softmax'或者'hs'有时并不是最佳选择, 因为我们最终得到的应该是多个标签, 而softmax却只能最大化一个标签。所以我们往往会选择为每个标签使用独立的二分类器作为输出层结构,对应的损失计算方式为'ova'表示one vs all。这种输出层的改变意味着我们在统一语料下同时训练多个二分类模型,同时,对于二分类模型来讲, lr不宜过大
3. 词向量训练应用
3.1 词向量训练概述
用向量表示文本中的词汇(或字符)是现代机器学习中最流行的做法, 这些向量能够很好的捕捉语言之间的关系, 从而提升基于词向量的各种NLP任务的效果。
通过fasttext工具训练词向量的过程可分为下列步骤:
- 获取词文本数据
- 训练词向量
- 模型超参数设定
- 模型效果评估
- 模型保存和重加载
3.2 词向量训练实现
数据集使用:英语维基百科的部分网页信息