word embedding系列(三)FastText

fastText 是 facebook 开源的一个词向量计算以及文本分类工具,fastText 方法包含三部分:模型架构层次 SoftmaxN-gram 特征

该工具的理论基础是以下两篇论文:

Enriching Word Vectors with Subword Information词向量(n-gram subword+skip-gram)

Bag of Tricks for Efficient TextClassification分类(cbow+h softmax)

本篇文章分为三部分来介绍fasttext:

1.fasttext中的词向量

2.fasttext预测标签

3.代码示例

1. FastText中的词向量

第一篇论文Enriching Word Vectors with Subword Information提出了用 word n-gram 的向量之和来代替简单的词向量的方法。

如果一个word出现次数较少那么学到的vector质量也不理想。针对这一问题作者提出使用subword信息来弥补。什么是subword呢?比如说一个单词,word,它的subword也就是单词本身的所有n-gram词,比如word的2gram,就是wo,or,rd。方法中一般会加入前后缀,于是就可能变为#word#,那么它的所有2gram就是#w,wo,or,rd,d#。

方法上,论文沿用了word2vec的skip-gram模型,主要区别体现在特征上。word2vec使用word作为最基本的单位,即通过中心词预测其上下文中的其他词汇。而subword model使用字母n-gram作为单位,为了提高效率一般会过滤低频的ngram词,fasttext中n取值为3~6。这样每个词汇就可以表示成一串字母n-gram,一个词的embedding表示为其所有n-gram的和。这样训练也从用中心词的embedding预测目标词,转变成用中心词的n-gram embedding预测目标词。

原文中表示最后的embedding的处理过程是:把这些subword构成一个词典,把这些ngrams通过哈希函数映成整数1到K,同时也会使用word作为它自己的一个ngram来学习它自己本身的词向量,对word也构建一个词典。一个单词由word dictionary中的index和它的ngrams的哈希值组成。最常用的P个词不使用ngrams,当P和单词表大小一样大的时候,就退化为skip-gram的word2vec。

但是在实际操作代码时,embedding出来的词汇还是稠密向量的形式,所以实际应用的时候应该只是把index编码作为查询向量的key,最终输出的还是向量。

2.fasttext预测标签

fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,word2vec中的CBOW是通过上下文预测中间词,而fastText则是通过上下文(包括CBOW中的中间词)预测标签(这个标签就是文本的类别,是训练模型之前通过人工标注等方法事先确定下来的)。fastText的模型则是将整个文本作为特征去预测文本的类别。

fasttext预测标签的模型与word2vec的差别主要在于:

(1) 模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是分类的label的概率。不过不管输出层对应的是什么内容,其对应的vector都不会被保留和使用;

(2) 模型的输入层:word2vec的输出层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;

两者本质的不同,体现在 h-softmax的使用。

Wordvec的目的是得到词向量,该词向量最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。

fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)

3.代码示例

源码地址:https://github.com/facebookresearch/fastText

Python可以直接pip install fasttext

输入

每行是一个‘长文本 __label__标签’

__label__是类标前缀,后面跟的是类标

词向量模型

初始化输入层,对于普通word2vec,输入层就是一个词向量的查找表,所以它的大小为nwords行,dim列(dim为词向量的长度),但是fastText用了word n-gram作为输入,所以输入矩阵的大小为(nwords + ngram种类) * dim代码中,所有word n-gram都被hash到固定数目的bucket中,所以输入矩阵的大小为(nwords + bucket个数) * dim

文本分类+精度评估

在这里因为语料本身的原因,所以分类精确度不高,类标和本文比较合理的语料,一般能轻松达到90+

查看分类标签

以上就是fasttext的介绍啦~模型中有很多参数,可以慢慢调。它作为一个分类和embedding二合一的工具包真的是很强大了。欢迎交流~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180812G1BY1N00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券