FastText词向量计算和文本分类工具
一、前言
FastText是Facebook于2016年开源的一个词向量计算和文本分类工具,它的优点非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练10亿词级别语料库的词向量在10分钟之内,能够在1分钟之内分类有着30万多类别的50多万句子的语料。
二、FastText分类
在一般情况下,使用fastText进行文本分类的同时会产生词的embedding,即embedding是fastText分类的产物。
(一)字符级别的n-gram
word2vec将语料库中的每一个单词看成一个元素,会为每一个单词生成一个词向量,这忽略了单词的内部形态特征,例如:“love”和“loves”,"苹果公司"和“苹果”,在这两个栗子中,两个单词都有比较多的公共字符,也就是它俩内部形态相似,但是在传统的word2vec中,这种单词内部形态信息会因为被转换为不同的id而丢失。
为了解决这个问题:FastText使用了字符级别的n-grams来表示一个词,对于单词“love”,假设n取值为3,则对应的trigram有:“<lo”,“lov”,“ove”,“ve>”,其中,“<”表示前缀,“>”表示后缀。因此可以用trigram来表示“love”这个单词,进一步可以用4个trigram的向量叠加来表示“love”的词向量。
优点:
- 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。
- 对于训练词库之外的单词,仍然可以构建它们的词向量,可以叠加它们的字符级n-gram向量。
(二)模型架构
可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。
(三)核心思想
从隐藏层输出到输出层输出,会发现FastText就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量。那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均。叠加词向量背后的思想就是传统的词袋CBOW法,即将文档看成一个由词构成的集合。
核心思想: 将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。
(四)分类效果
使用词embedding而非词本身作为特征,这是fastText效果好的一个原因;另一个原因就是字符级n-gram特征的引入对分类效果会有一些提升 。