快速文本分类(FastText)

article/2025/8/26 19:40:10

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

文本分类

什么是文本分类?

相关概念

FastText原理


深度学习神经网络在自然语言处理中表现非常优秀,但动辄几十层,上亿参数的大型网络速度慢且需要大量算力支持,限制了使用场景。FastText是Facebook开源的一款简单而高效的文本分类器,它使用浅层的神经网络实现了word2vec以及文本分类功能,效果与深层网络差不多,节约资源,且有百倍的速度提升,可谓高效的工业级解决方案。本篇将介绍Fasttext的相关概念、原理及用法。

文本分类

文本分类是许多应用程序的核心问题,例如垃圾邮件检测,情感分析或智能回复。 在本教程中,我们将介绍如何使用fastText工具构建文本分类器。

什么是文本分类?

文本分类的目标是将文档(如电子邮件,博文,短信,产品评论等)分为一个或多个类别。 这些类别可以是根据评论分数,垃圾邮件与非垃圾邮件来划分,或者文档的编写语言。 如今,构建这种分类器的主要方法是机器学习,即从样本中学习分类规则。 为了构建这样的分类器,我们需要标注数据,它由文档及其相应的类别(也称为标签或标注)组成。

相关概念

BOW BOW是词袋Bag of Words的简称,BOW是文本分类中常用的文本向量化的方法,它忽略了顺序和语法,将文本看成词汇的集合,且词汇间相互独立,如同把词放进了一个袋子。在分类任务中使用BOW时,就是根据各个词义综合分析文本的类型,常用于感情色彩分类等领域。

CBOW

CBOW是连续词袋模型Continuous Bag-of-Word Model的简称,它常用于上下文词来预测中间词。

如图所示,使用前两个和后两个词(共C=4个)预测中间的词w,其中每个词被映射成V维的词向量;每个词向量乘以参数矩阵A(VN维矩阵),转换成N维数据,然后将所有词对应的N维的数据相加取均值,计算出N维的隐藏层Hidden;再用隐藏层乘参数矩阵B(NV维),计算待预测的词w对应的V维词向量;最终用预测出的w与真实的w作比较计算误差函数,然后用梯度下降调整A,B两个参数矩阵。由此,使用简单的神经网络就完成了预测任务。

N-gram

N-gram是由N个token(词)组成的有序集合,常用的有Bi-gram (N=2)和Tri-gram (N=3),实际使用中2或3-gram就够用了。Fasttext论文中使用Bi-gram将文本拆成词对。

如I love deep learning可拆成:
Bi-gram : {I, love}, {love, deep}, {deep, learning}
Tri-gram : {I, love, deep}, {love, deep, learning}

这样使一个词它之前的词建立联系。
以Bi-gram为例,Wn-1出现时,Wn出现的概率是:

其中C()表示计数,N-gram技术在自然语言处理中广泛使用。

FastText原理

在文本分类问题中,早期的算法一般将词袋BOW作为输入,使用线性模型作为算法计算类别,这种方法在类别不均衡时效果不好,后来用将线性分类器分解为低秩矩阵或者多层网络的方法解决这一问题。

FastText与CBOW结构类似,如下图所示:

图片摘自论文

其中输入是文档中的词,使用词嵌入方法,和CBOW一样,通过乘A矩阵转换到Hidden,再乘B矩阵转换到输出层,与CBOW不同的是它的输出不是空缺的单词,而是分类的类别。

FastText用负对数似然作为损失函数:

其中N是文档数,xn是文档中的词特征。yn是标签,A和B是权重矩阵,A用于转换到文本表示,B用于线性变换计算类别,f是一个softmax函数用于计算最终分类的概率。

当分类的类别较多时,计算的时间复杂度是O(hk),其中k是类别的个数,h是文本表示的维度。Fasttext使用了基于霍夫曼编码树的分级softmax,使训练的时间复杂度降为O(hlog2(k))。每一个节点的概率大小与从树根到该节点经过的路径有关,例如某节点深度为l+1,它的父节点分别是n1…n2,则它的概率是:

这就意味着,节点的概率小于它父节点的概率,因此访问树时,就可以忽略概率小的分枝。如果只需预测取前TopN,则复杂度可降至O(log(TopN))。

下面列出了FastText与深度学习模型的速度比较,可以看到,其提速非常明显。

个人感觉,层次少的好处不只在于运算速度快,而且更容易归因,定位重要特征,以及估计对应的权重,不像深度网络的数据都散布在各层的节点之中。

