首页 > 编程语言 >文本分类fastText算法

文本分类fastText算法

时间:2023-06-14 19:32:50浏览次数:53  
标签:fastText 叶子 算法 类别 文本 节点 向量


1. 概述

在深度学习遍地开花的今天,浅层的网络结构甚至是传统的机器学习算法被关注得越来越少,但是在实际的工作中,这一类算法依然得到广泛的应用,或者直接作为解决方案,或者作为该问题的baseline,fastText就是这样的一个文本分类工具。fastText是2016年由facebook开源的用于文本分类的工具,fastText背后使用的是一个浅层的神经网络,在保证准确率的前提下,fastText算法的最大特点是快。

2. 算法原理

2.1. fastText的模型结构

fastText是如何保证速度的呢?首先fastText的模型结构如下所示:

文本分类fastText算法_子节点

假设文本有文本分类fastText算法_初始化_02个词,如上图所示,首先将这文本分类fastText算法_初始化_02个词映射成词向量,可以通过矩阵文本分类fastText算法_深度学习_04实现,得到文本分类fastText算法_初始化_02个词的向量后,将这些向量相加并取均值,得到该段文本的向量表示,最后输入到线形分类器中,得到最终的分类。从模型结构上来看,模型结构也是相当简单,只是是逻辑回归LR模型的基础上增加了句子向量的计算。对于分类问题,其损失函数为:

文本分类fastText算法_初始化_06

其中,文本分类fastText算法_子节点_07表示的是类别,文本分类fastText算法_子节点_08为激活函数,通常采用sigmoid函数。

2.2. 层次softmax

为了简化问题,假设隐含层的为文本分类fastText算法_子节点_09,那么对于文本分类fastText算法_子节点_09,其属于第文本分类fastText算法_子节点_11个类别的概率为:

文本分类fastText算法_ci_12

如果类别较多时,上述公式的分母的计算会严重降低算法的速度,借鉴word2vec中的经验,使用层次softmax可以加速计算,带有层次softmax加速的fastText结构可以表示为:

文本分类fastText算法_初始化_13


如上图,最下面是一个Huffman树,每个叶子节点代表一个类别,这样可以对每一个叶子节点编号。同时,假设一个Huffman树有文本分类fastText算法_ci_14个叶子节点,那么该树有文本分类fastText算法_子节点_15个非叶子节点,将上述的Huffman树抽象出来,如下图所示:

文本分类fastText算法_初始化_16

对于特征文本分类fastText算法_子节点_09该如何计算类别,如上图中,对于每一个叶子节点,都有对应的编码,如叶子节点文本分类fastText算法_子节点_18的编码为:0000,叶子节点文本分类fastText算法_子节点_19的编码为:11。对于Huffman树的构建过程非本文的重点,不在本文中重复。在模型参数初始化过程中,需要同时初始化非叶子节点的向量表示,如图中的文本分类fastText算法_初始化_20,假设对于特征文本分类fastText算法_子节点_09,其所属的类别为文本分类fastText算法_初始化_22,因此找到文本分类fastText算法_初始化_22的编码和路径,我们发现需要经过的非叶子节点为:文本分类fastText算法_子节点_24,其对应的编码为:001,因此计算过程为:

文本分类fastText算法_子节点_25

同样,每一个非叶子节点的向量也参与模型的训练。在预测过程中,直接可以计算出属于每一个叶子节点的概率。

参考文献

  • Armand Joulin, Edouard Grave, Piotr Bojanowski, and Tomas Mikolov. Bag of tricks for efficient text classification. arXiv preprint arXiv:1607.01759, 2016
  • fastText

更多内容请访问:www.felixzhao.cn


标签:fastText,叶子,算法,类别,文本,节点,向量
From: https://blog.51cto.com/u_16161414/6480224

