fastText(N-gram\Embedding)

741 阅读3分钟

算法模型:fastText

【算法简介】:

1.fastText 是 Facebook 推出的一个便捷的工具,包含文本分类和词向量训练两个功能;
2.fastText 可实现快速文本分类,模型复杂度低,效果好,可自己训练词向量,训练和测试速度快;
3.fastText 与 CBOW 相似,但是 CBOW 用上下文去预测中心词,而 fastText 用全部N-gram去预测类别。

【算法原理】:

模型架构分三层,分别是输入层、隐藏层、输出层。其中:
输入层 是对文本 Embedding 之后的向量,包含所有 N-gram 特征;
隐藏层 是对输入数据的求和平均;
输出层 是文本对应的标签。 image.png 输入层:fastText 的输入是对整个句子词嵌入之后的向量,即所有 N-garm 特征。其中,N-gram采用了嵌入向量(词嵌入)的形式,得到单词的隐向量表达。下面先来解释词嵌入(Word Embedding)原理。
(1)词嵌入(Embedding) 词嵌入可以让模型更好的理解词与词之间的类别,比如男人和女人,国王和王后。如下图所示,使用一个特征向量来表征单词,特征向量中的每一个元素都是对该单词某一特征的量化描述。

image.png

用向量表示男人和女人、国王和王后之间的关系如下图所示:

image.png

由图可知,“Man”与“Woman”、“King”与“Queen”的主要区别是性别,由此,也可以推出下式:

image.png

“King”与“Man”之间的差别主要是“Royal”,用“Royal”加上“Woman”即和“Queen”等价。以上例子表明,词嵌入可以帮助我们找到不同单词之间的相似类别关系。N-gram 特征使用词嵌入对分词构造了词向量特征,使得模型能够理解分词之间的相关关系,下面介绍 N-gram 过程。

(2)N-gram 特征: N-gram 的基本思想是将文本内容按照字节顺序进行大小为 N 的窗口滑动操作,最终形成窗口为N 的字节片段序列。如下图所示:

image.png

通过 N-gram 的方式关联相邻的几个词,会让模型在训练的时候保持词序信息。以二元分词为例:

image.png

【输出层】:输出层经过层次 softmax 输出最终分类类别。 在文本分类任务中,fastText 输出再经过层次 softmax 进行分层分类,如下图所示,层次softmax 的核心是根据全部语料的词频建立 Huffman 树,词频越大,越靠近根节点,利用上下文只预测中心词。

image.png

对于文本分类,我们要计算的是从 root 结点开始随机走,到达类别 w 的概率。所以需要知道向左和向右的概率,找到概率最大的路径。例如到达非叶子节点 n 时向左和向右的概率分别是:

image.png

以上图中到达目标类别 w2的概率为:

image.png

表示将文本分类为 w2的概率大小为 0.5248。


【用法】:

一、文本分类
步骤1:获取数据
将数据处理成如下格式,所有标签均以__label__前缀开头,标签之后即为文本信息:

image.png

步骤2:划分训练集和验证集

步骤3:训练模型

image.png

步骤4:使用模型预测并进行评估 输入文本,使用训练好的模型进行预测,输出是一个元组,第一项代表标签,第二项代表对应的概率。

image.png

二、词向量训练

import fasttext
# Skipgram model :
model = fasttext.train_unsupervised('data.txt', model='skipgram')
# or, cbow model :
model = fasttext.train_unsupervised('data.txt', model='cbow')

image.png