算法模型:fastText
【算法简介】:
1.fastText 是 Facebook 推出的一个便捷的工具,包含文本分类和词向量训练两个功能;
2.fastText 可实现快速文本分类,模型复杂度低,效果好,可自己训练词向量,训练和测试速度快;
3.fastText 与 CBOW 相似,但是 CBOW 用上下文去预测中心词,而 fastText 用全部N-gram去预测类别。
【算法原理】:
模型架构分三层,分别是输入层、隐藏层、输出层。其中:
输入层 是对文本 Embedding 之后的向量,包含所有 N-gram 特征;
隐藏层 是对输入数据的求和平均;
输出层 是文本对应的标签。
输入层:fastText 的输入是对整个句子词嵌入之后的向量,即所有 N-garm 特征。其中,N-gram采用了嵌入向量(词嵌入)的形式,得到单词的隐向量表达。下面先来解释词嵌入(Word Embedding)原理。
(1)词嵌入(Embedding) 词嵌入可以让模型更好的理解词与词之间的类别,比如男人和女人,国王和王后。如下图所示,使用一个特征向量来表征单词,特征向量中的每一个元素都是对该单词某一特征的量化描述。
“King”与“Man”之间的差别主要是“Royal”,用“Royal”加上“Woman”即和“Queen”等价。以上例子表明,词嵌入可以帮助我们找到不同单词之间的相似类别关系。N-gram 特征使用词嵌入对分词构造了词向量特征,使得模型能够理解分词之间的相关关系,下面介绍 N-gram 过程。
(2)N-gram 特征: N-gram 的基本思想是将文本内容按照字节顺序进行大小为 N 的窗口滑动操作,最终形成窗口为N 的字节片段序列。如下图所示:
通过 N-gram 的方式关联相邻的几个词,会让模型在训练的时候保持词序信息。以二元分词为例:
【输出层】:输出层经过层次 softmax 输出最终分类类别。 在文本分类任务中,fastText 输出再经过层次 softmax 进行分层分类,如下图所示,层次softmax 的核心是根据全部语料的词频建立 Huffman 树,词频越大,越靠近根节点,利用上下文只预测中心词。
对于文本分类,我们要计算的是从 root 结点开始随机走,到达类别 w 的概率。所以需要知道向左和向右的概率,找到概率最大的路径。例如到达非叶子节点 n 时向左和向右的概率分别是:
以上图中到达目标类别 w2的概率为:
表示将文本分类为 w2的概率大小为 0.5248。
【用法】:
一、文本分类
步骤1:获取数据
将数据处理成如下格式,所有标签均以__label__前缀开头,标签之后即为文本信息:
步骤3:训练模型
二、词向量训练
import fasttext
# Skipgram model :
model = fasttext.train_unsupervised('data.txt', model='skipgram')
# or, cbow model :
model = fasttext.train_unsupervised('data.txt', model='cbow')