中文短文本分类实例二-FastText(Bag of Tricks for Efficient Text Classification)

一. 简介

        FastText(Bag of Tricks for Efficient Text Classification)是Facebook AI Research提出的一种神经网络结构,它是一个简单而又高效的线性分类模型,能够在很短的时间内实现海量文本分类,支持亿万数据量。

        并且,facebook已经用C++优雅实现了fasttext,内置了很多tricks,一些情况下,它甚至能够超过一些调参复杂的深度神经网络。工业生产中,高效易用性使得它能够作为文本分类任务的基线使用。

        实际上,从深度学习和人工智能的发展历程来看,简易性、准确性、高效性,解决其中任何一个难题的算法,都有可能引发革命的,是难能可贵的。简易型,例如jieba的易用性使得其成为python最受欢迎最广泛使用的分词器,又如近来火热的手机神经网络模型(moblie network),关键就在于减少模型参数,keras和pytorch的崛起,也说明了这一点;准确性,这个就不用说了,准确性,这正是我们所永恒追求的,例子特别多,bert的流行,CNN在图像领域的称霸;高效性,就是说速度快,这个也十分重要,速度就是生命,transfmer、attention的崛起伴随着rnn的衰落,fasttext、word2vec的应用。

        所以,尽管FastTest看起来很简单,只有一层神经网络结构,但是也不容小觑。各种tricks尤其多。

        FastText分类代码github地址:https://github.com/yongzhuo/Keras-TextClassification/tree/master/keras_textclassification

 

二. FastText网络

         FastText的重点主要包括三个部分: N-gram特征、层次softmax、模型网络(fasttext model)

2.1  FastText模型图

                                                  

        其实,就是一个简单的线性分类器,y=softmax(Wx+b)。其中,fasttext的文本表征,特征,也就是输入,和word2vec词向量工具的连续词袋(CBOW)很像。对N条短文本进行分类,使用符号为f的softmax函数分类,那么优化的目标函数就是下图的负对数似然。

                                                         

       上图中的符号的意思:  Xn是第n个数据预处理后文本样本的特征,Yn是对应的label类别,A 、B是权重矩阵。

2.2  层次softmax

       层次softmax也叫分层softmax,是为了解决softmax分类计算量大的问题。例如,知乎看山杯文本多标签分类比赛中有L(1999)个类,每个样本都计算L(1999)个类的概率,d是文本的表征维度,那么这时候的计算复杂度就是O(dL)=300*1999。

       为了解决这个计算量大问题,有两种方法,一个是负采样(Negative Sampling,NEG(Noise Contrastive Estimation)的简化版),就是从L-1个类中取k(5-20、2-5)个样本比较就好,这样计算复杂度变成了O(dk)=300*5,但是会带来一定的计算损失。

        另外一种方法就是层序softmax(Hierarchical Softmax),也就是将label按照出现的频率构建一棵Huffman树(这时候权重和最小,即最优二叉树),这时候复杂度变成O(d*log2(k)),k是树的深度。

        推荐霍夫曼编码,应该看得懂:https://www.cnblogs.com/kubixuesheng/p/4397798.html

2.3  N-gram

        N-gram特征应该不难提取,也容易懂,就是提取文本中所有的n个连续词。例如样本为['我',‘喜', '欢’, '你'],n=2,提取出来就是[('我',‘喜'), (‘喜', '欢’), ( '欢’, '你')]。

 

三.代码实现

3.1  代码实现起来也不难,就一层嘛,就是n-gram、hierarchical-softmax复杂些,不过网上也有很多资料啦。

3.2  github代码地址: https://github.com/yongzhuo/Keras-TextClassification/tree/master/keras_textclassification

       代码中没有实现n-gram和hierarchical-softmax,不过应该也不难。

       或者直接用facebook开源的fasttext工具就好,简单而且还优化得很好,比自己写的效果好多了。

3.3  关键代码:

    def create_model(self, hyper_parameters):
        """
            构建神经网络
        :param hyper_parameters:json,  hyper parameters of network
        :return: tensor, moedl
        """
        super().create_model(hyper_parameters)
        embedding = self.word_embedding.output
        x = GlobalMaxPooling1D()(embedding)
        output = Dense(self.label, activation=self.activate_classify)(x)
        self.model = Model(inputs=self.word_embedding.input, outputs=output)
        self.model.summary(120)

希望对你有所帮助!

 

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值