文本分类模型第一弹:关于Fasttext,看这一篇就够了

编程入门 行业动态 更新时间:2024-10-08 20:39:23

文本分类模型第一弹:关于Fasttext,看<a href=https://www.elefans.com/category/jswz/34/1768373.html style=这一篇就够了"/>

文本分类模型第一弹:关于Fasttext,看这一篇就够了

一、前言

最近手头上接到一个文本分类的任务,当前使用的Baseline是Fasttext模型。由于之前对Fasttext了解不是很多,所以在开始之初决定对Fasttext进行一番调研。但网上关于Fasttext的博客和提出Fasttext的两篇论文在一些细节上都写的不是很清楚,对其性能也缺乏实验数据的支撑说明,于是就有了今天这篇文章。

关于Fasttext,看这一篇就够了。

这里是文本分类系列:

文本分类模型第一弹:关于Fasttext,看这一篇就够了

文本分类模型第二弹:HAN(Hierarchy Attention Network)

文本分类第模型三弹:BoW(Bag of Words) + TF-IDF + LightGBM​​​​​​​


二、相关论文

废话不多说先给出 Facebook AI Research 提出 Fasttext 模型的两篇论文:

(1)Enriching Word Vectors with Subword Information

(2)Bag of Tricks for Efficient Text Classification

第一篇论文主要讲Word Vector,提出了字符级别向量的概念(Character level features for NLP),提出了类似 Word2Vec 中 Skip-gram 与 CBOW 的模型来训练字符向量。其中也是依靠条件概率公式表示预测词(Character)的出现概率,再通过最大似然估计将概率连乘转化为累加形式,最后使用SGD在最大化概率的同时,更新学习参数。

第二篇论文主要讲Text Classification,论文对CBOW模型做了一点改变,将模型的输出改为预测的Label而不是预测的单词,从而变成了一个分类模型。再输出层的优化方面,也跟CBOW的做法如出一辙,使用了多层Softmax(Hierarchical Softmax) 和 负采样(Negative Sampling)的方法。

其实就是这两篇论文分别提出了现在Fastext的主要两个功能的:训练字符向量和文本分类。

拿API来说也就是:Fasttext.train_unsupervised() 和 Fasttext.train_supervised()。


三、模型结构

这次用Fasttext主要是来做文本分类,所以Character Embedding的部分说的比较少,主要还是来讲Text Classification的部分。

整个Fasttext的模型结构图如下所示:

图3.1 Fasttext模型结构图

此图截取自论文Bag of Tricks for Efficient Text Classification,其实模型非常的简单,三层结构组成,输入层,隐藏层,输出层。

输入层的输入为文本中的单词和N-gram Feature的Embedding。其操作和Word2Vec的一样,实际上是使用一个one-hot向量乘以Embedding存放矩阵得到每个词的Embedding的过程,这里就不再赘述。

隐藏层,这里叫做Hidden Layer,在这一层进行的操作是将输出层输入的Embedding Vector进行求平均。注意!只是进行了求平均,并没有进行任何形如的非线性变换过程!这是一部分博客里经常出现错误的地方。也正是由于这个原因,在Word2Vec的模型中也把这一层称之为投影层(Project Layer)而并不是隐藏层。

输出层,输出文本的类别。与Word2Vec一样,输出层有三种方法来输出最终的label,分别是:Softmax,Hierarchical Softmax和Negative Sampling。其中,Softmax通过Hidden Layer求平均得到的Vector,乘以反变换矩阵,得到长度等于分类数的Vector,再使用Softmax得到概率最高的一类为最终分类结果。而后两种方法则是通过Huffman Tree和Negative Sampling两个trick来节省时间复杂度。

最后模型使用的Loss Function为Binary Logistic,二分类时其实和Cross-Entropy是一个东西。这里强行把Softmax的输出看作了每一类别的概率值。Optimizer使用SGD。


四、两种N-gram和Fasttext里的trick

这一章来说说Fasttext中使用到的两种N-gram。这两种N-gram使用在哪里,在具体的工程中如何实现,中文怎么算字符级别的Embedding,以及使用两种N-gram后有什么收益和好处,这是论文中没有仔细交代的地方,也是很多Fasttext的文章中没有介绍的地方,这里通过Fasttext的源码来讲讲这两种N-gram。

