FastText的简单介绍

0、引言

FastText是facebook开源的一款集word2vec、文本分类等一体的机器学习训练工具。在之前的论文中,作者用FastText和char-CNN、deepCNN等主流的深度学习框架,在同样的公开数据集上进行对比测试,在保证准确率稳定的情况下,FastText在训练时间上,有着惊人的表现,近百倍的速度提升

1、fastText文本分类

一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物

(1)字符级别的n-gram

word2vec把语料库中的每个单词当成原子,它会为每个单词生成一个向量,这忽略了单词内部的形态特征,如“apple”与“apples”,两个单词都有较多的公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了

为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词,对于“apple”,假设n的取值为3,则它的trigram有:

""

其中<表示前缀,>表示后缀,我们可以使用这5个trigram的向量叠加来表示“apple”的词向量

优点:

对于低频词生成的词向量效果会更好,因为它们的n-gram可以和其他词共享;对于训练词库之外的单词,仍然可以构建它们的词向量,可以叠加它们的字符级别n-gram向量

(2)模型架构

fastText模型架构和word2vec的CBOW模型架构非常相似,下面就是fastText模型的架构图:

 

FastText的简单介绍_第1张图片

从上图可以看出来,fastText模型包括输入层、隐含层、输出层共三层。其中输入的是词向量,输出的是label,隐含层是对多个词向量的叠加平均。

1)CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些单词用来表示单个文档

2)CBOW的输入单词被one-hot编码过,fastText的输入特征时被embedding过

3)CBOW的输出是目标词汇,fastText的输出是文档对应的类标

(3)核心思想

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

小技巧:字符级n-gram特征的引入以及分层softmax分类

2、安装

pip install fasttext

3、实践

具体代码如下所示:

# coidng:utf-8
import fasttext


# 模型的训练
def train():
    model = fasttext.train_supervised("train.txt", lr=0.1, dim=100, epoch=500, word_ngrams=4, loss='softmax')
    model.save_model("model_file.bin")


# 模型的测试
def test_1():
    classifier = fasttext.load_model("model_file.bin")
    # 测试模型
    result = classifier.test("test.txt")
    print("准确率:", result)
    f1 = open('prediction.txt', 'w', encoding='utf-8')
    with open('test.txt', encoding='utf-8') as fp:
        for line in fp.readlines():
            line = line.strip()
            if line == '':
                continue
            f1.write(line + '\t#####\t' + classifier.predict([line])[0][0][0] + '\n')
    f1.close()


if __name__ == '__main__':
    train()
    test_1()

 

欢迎同道者交流

 

 

 

你可能感兴趣的:(自然语言处理)