FastText实战天池新闻文本分类比赛

FastText的精髓在于将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。

上面是业界大佬们对FastText模型的高度总结,看起来是不是特别简单?然而,模型的输入到底是什么?为什么要引入n-gram向量?文档的词以及n-gram向量是怎么叠加的?为什么它训练速度快并且性能很好?这些问题一直困扰着我,今天就来深扒一下。

 一、理论基础

FastText是facebook开源的一个快速文本分类器,在提供简单高效的文本分类和表征学习方法的同时,性能比肩深度学习并且训练速度非常快,往往可以作为文本分类场景下的baseline。其模型非常简单,和word2vec的cbow模型很相似,不同点在于cbow预测的是中心词,而fasttext预测的是文本标签。

上图是论文中模型的架构,其模型输入 = 句子本身 + n-gram额外特征。举个例子:我喜欢她。我们对这句话分词后得到:我,喜欢,她。其对应的bi-gram特征为:我喜欢,喜欢他。那么模型的输入变为:我,喜欢,她, 我喜欢,喜欢她。这样做一方面引入了更多字符特征,另一方面解决了词顺序的问题,毕竟我喜欢她和她喜欢我还不是同一个意思。Tri-gram以此类推。

由于每个句子的长度不同,为了便于建模,需要把每个句子填充到相同的长度。如果只使用常见的10000的词(数据预处理后),我们需要把它映射到2-10002之间的整数索引,其中1是留给未登录词,0是用来填充长度。此外,如果数据量很大且句子较长,会引起n-gram数据组合爆炸的问题,原论文中通过采用hash映射到1到K之间来解决这个问题(具体见下面的模型优化章节),同时为了避免和前面的汉字索引出现冲突,哈希映射值一般会加上最大长度的值,即映射到10003-10003+k之间。所以模型的输入长度 = 句子填充长度 + 哈希映射值 = 10003 + k。

数据转换索引后,模型会经过Embedding层,将索引映射为稠密向量,那么模型是如何求平均的呢?这里参考Keras官方实现的fasttext的文本分类文档:

model = Sequential()

# 我们从有效的嵌入层开始,该层将 vocab 索引映射到 embedding_dims 维度
model.add(Embedding(max_features,
                    embedding_dims,
                    input_length=maxlen))

# 我们添加了 GlobalAv
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值