FastText的代码实现

# coding: UTF-8
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as npclass Config(object):"""配置参数"""def __init__(self, dataset, embedding):self.model_name = 'FastText'self.train_path = dataset + '/data/train.txt'                                # 训练集self.dev_path = dataset + '/data/dev.txt'                                    # 验证集self.test_path = dataset + '/data/test.txt'                                  # 测试集self.class_list = [x.strip() for x in open(dataset + '/data/class.txt', encoding='utf-8').readlines()]              # 类别名单self.vocab_path = dataset + '/data/vocab.pkl'                                # 词表self.save_path = dataset + '/saved_dict/' + self.model_name + '.ckpt'        # 模型训练结果self.log_path = dataset + '/log/' + self.model_nameself.embedding_pretrained = torch.tensor(np.load(dataset + '/data/' + embedding)["embeddings"].astype('float32'))\if embedding != 'random' else None                                       # 预训练词向量self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')   # 设备self.dropout = 0.5                                              # 随机失活self.require_improvement = 1000                                 # 若超过1000batch效果还没提升,则提前结束训练self.num_classes = len(self.class_list)                         # 类别数self.n_vocab = 0                                                # 词表大小,在运行时赋值self.num_epochs = 20                                            # epoch数self.batch_size = 128                                           # mini-batch大小self.pad_size = 32                                              # 每句话处理成的长度(短填长切)self.learning_rate = 1e-3                                       # 学习率self.embed = self.embedding_pretrained.size(1)\if self.embedding_pretrained is not None else 300           # 字向量维度self.hidden_size = 256                                          # 隐藏层大小self.n_gram_vocab = 250499                                      # ngram 词表大小'''Bag of Tricks for Efficient Text Classification'''class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()if config.embedding_pretrained is not None:self.embedding = nn.Embedding.from_pretrained(config.embedding_pretrained, freeze=False)else:self.embedding = nn.Embedding(config.n_vocab, config.embed, padding_idx=config.n_vocab - 1)self.embedding_ngram2 = nn.Embedding(config.n_gram_vocab, config.embed)self.embedding_ngram3 = nn.Embedding(config.n_gram_vocab, config.embed)self.dropout = nn.Dropout(config.dropout)self.fc1 = nn.Linear(config.embed * 3, config.hidden_size)# self.dropout2 = nn.Dropout(config.dropout)self.fc2 = nn.Linear(config.hidden_size, config.num_classes)def forward(self, x):out_word = self.embedding(x[0])out_bigram = self.embedding_ngram2(x[2])out_trigram = self.embedding_ngram3(x[3])out = torch.cat((out_word, out_bigram, out_trigram), -1)out = out.mean(dim=1)out = self.dropout(out)out = self.fc1(out)out = F.relu(out)out = self.fc2(out)return out


http://chatgpt.dhexx.cn/article/VEUWD6sE.shtml

相关文章

FastText:快速的文本分类器

转载请注明作者和出处:http://blog.csdn.net/john_bh/ 一、简介二、FastText原理 2.1 模型架构2.2 层次SoftMax2.3 N-gram特征 三、 基于fastText实现文本分类 3.1 fastText有监督学习分类3.2 fastText有监督学习分类 三、总结 3.1 fastText和word2vec的区别3.2 小…

DCGAN的PyTorch实现

DCGAN 1.什么是GAN GAN是一个框架,让深度模型可以学习到数据的分布,从而通过数据的分布生成新的数据(服从同一分布)。 其由一个判别器和一个生成器构成,生成器负责生成“仿造数据”,判别器负责判断“仿造数据”的质量。两者一起…

GAN论文阅读——DCGAN

论文标题:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 论文链接:https://arxiv.org/abs/1511.06434 参考资料:http://blog.csdn.net/liuxiao214/article/details/73500737      …

DCGAN整理总结

DCGAN整理总结 GAN什么是GAN?GAN重要参数及损失函数 DCGAN什么是DCGAN?DCGAN结构TensorFlow版本MINIST手写体生成模型Pytorch版本人脸生成模型 GAN 什么是GAN? GAN是一个教深度学习模型捕捉训练数据的布局来从该布局中生成新数据的框架。最早…

DCGAN论文翻译

UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS (使用DCGAN的无监督表示学习) ABSTRACT(摘要) In recent years, supervised learning with convolutional networks (CNNs) h…

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