1. 两种N-gram

首先第一种N-gram,是字符级别的N-gram,论文 Enriching Word Vectors with Subword Information 中将其称为Subword n-gram feature。举一个例子,单词“universe”如果按照 bi-gram进行划分可分为<u,un,ni,iv,ve,er,rs,se>以此类推。

另一种N-gram是我们传统意义上的N-gram,也就是图3.1里提到的N-gram feature。

为了更好的区分两者,我们在这里把它们称为Character n-gram和Word n-gram。

这两种N-gram同时存在于Fasttext的训练中,其中第一种用于Character Embedding的计算(如果不加载预训练Embedding的话,分类任务也会训练一套Embedding)。第二种用于Classification的输入层。

2.两种N-gram的实现方式

Fasttext中的两种N-gram究竟如何来实现,我们来通过源码分析。

首先看Character n-gram。该段源码位于 src/dictionary 中。

// 该函数仅被 Dictionary::getSubword(...)调用
// Dictionary::getSubword(...)被用于训练词向量模型(skipgram和cbow)
// 、输出词向量(print-word-vectors和print-sentence-vectors)和计算词相似性(nn和analogies)
// !!!也就是说这个函数计算的ngram与分类不相关!!!
void Dictionary::computeSubwords(const std::string& word,std::vector<int32_t>& ngrams) const {for (size_t i = 0; i < word.size(); i++) {std::string ngram;if ((word[i] & 0xC0) == 0x80) continue;for (size_t j = i, n = 1; j < word.size() && n <= args_->maxn; n++) {ngram.push_back(word[j++]);while (j < word.size() && (word[j] & 0xC0) == 0x80) { ngram.push_back(word[j++]);}// 处理ngramif (n >= args_->minn && !(n == 1 && (i == 0 || j == word.size()))) {int32_t h = hash(ngram) % args_->bucket;ngrams.push_back(nwords_ + h); // 这个ngram用于检索subword}}}
}

从以上代码中可以看出,Fasttext是通过编码层面,处理UTF-8编码来实现字符级别N-gram的划分,这也回答了中文如何做Character Embedding的问题。

在Character Embedding的训练中,API默认了Character n-gram的长度,在模型训练之前会提前计算出所有Character n-gram,以节省模型训练时间。

接下来是Word n-gram,Word n-gram的实现方法就要简单很多了,以下的源码位于src/dictionary中,是Word n-gram的hash map过程。

int32_t Dictionary::getLine(std::istream& in,std::vector<int32_t>& words,std::vector<int32_t>& labels,std::minstd_rand& rng) const {std::vector<int32_t> word_hashes;int32_t ntokens = getLine(in, words, word_hashes, labels, rng); //计算词及词的hash// !!!关键之处,分类问题与词向量的分界!!!if (args_->model == model_name::sup ) {  addWordNgrams(words, word_hashes, args_->wordNgrams);}return ntokens;
}void Dictionary::addWordNgrams(std::vector<int32_t>& line,const std::vector<int32_t>& hashes,int32_t n) const {if (pruneidx_size_ == 0) return;for (int32_t i = 0; i < hashes.size(); i++) {uint64_t h = hashes[i];// 这里的 "n" 就是wordNgrams了for (int32_t j = i + 1; j < hashes.size() && j < i + n; j++) {//这个hash的计算过程和Dictionary::hash()不同h = h * 116049371 + hashes[j];  int64_t id = h % args_->bucket;if (pruneidx_size_ > 0) {if (pruneidx_.count(id)) {id = pruneidx_.at(id);} else {continue;}}line.push_back(nwords_ + id);}}
}

接下来的源码位于src/fasttext。

void FastText::train(std::shared_ptr<Args> args) {args_ = args;dict_ = std::make_shared<Dictionary>(args_);std::ifstream ifs(args_->input);if (!ifs.is_open()) {std::cerr << "Input file cannot be opened!" << std::endl;exit(EXIT_FAILURE);}// 根据输入文件初始化词典dict_->readFromFile(ifs);ifs.close();// 初始化输入层, 对于普通 word2vec,输入层就是一个词向量的查找表,// 所以它的大小为 nwords 行,dim 列(dim 为词向量的长度),但是 fastText 用了// word n-gram 作为输入,所以输入矩阵的大小为 (nwords + ngram 种类) * dim// 代码中,所有 word n-gram 都被 hash 到固定数目的 bucket 中,所以输入矩阵的大小为// (nwords + bucket 个数) * diminput_ = std::make_shared<Matrix>(dict_->nwords()+args_->bucket, args_->dim);// 初始化输出层,输出层无论是用负采样,层次 softmax,还是普通 softmax,// 对于每种可能的输出,都有一个 dim 维的参数向量与之对应// 当 args_->model == model_name::sup 时,训练分类器,// 所以输出的种类是标签总数 dict_->nlabels()if (args_->model == model_name::sup) {output_ = std::make_shared<Matrix>(dict_->nlabels(), args_->dim);} else {// 否则训练的是词向量,输出种类就是词的种类 dict_->nwords()output_ = std::make_shared<Matrix>(dict_->nwords(), args_->dim);}

第一段源码中是将Word n-gram hash到bucket中的过程,而第二段源码中,输入矩阵大小为(nwords + ngram种类) * dim。表明图3.1中的模型中,输入为所有文本单词与文本的Word n-gram。

在有监督文本分类器的训练API中,我们也看到了这三个参数。前两个用于分类器训练时的Character Embedding训练。API中默认wordNgrams为1,其实就是默认不加入N-gram feature。

3.两种N-gram带来的提升

Character n-gram首先解决了未登录词的问题,其次对于英语中词根和词缀相同的词,使用Character n-gram可以很好的获取它们之间的相似性。最后一点是论文中提到的,Character n-gram可以更好的来表示土耳其语、芬兰语等形态丰富的语言,对于语料中很少出现的单词也能够有很好的表示。

Word n-gram特征的加入,提升了Fasttext获取词序信息的能力,因此在一面对些复杂的语言表述时,也能够更好的获取文本的语义信息。经过实验也证明,当参数wordNgrams设置>=2时,分类准确率会有一定的提升。

4.Fasttext中的trick

Fasttext使用了很多trick来提升模型的性能,而这些trick在我们日常的Coding中值得我们去学习。

首先就是输出层使用的Hierarchical Softmax和Negative Sampling。Hierarchical Softmax使用噪音对比功率(NCE)中的理论,通过将一个多分类转化为多个二分类来实现计算复杂度的降低。为了实现同样的目的,Negative Sampling采用了加权采样的方法来抽样负样本而不是每次计算所有词出现的概率。

第二点是在存储Character n-gram和Word n-gram时,使用hash map的方式将对应的n-gram信息储存在bucket中,节省了空间复杂度,同时由于hash map寻址方式为直接寻址,也降低了查询的时间复杂度。

第三,Fastext在进行训练时,提前计算出Character n-gram和Word n-gram,在训练时直接查询调取,也节省了时间复杂度。


五、代码

Fasttext为Python封装好了训练字符向量和文本分类的API接口,调用起来十分简单,官网也有详细的API使用指南。写的十分详细,大家可以去参考~这里是部分训练和预测的代码。

def train_model(input_data, output_dir, epoch):classifier_model = fasttext.train_supervised(input=input_data, label='__label__', wordNgrams=3, **parms)classifier_model.save_model(output_dir)def predict(input_data, clf_model):classifier_model = fasttext.load_model(clf_model)prd_label = classifier_model.test_label(input_data)print(prd_label)prd_label = classifier_model.test(input_data)acc = prd_label[1]return acc

训练文本需要按照以下的格式进行预处理:“__label__” + label + "\t" + content + "\n"

__label__0	本报讯 记者 上周四 东风 日产 新轩 逸 在 青岛 上市 东风 日产 副总经理 任勇 表示 该车 将 为 万辆 销售 目标 的 实现 提供 强大 的 支撑 与此同时 针对 上半年 百城 翻番 未达标 的 质疑 任勇 表示 百城 翻番 意 为 同比 增长 下半年 新增 的 家 二级 网点 将 为 百城 翻番 目标 的 实现 提供 动力 问 上半年 百城 翻番 计划 成果 如何 答 针__label__1	本报讯 记者 上周四 东风 日产 新轩 逸 在 青岛 上市 东风 日产 副总经理 任勇 表示 该车 将 为 万辆 销售 目标 的 实现 提供 强大 的 支撑 与此同时 针对 上半年 百城 翻番 未达标 的 质疑 任勇 表示 百城 翻番 意 为 同比 增长 下半年 新增 的 家 二级 网点 将 为 百城 翻番 目标 的 实现 提供 动力 问 上半年 百城 翻番 计划 成果 如何 答 针对 三 四线 城市 我们 已经 启动 了 百城 翻番 计划 从 上半年 的 情况 来看 经销商 已经 实现 了 销量 翻倍 上半年 这 个 城市 以 的 存量 创造 了 的 增量 问 百城 翻番 的 城市 上半年 增长率 为 多少 答 上半年 东风 日产 总 销量 突破 万台 同比 增长 其中 百城 翻番 是 百分之三十 多 问 离 翻番 的 目标 还有 一定 差距 下半年 怎么 做 答 从 今年 月 开始 东风 日产 就 启动 了 三 四 五线 新兴 市场 网点 的 建设 目前 家 二级 网点 已经 建成 百城 翻番 计划 发力 主要 在 下半年 百城 翻番 指 的 是 同比 增长 随着 新增 网点 的 建设 下半年 完成 目标 没有 问题 而且 该 计划 不 只 针对 增长率 指标 市场占有率 也 很 重要 责任编辑 梁蒙 分享 到 本文 相关 推荐
__label__1	据 中国 之声 央广 新闻 报道 自 月 上旬 以来 全国 已有 个 省份 就 推行 居民 阶梯 电价 制度 先后 召开 听证会 近千名 听证 参加 人 直接参与 听证 随着 听证 程序 结束 居民 阶梯 电价 制度 将 正式 进入 实施 阶段 记者 近日 采访 了 国家 发改委 请 有关 负责人 梳理 相关 情况 解读 热点问题 据 国家 发改委 有关 负责人 介绍 综合 各地 听证会 的 情况 参与 听证会 的 人员 主流 还是 赞同 推行 居民 阶梯 电价 制度 但是 对 各地 电价 听证 方案 提出 了 一些 意见 主要 体现 在 以下 几个 方面 第一 是 第一 档 电量 设置 标准 偏低 第二 是 建议 充分考虑 家庭 人口 因素 第三 是 建议 要 适当 考虑 季节性 因素 第四 是 认为 电量 标准 地区 差异 较大 东部 沿海地区 较 中西部 地区 较 低 此外 还 涉及 到 比如 电费 结算 周期 合表 用户 提价 峰谷 分 时 电价 低保户 和 五保户 免费 电量 的 政策 落实 电力企业 成本 管理 等 多方面 的 内容 各地 听证会 结束 之后 有关 部门 在 认真 研究 听证 参加 人 所 提出 的 意见 和 建议 后 进行 了 充分 的 研究 就 听证 参加 人员 和 群众 应 的 一些 问题 作出 了 回应 对于 第一 档 电量 标准 偏低 的 问题 各地 普遍 表示 将 在 听证 方案 基础 上 适当 调 第一 档 电量 标准 目前 第一 档 电量 覆盖率 已经 超过 第二 阶梯 电价 制度 试行 一段时间 之后 可以 根据 用电 增长 情况 适时 调 电量 标准 针对 一户 多口 几代 同堂 等 家庭 人口 差异 问题 各地 表示 将 进一步 细化 方案 通过 分表 计量 或者 是 增加 第一 档 电量 等 方式 进行 酌情 的 解决 关于 免费 电量 操作 问题 有些 地方 已经 明确要求 按照 尽可能 方便 老百姓 的 原则 通过 先征 后返 或者 即收 即 退 等 方式 确保 低收入 群体 免费 电量 发放 到位 通过 设置 不同 季节 的 电量 标准 等 办法 来 解决 季节 差异 问题 作者 季 苏平 来源 中国 广播网对 三 四线 城市 我们 已经 启动 了 百城 翻番 计划 从 上半年 的 情况 来看 经销商 已经 实现 了 销量 翻倍 上半年 这 个 城市 以 的 存量 创造 了 的 增量 问 百城 翻番 的 城市 上半年 增长率 为 多少 答 上半年 东风 日产 总 销量 突破 万台 同比 增长 其中 百城 翻番 是 百分之三十 多 问 离 翻番 的 目标 还有 一定 差距 下半年 怎么 做 答 从 今年 月 开始 东风 日产 就 启动 了 三 四 五线 新兴 市场 网点 的 建设 目前 家 二级 网点 已经 建成 百城 翻番 计划 发力 主要 在 下半年 百城 翻番 指 的 是 同比 增长 随着 新增 网点 的 建设 下半年 完成 目标 没有 问题 而且 该 计划 不 只 针对 增长率 指标 市场占有率 也 很 重要 责任编辑 梁蒙 分享 到 本文 相关 推荐
__label__2	据 中国 之声 央广 新闻 报道 自 月 上旬 以来 全国 已有 个 省份 就 推行 居民 阶梯 电价 制度 先后 召开 听证会 近千名 听证 参加 人 直接参与 听证 随着 听证 程序 结束 居民 阶梯 电价 制度 将 正式 进入 实施 阶段 记者 近日 采访 了 国家 发改委 请 有关 负责人 梳理 相关 情况 解读 热点问题 据 国家 发改委 有关 负责人 介绍 综合 各地 听证会 的 情况 参与 听证会 的 人员 主流 还是 赞同 推行 居民 阶梯 电价 制度 但是 对 各地 电价 听证 方案 提出 了 一些 意见 主要 体现 在 以下 几个 方面 第一 是 第一 档 电量 设置 标准 偏低 第二 是 建议 充分考虑 家庭 人口 因素 第三 是 建议 要 适当 考虑 季节性 因素 第四 是 认为 电量 标准 地区 差异 较大 东部 沿海地区 较 中西部 地区 较 低 此外 还 涉及 到 比如 电费 结算 周期 合表 用户 提价 峰谷 分 时 电价 低保户 和 五保户 免费 电量 的 政策 落实 电力企业 成本 管理 等 多方面 的 内容 各地 听证会 结束 之后 有关 部门 在 认真 研究 听证 参加 人 所 提出 的 意见 和 建议 后 进行 了 充分 的 研究 就 听证 参加 人员 和 群众 应 的 一些 问题 作出 了 回应 对于 第一 档 电量 标准 偏低 的 问题 各地 普遍 表示 将 在 听证 方案 基础 上 适当 调 第一 档 电量 标准 目前 第一 档 电量 覆盖率 已经 超过 第二 阶梯 电价 制度 试行 一段时间 之后 可以 根据 用电 增长 情况 适时 调 电量 标准 针对 一户 多口 几代 同堂 等 家庭 人口 差异 问题 各地 表示 将 进一步 细化 方案 通过 分表 计量 或者 是 增加 第一 档 电量 等 方式 进行 酌情 的 解决 关于 免费 电量 操作 问题 有些 地方 已经 明确要求 按照 尽可能 方便 老百姓 的 原则 通过 先征 后返 或者 即收 即 退 等 方式 确保 低收入 群体 免费 电量 发放 到位 通过 设置 不同 季节 的 电量 标准 等 办法 来 解决 季节 差异 问题 作者 季 苏平 来源 中国 广播网

六、实验

说了这么多,Fasttext到底有多能打,还是需要实验来说话。所以使用了三个数据集,4组实验数据对Fasttext模型的文本分类性能进行了测试。

首先介绍一下使用的数据集:分别是:SougoCS新闻数据集、IMDb Subjectivity DatasetV1.0以及Sentiment140情感分类数据集。

使用的Fasttext版本为最新的0.9.1。

1.Experiment 1

数据:SougoCS新闻数据集,分别取其中IT类、汽车类、商业类、体育类、娱乐类新闻各5500条,训练集与测试集比例为10:1。

参数:lr=0.1;dim=300;wordNgrams=1;epoch=20

结果:epoch:20, time:0:00:21.611209, fasttext_train acc:0.99036, test_acc:0.9396

{'__label__3': {'precision': 0.9858299595141701, 'recall': 0.974, 'f1score': 0.9798792756539235}, '__label__0': {'precision': 0.903353057199211, 'recall': 0.916, 'f1score': 0.9096325719960278}, '__label__1': {'precision': 0.9566074950690335, 'recall': 0.97, 'f1score': 0.9632571996027806}, '__label__2': {'precision': 0.8859470468431772, 'recall': 0.87, 'f1score': 0.8779011099899092}, '__label__4': {'precision': 0.9660678642714571, 'recall': 0.968, 'f1score': 0.967032967032967}}

参数:lr=0.1;dim=300;wordNgrams=3;epoch=20

结果:epoch:20, time:0:02:00.387293, fasttext_train acc:0.98868, test_acc:0.9408

{'__label__3': {'precision': 0.9877800407331976, 'recall': 0.97, 'f1score': 0.9788092835519677}, '__label__0': {'precision': 0.9060665362035225, 'recall': 0.926, 'f1score': 0.9159248269040554}, '__label__1': {'precision': 0.9678068410462777, 'recall': 0.962, 'f1score': 0.9648946840521565}, '__label__2': {'precision': 0.8866396761133604, 'recall': 0.876, 'f1score': 0.8812877263581489}, '__label__4': {'precision': 0.9566074950690335, 'recall': 0.97, 'f1score': 0.9632571996027806}}
0.9408

2.Experiment 2

数据:SougoCS新闻数据集,分别取其中IT类5500条、教育类4400条、汽车类5500条、商业类11000条、体育类22000条、娱乐类11000条,训练集与测试集比例为10:1。

参数:lr=0.1;dim=300;wordNgrams=1;epoch=34

结果:epoch:34, time:0:01:00.772487, fasttext_train acc:0.9968679245283019, test_acc:0.9475

{'__label__4': {'precision': 0.9850374064837906, 'recall': 0.9875, 'f1score': 0.9862671660424469}, '__label__5': {'precision': 0.9812658227848101, 'recall': 0.969, 'f1score': 0.9750943396226415}, '__label__3': {'precision': 0.8952668680765358, 'recall': 0.889, 'f1score': 0.8921224284997491}, '__label__0': {'precision': 0.8068833652007649, 'recall': 0.844, 'f1score': 0.8250244379276638}, '__label__2': {'precision': 0.9690721649484536, 'recall': 0.94, 'f1score': 0.9543147208121827}, '__label__1': {'precision': 0.883054892601432, 'recall': 0.925, 'f1score': 0.9035409035409036}}

参数:lr=0.1;dim=300;wordNgrams=3;epoch=34

结果:epoch:34, time:0:04:23.659888, fasttext_train acc:0.9962264150943396, test_acc:0.953125 

{'__label__4': {'precision': 0.9850374064837906, 'recall': 0.9875, 'f1score': 0.9862671660424469}, '__label__5': {'precision': 0.9813883299798792, 'recall': 0.9755, 'f1score': 0.9784353059177533}, '__label__3': {'precision': 0.9127310061601642, 'recall': 0.889, 'f1score': 0.900709219858156}, '__label__0': {'precision': 0.822429906542056, 'recall': 0.88, 'f1score': 0.8502415458937198}, '__label__2': {'precision': 0.9751552795031055, 'recall': 0.942, 'f1score': 0.9582909460834181}, '__label__1': {'precision': 0.9012048192771084, 'recall': 0.935, 'f1score': 0.9177914110429448}}

3.Experiment 3

数据:IMDb Subjectivity DatasetV1.0。其中客观性描述5000条,主观性描述5000条。训练集与测试集比例为9:1。

参数:lr=0.1;dim=300;wordNgrams=1;epoch=20

结果:epoch:20, time:0:00:00.930512, fasttext_train acc:0.9992222222222222, test_acc:0.906

{'__label__1': {'precision': 0.8874045801526718, 'recall': 0.93, 'f1score': 0.908203125}, '__label__0': {'precision': 0.9264705882352942, 'recall': 0.882, 'f1score': 0.9036885245901639}}

数据:IMDb Subjectivity DatasetV1.0。其中客观性描述5000条,主观性描述5000条。训练集与测试集比例为9:1。

参数:lr=0.1;dim=300;wordNgrams=3;epoch=20

结果:epoch:20, time:0:00:23.920825, fasttext_train acc:0.9998888888888889, test_acc:0.912

{'__label__1': {'precision': 0.8976833976833977, 'recall': 0.93, 'f1score': 0.9135559921414538}, '__label__0': {'precision': 0.9273858921161826, 'recall': 0.894, 'f1score': 0.9103869653767821}}

4.Experiment 4

数据:Sentiment140。该数据集为Twitter上的推文内容,分为积极情绪与消极情绪,其积极情绪文本与消极情绪文本各20000条。训练集与测试集比例为10:1。

参数:lr=0.1;dim=300;wordNgrams=1;epoch=25

结果:epoch:25, time:0:00:01.715858, fasttext_train acc:0.99125, test_acc:0.751

{'__label__0': {'precision': 0.7598343685300207, 'recall': 0.734, 'f1score': 0.7466937945066124}, '__label__4': {'precision': 0.7427466150870407, 'recall': 0.768, 'f1score': 0.7551622418879056}}

数据:Sentiment140。该数据集为Twitter上的推文内容,分为积极情绪与消极情绪,其积极情绪文本与消极情绪文本各20000条。训练集与测试集比例为10:1。

参数:lr=0.1;dim=300;wordNgrams=3;epoch=25

结果:epoch:25, time:0:00:24.791720, fasttext_train acc:0.99975, test_acc:0.7855 

{'__label__0': {'precision': 0.7846460618145563, 'recall': 0.787, 'f1score': 0.7858212680978532}, '__label__4': {'precision': 0.7863590772316951, 'recall': 0.784, 'f1score': 0.785177766649975}}


七、总结

首先,实验数据中可以看出,Fasttext为何命名为Fasttext...那就是因为它的训练速度真的“So Fast!!!”,25000条语料在不加入Word n-gram feature的情况下,1秒钟就可以完成一个epoch的迭代。在Word tri-gram feature的情况下完成20个epoch的迭代也只用了2分钟!!!同时,在面对新闻文本这类语言表述较为规范化的语料时,表现出了不俗的性能。甚至在Experiment 3中的表现超过了之前 LSTM-CNN混合模型 的表现,这个结果不得不让人惊叹,Fasttext真的很能打!

其次,通过Experiment 1与Experiment 2中的实验结果可以看出Fasttext在面对样本不均衡的语料时,其表现没有遭受太大的影响,数量较少的教育类与汽车类依旧保持了较高的精确率与召回率。IT类的表现则有所下降。

再者,四组实验结果中均可看出,加入Word tri-gram feature时,分类模型的分类准确率均要优于不加入Word n-gram feature的情况,这种现象在experiment 4 中尤为明显。推断其原因为Sentiment140数据集为Twitter上的推文语料,多为缺乏规范化的口语化表达,语言形式更随意。情感分类的语料中通常包含许多否定、转折类的词语,这类所在文本中的位置也决定了整个文本的情感类型。因此在这种情况下,Word n-gram feature的加入赋予了模型一定的获取文本中词语顺序关系的能力,因此提升了模型的性能。

最后,总结一下,在面对语言表达规范化,拥有质量较高的语料,或是语料数量不是很富裕的文本分类任务时,你并不需要更加强大和复杂的特征抽取器来构建分类模型。此时Fasttext的确是一个很好的选择。它在调用方便,实现简单,训练速度超快的同时,又能保证还不错的模型性能。咱还要什么什么自行车啊。。。而当语料更加复杂,更加口语化,表述不规范,分类难度更高的时候,或许Fasttext可以快速的充当一个baseline,然后利用更多的时间搭建复杂的模型来解决问题。

 

接下来准备调研TextCNN及HAN,和Fasttext做一个详细的对比,之后再来分享~


八、参考文献及资源链接

1.参考文献

  1. .04606v1.pdf
  2. .01759.pdf

2.数据集

  1. SougoCS:
  2. IMDb Subjectivity DatasetV1.0:/
  3. Sentiment140:

 

如有错误遗漏欢迎交流指正,转载请注明出处。

更多推荐

文本分类模型第一弹:关于Fasttext,看这一篇就够了

本文发布于:2024-02-27 01:09:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1704655.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:这一   模型   文本   就够了   Fasttext

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!