相关文章

  • 机器学习算法实现解析——libFM之libFM的训练过程概述
    本节主要介绍的是libFM源码分析的第四部分——libFM的训练。FM模型的训练是FM模型的核心的部分。4.1、libFM中训练过程的实现在FM模型的训练过程中,libFM源码中共提供了四种训练的方法,分别为:StochasticGradientDescent(SGD),AdaptiveSGD(ASGD),AlternatingLeastSquares(ALS)和MarkovCh......
  • 挑战数据结构和算法面试题——二叉搜索树的后序遍历
    分析:根据二叉查找树的定义,二叉查找树或者是一棵空二叉树,或者是具有一下特性的二叉树:若它的左子树不为空,则左子树上的所有结点的值均小于根节点的值;若它的右子树不为空,则右子树上的所有结点的值均小于根节点的值;它的左右子树又分别是二叉查找树。结合二叉树的后序遍历,则初始序列的最......
  • 【数据结构和算法面试题】左旋转字符串
    问题分析:本题是常见的旋转字符串的问题,解决的方法是两步旋转的方法:方法:voiddo_reverse(char*p_start,char*p_end){ if(NULL==p_start||NULL==p_end||p_start>p_end)return; chartmp; while(p_start<p_end){ tmp=*p_start; *p_start=*p_end; *p_end......
  • 代码随想录算法训练营第七天| 344.反转字符串 、 541. 反转字符串II、 剑指Offer 05.
     344.反转字符串代码:1voidreverseString(vector<char>&s){23inti=0;4intj=s.size()-1;5while(i<j)6{7charmid=s[i];8s[i]=s[j];9s[j]=mid;1011i++;12......
  • 【数据结构与算法面试题】子数组的最大和
    题目来源“数据结构与算法面试题80道”。问题分析:在数组的每一个位置处保存当前的最大值,当前的最大值组成为:解决方案:intget_max_subarray(int*a,intlength,bool&is_array_ok){ if(NULL==a||length<=0){ is_array_ok=false; return0; } int*p_h_a=(int*......
  • 简单易学的机器学习算法——K-Means++算法
    一、K-Means算法存在的问题由于K-Means算法的简单且易于实现,因此K-Means算法得到了很多的应用,但是从K-Means算法的过程中发现,K-Means算法中的聚类中心的个数k需要事先指定,这一点对于一些未知数据存在很大的局限性。其次,在利用K-Means算法进行聚类之前,需要初始化k个聚类中心,在上述的......
  • 数据结构和算法——二叉排序树
    一、二叉排序树对于无序的序列“62,58,88,47,73,99,35,51,93,29,37,49,56,36,48,50”,是否存在一种高效的查找方案,使得能够快速判断在序列中是否存在指定的数值?二叉排序树是一种简单,高效的数据结构。二叉排序树,又称为二叉查找树。二叉排序树或者是一棵空树,或者是具有以下性质的二叉树:若其左子树不为......
  • 挑战数据结构和算法面试题——最大差值
    题目来自伯乐在线,欢迎有不同答案的同学来一起讨论。分析:基本方法是遍历数组,找到当前值前面所有数组元素的最小值。方法:intget_max_distance(int*a,constintn){intmax_distance=0;//纪录最大距离if(n==0)returnmax_distance;intmin=a[0];//纪录最小的......
  • 推荐算法——基于图的推荐算法PersonalRank算法
    一、推荐的概述在推荐系统中,通常是要向用户推荐商品,如在购物网站中,需要根据用户的历史购买行为,向用户推荐一些实际的商品;如在视频网站中,推荐的则是不同的视频;如在社交网站中,推荐的可能是用户等等,无论是真实的商品,还是视频,再或者是用户,都可以假设成一种物品,如下图所示:(图片来自参考......
  • 【数据结构与算法面试题】求和
    题目来源“数据结构与算法面试题80道”。问题分析:可以使用类的构造方法,在类的每次实例化对象时都会调用构造方法,那么只需要实例化n个对象,就会调用n次构造方法,这就模拟了循环的过程,此时,只需要有一个全局变量记录累加的值即可。方法:#include<stdio.h>classcalnum{ public: cal......