fastText简介与实践

0. 写在前面

在fastText问世以前,线性模型在文本分类任务中占据了主要地位,如果选用了正确的特征,往往能取得不错的效果。但是,其模型简单成为线性模型发展的瓶颈。神经网络具备高阶特征拟合能力,适用于各类复杂场景。fastText就是一种将DNN应用于文本分类的经典工作,并且在当时取得了SOTA的效果。

个人心得:

  1. 字符级n-gram,将单词拆分为子字符串,并分别训练embedding后叠加得到单词embedding。能够学习到单词词形,并且可以处理未登录词的embedding
  2. fastText可用于解决分类问题,如情感分类、文本分类等。

论文地址:

https://arxiv.org/pdf/1607.01759.pdf

1. 模型架构

fastText采用的是典型三层神经网络架构。如下图所示。

一句话概括,输入层是每个n-gram文本分词的embedding向量表示,进行求和取平均后传入隐层,最后送入softmax得到预测结果,如果类别数目过多,可用层次softmax提升分类效率,如类别较少,使用普通的softmax即可。看上去fastText平平无奇,甚至与word2vec的CBOW结构有点类似,其实fastText有一个很大的优化点,就是刚刚的提过的N-gram。下面我们就来看看什么是N-gram以及为什么要这样优化。

2. N-gram

对于训练一个词向量,一般的做法是将中文进行分词,或者将英文短句中的每一个单词去训练得到其embedding向量。这种做法有两个问题:

  1. 每个词在embedding前需要进行独热编码,编码后的单词失去了其词形相似度信息。例如,load与loaded,表示的是同一个意思,但是将其分别embedding会造成语义差距相差较大的情况
  2. 无法处理未登录词

n-gram根据粒度不同可以分为字符级N-gram和词组级N-gram。以“我在学校练习编程”为例,

字符级

我在/在学/学校/校练/练习/习编/编程

词组级

我在/在学校/学校练习/练习编程

fastText在论文中使用了字符级n-gram的方式来对分词作embedding,对apple这个词,会将分为ap/ppl/ple并做embedding,最后求和得到apple的embedding结果。这种方式可以解决:

  1. 相似单词往往具备相似含义,字符级n-gram得到的embedding也相似
  2. 通过分解未登录词,能够得到其embedding向量

3. 实战

本文使用python版本的fastText。在linux环境下,输入以下命令即可安装fastText

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ pip install .

以下步骤参考

https://towardsdatascience.com/natural-language-processing-with-fasttext-part-1-an-intro-to-text-classification-with-fasttext-11b9771722d8

第一步,终端输入以下命令下载数据集,其中cooking.stackexchange.txt为我们所需的样本数据集

wget https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz && tar xvzf cooking.stackexchange.tar.gz

第二步,运行以下命令切分训练集和测试集,其中,每条数据以__label__开头,表示样本标签,后面表示sentence样本数据。

$ head -n 12324 cooking.stackexchange.txt > training_data.txt 
$ tail -n 3080 cooking.stackexchange.txt > testing_data.txt

第三步,python运行fastText。示例程序如下:

import fasttext

def train():
    model = fasttext.train_supervised("training_data.txt", lr=0.1, dim=100,
             epoch=5, word_ngrams=2, loss='softmax')
    model.save_model("model_file.bin")

def test():
    classifier = fasttext.load_model("model_file.bin")
    result = classifier.test("testing_data.txt")
    print("acc:", result)
    with open('testing_data.txt', encoding='utf-8') as fp:
        for line in fp.readlines():
            line = line.strip()
            if line == '':
                continue
            print(line, classifier.predict([line])[0][0][0])

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

界面上会输出:

__label__dough __label__yeast __label__cinnamon cinnamon in bread dough __label__baking
__label__coffee __label__fresh Freshly ground coffee, how fresh should it be? __label__food-safety
__label__sauce __label__thickening How to thicken a Yoghurt based cold sauce? __label__baking
...

即成功完成对fastText模型的训练和测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值