https://www.toutiao.com/a6666031263536644621/ 自从Ian Goodfellow的论文以来,GAN已应用于许多领域,但其不稳定性一直存在问题。GAN必须解决极小极大(鞍点)问题,因此这个问题是固有的。 马鞍点的滑稽表示 许多研究人…

DCGAN 源码解析

为什么写Blog现在还没找到理由。不过用心看下去你会觉得更有意义。 我们以生成图片为例子: G就是一个生成图片的网络,它接受一个随机的噪声z,然后通过这个噪声生成图片,生成的数据记做G(z)。D是一个判别网络,判别一张图片是不是…

pytorch搭建DCGAN

我们知道gan的过程是对生成分布拟合真实分布的一个过程,理想目标是让判别器无法识别输入数据到底是来源于生成器生成的数据还是真实的数据。 当然这是一个博弈的过程并且相互促进的过程,其真实的过程在于首先判别器会先拟合真实数据的分布,然…

tensorflow实现DCGAN

1、DCGAN的简单总结 【Paper】 : http://arxiv.org/abs/1511.06434 【github】 : https://github.com/Newmu/dcgan_code theano https://github.com/carpedm20/DCGAN-tensorflow tensorflow https://github.com/jacobgil/keras-dcgan keras https://github.c…

DCGAN TUTORIAL

Introduction 本教程将通过一个示例对DCGAN进行介绍。在向其展示许多真实名人的照片之后,我们将训练一个生成对抗网络(GAN)来产生新名人。此处的大多数代码来自pytorch / examples中的dcgan实现 ,并且本文档将对该实现进行详尽的…

DCGAN原文讲解

DCGAN的全称是Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络)。是2014年Ian J.Goodfellow 的那篇开创性的GAN论文之后一个新的提出将GAN和卷积网络结合起来,以解决GAN训练不稳定的问题的一篇paper. 关于基本的GAN的原理,可以…

DCGAN

转自:https://blog.csdn.net/liuxiao214/article/details/74502975 首先是各种参考博客、链接等,表示感谢。 1、参考博客1:地址 ——以下,开始正文。 2017/12/12 更新 解决训练不收敛的问题。 更新在最后面部分。 1、DCGAN的…

深度学习之DCGAN

这一此的博客我给大家介绍一下DCGAN的原理以及DCGAN的实战代码,今天我用最简单的语言给大家介绍DCGAN。 相信大家现在对深度学习有了一定的了解,对GAN也有了认识,如果不知道什么是GAN的可以去看我以前的博客,接下来我给大家介绍一下DCGAN的原理。 DCGAN DCGAN的全称是Deep Conv…

对抗神经网络(二)——DCGAN

一、DCGAN介绍 DCGAN即使用卷积网络的对抗网络,其原理和GAN一样,只是把CNN卷积技术用于GAN模式的网络里,G(生成器)网在生成数据时,使用反卷积的重构技术来重构原始图片。D(判别器)网…

对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞…

DCGAN理论讲解及代码实现

目录 DCGAN理论讲解 DCGAN的改进: DCGAN的设计技巧 DCGAN纯代码实现 导入库 导入数据和归一化 定义生成器 定义鉴别器 初始化和 模型训练 运行结果 DCGAN理论讲解 DCGAN也叫深度卷积生成对抗网络,DCGAN就是将CNN与GAN结合在一起,生…

torch学习 (三十七):DCGAN详解

文章目录 引入1 生成器2 鉴别器3 模型训练:生成器与鉴别器的交互4 参数设置5 数据载入6 完整代码7 部分输出图像示意7.1 真实图像7.2 训练200个批次7.2 训练400个批次7.2 训练600个批次 引入 论文详解:Unsupervised representation learning with deep c…

GANs系列:DCGAN原理简介与基础GAN的区别对比

本文长期不定时更新最新知识,防止迷路记得收藏哦! 还未了解基础GAN的,可以先看下面两篇文章: GNA笔记--GAN生成式对抗网络原理以及数学表达式解剖 入门GAN实战---生成MNIST手写数据集代码实现pytorch 背景介绍 2016年&#…

Pix2Pix和CycleGAN

GAN的局限性 即便如此,传统的GAN也不是万能的,它有下面两个不足: 1. 没有**用户控制(user control)**能力 在传统的GAN里,输入一个随机噪声,就会输出一幅随机图像。 但用户是有想法滴&#xff…

PyTorch 实现Image to Image (pix2pix)

目录 一、前言 二、数据集 三、网络结构 四、代码 (一)net (二)dataset (三)train (四)test 五、结果 (一)128*128 (二)256*256 …