-
2022-03-21 12:23:28
1. 为什么要学习FastText
Fext是Facebook公司2016年开源的项目,主要用于构建词向量和文本分类。FastText最大的优点是又快又好,因为本身结构非常简单,只有一层浅层网络,所以模型训练和线上预测的速度非常快,在普通的CPU上也能达到分钟级别的训练速度。不仅如此,在很多分类任务的标准数据集上模型效果也很不错。正因为速度非常快,并且模型效果还不错,所以在工业界应用范围很广。
2. FastText两个功能
FastText主要用于训练词向量和文本分类任务
2.1 训练词向量
FastText一个主要功能是训练词向量,这和word2vec非常相似,有趣的是FastText的主要作者之一就是word2vec的作者,所以说它俩是一脉相承。相比于word2vec来说,FastText主要添加了subwords特性。这里详细介绍下subwords特性,subwords是字母粒度的n-gram。以英文举例,I love NLP。英文会根据空格进行分词,这里会切分成i、love和NLP三个词,词粒度的n-gram(这里假如n为2)则会得到i-love和love-NLP,对于单词love来说字母粒度的n-gram则可以得到I-o、o-v、v-e。字母粒度的n-gram特征可以很好丰富词表示的层次,对于一些未知词可以根据字母粒度的n-gram特征进行更好的表示。
2.2 文本分类
FastText还可以用于文本分类任务,模型结构和word2vec的CBOW非常类似。FastText和word2vec的CBOW模型结构基本上是一样的,区别于word2vec的CBOW模型是根据w3周围的w1、w2、w4和w5来预测w3,属于无监督学习模型,而FastText则根据整句的词w1-w5来预测标签,属于有监督学习任务。FastText将得到的词向量和其他特征相加后取均值作为句向量特征,还会加入n-gram特征。
如上图所示,FastText模型的输入主要包括两部分特征,第一块是词向量特征w1、w2和w3,第二块是n-gram特征w12和w23(这里n设置为2)。将这两部分特征相加之后取均值就得到这句话的语义向量特征,也就是h=(w1+w2+w3+w12+w23)/5。拿到语义向量特征之后就可以通过softmax函数进行分类。因为n-gram特征量级比词向量级大,所以不会全部存储n-gram特征,这里主要通过Hash桶的方式进行存储。将所有的n-gram特征分配到对用的Hash桶中,不仅可以使查询的效率为O(1),而且可以控制内存消耗,但是可能存在不同的n-gram特征分配在同一个桶中,引起hash冲突,但是当分桶的数量设置较大可以有效降低hash冲突。
3. FastText优化项
FastText采用了word2vec的优化流程,基于层次的softmax和负采样。当文本分类的类别很多时通过层次softmax可以有效提升模型的训练速度。
4.源码实战
!pip install fasttext # 豆瓣源 import fasttext.FastText as fasttext classifier = fasttext.train_supervised( input = train_cut_path, # 训练文件路径,中文需要进行分词 lable = '__label__', # 标签前缀 lr = 0.01, # 学习率 dim = 300 # 词向量维度 ws = 5, # 内容窗口大小 epoch = 5, # 训练轮数 loss = 'softmax', # 使用的损失函数 minCount = 2, # 最小词频数 wordNgrams = 4, # 词n-gram的长度 ) classifier.save_model(model_path) # 对于中文来说cut_text是经过分词的文本,k是topk概率的类别,设置-1时返回所有类别 predict_result = classifier.predict(cut_text, k=-1)
更多相关内容 -
fastText4j:使用Java实现Facebook的FastText
2021-02-04 04:07:37fastText4j:使用Java实现Facebook的FastText -
fastText:用于快速文本表示和分类的库
2021-02-12 02:35:24fastText 是一个用于高效学习单词表示和句子分类的库。目录资源楷模最新的最先进的。 单词向量。 和。补充资料在[2]中使用的预处理的。常问问题您可以在我们的上找到。备忘单我们还提供了一份备有有用单。要求我们... -
NLP实战之fasttext进行THUCNews文本分类python
2020-07-29 12:10:24计划赶不上变化快的fasttext来啦~ 包括代码和分好词的训练集、测试集、停词表,测试集F1值0.941,虽然没比TextCNN高但是快啊!fasttext模块安装麻烦一点,具体看博客内容吧。 -
pyfasttext:fastText的另一个Python绑定
2021-02-03 18:23:52pyfasttext不再维护:使用来自fastText存储库的官方Python绑定: : 另一个Python绑定。 绑定支持Python 和 。它需要 。 和也是依赖项,但是是可选的。 pyfasttext已在Linux和Mac OS X上成功测试。 警告:如果... -
fasttext-serving:fastText模型服务
2021-03-21 16:10:47fastText模型服务 安装 您可以从下载预编译的二进制文件,或使用Cargo安装它: cargo install fasttext-serving 使用Docker: docker pull messense/fasttext-serving 用法 $ fasttext-serving --help USAGE: ... -
fasttext训练数据集
2020-11-11 22:56:50Bag of Tricks for Efficient Text Classification, fastText Unofficial PyTorch Implementation of "Bag of Tricks for Efficient Text Classification", 2016, A. Joulin, E. Grave, P. Bojanowski, and T. ... -
FastText-附件资源
2021-03-02 15:11:56FastText-附件资源 -
fasttext-server:Flask Web服务器可为使用FastText训练的监督模型提供服务
2021-05-16 19:54:14先决条件Python 3(请参见) 适用于Python的FastText(请参见)安装pip install fasttext-server 或者您可以从获取预构建映像。 docker pull dfederschmidt/fasttext-server:latest快速开始 python -m ft_server $... -
fasttext词向量,中文
2020-07-06 23:19:39著名的fasttext词向量,上Billion个词,每个词N维,可用于深度模型初始化,BERT之后仍有其价值 -
fasttext
2022-05-27 09:29:40一、fasttext的模型结构是什么 fastText模型架构和word2vec的CBOW模型架构非常相似。 此架构图没有展示词向量的训练过程。可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical ...一、fasttext的模型结构是什么
fastText模型架构和word2vec的CBOW模型架构非常相似。
此架构图没有展示词向量的训练过程。可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。
二、基于bert的分类为啥比fasttext模型效果好
fasttext工具包中内含的fasttext模型具有十分简单的网络结构。使用fasttext模型训练词向量时使用层次softmax结构, 来提升超多类别下的模型性能。由于fasttext模型过于简单无法捕捉词序特征, 因此会进行n-gram特征提取以弥补模型缺陷提升精度。所以fasttext的缺点就是:1. 模型结构简单,所以目前来说,不是最优的模型;2. 因为使用词袋思想,所以语义信息获取有限。
大部分词向量方法对每个词分配一个独立的词向量,而没有共享参数。特别的是,这些方法忽略了词之间的内在联系,词之间的内在联系对于形态学丰富的语言更加重要。
fastText的架构非常简单,有三层:输入层、隐含层、输出层(Hierarchical Softmax)
输入层:是对文档embedding之后的向量,包含有N-garm特征
隐藏层:是对输入数据的求和平均
输出层:是文档对应标签
如下图所示:
上述Fasttext存在的问题:
使用的是词袋模型,没有词序信息。(使用n-gram特征。)
当类别非常多的时候,最后的softmax 速度依旧非常慢。(类似于word2vec,使用层次softmax)三、文本表示有哪些方法
基于one-hot、tf-idf(term frequency–inverse document frequency)TF-IDF原理及使用、textrank等的bag-of-words基于TextRank算法的文本摘要;
主题模型:LSA(latent semantic analysis)(SVD)、pLSA、LSA,pLSA原理及其代码实现 LDA一文详解LDA主题模型;
基于词向量的固定表征:word2vec、fastText、glove
基于词向量的动态表征:elmo、GPT、bert四、fasttext相比word2vec好在哪
word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,“达观数据”和“达观”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。
为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有
“<ap”, “app”, “ppl”, “ple”, “le>”
其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。这带来两点好处:- 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。
- 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。
五、fastText为什么效果比较好
使用词embedding而非词本身作为特征,这是fastText效果好的一个原因;
另一个原因就是字符级n-gram特征的引入对分类效果会有一些提升 。六、怎样才算是一个好的Embedding
ELMo的作者认为一个好的embedding需要满足两个条件:
(1)能够捕捉到语法和语义信息
(2)能够区分一词多义的情况七、fastText相比深度学习的分类方法,有什么优势
FastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点:- FastText在保持高精度的情况下加快了训练速度和测试速度
- FastText不需要预训练好的词向量,FastText会自己训练词向量
- FastText两个重要的优化:Hierarchical Softmax、N-gram
FastText模型架构和 word2vec 中的 CBOW 很相似, 不同之处是FastText预测标签而CBOW预测的是中间词,即模型架构类似但是模型的任务不同。
参考文献:
- https://zhuanlan.zhihu.com/p/67099007
- https://zhuanlan.zhihu.com/p/356703993
-
JFastText:fastText的Java接口
2021-02-03 18:27:41该库提供了完整的fastText的命令行界面。 它还提供了用于从文件加载经过训练的模型以在内存中进行标签预测的API。 通过命令行界面支持模型训练和量化。 JFastText是在Java中构建快速文本分类器的理想选择。 Maven... -
fastText简单介绍和使用
2021-01-06 21:07:011. fastText的介绍 文档地址:https://fasttext.cc/docs/en/support.html fastText is a library for efficient learning of word representations and sentence classification. fastText是一个单词表示学习和文本... -
word2vec/fastText+BiLSTM、TextCNN、CNN+BiLSTM、BiLSTM+Attention情感分类
2021-12-11 14:10:59主要功能:数据清洗、文本特征提取(word2vec / fastText)、建立模型(BiLSTM、TextCNN、CNN+BiLSTM、BiLSTM+Attention) 注:资源内包含所有第三方模块的对应版本,百分百可运行,诚信。 博客链接:... -
fasttext-0.9.2-cp38-cp38-win_amd64
2021-08-19 13:01:22fasttext-0.9.2-cp38-cp38-win_amd64 -
facebook的预训练 fastText 模型wiki-news-300d-1M.vec下载.txt
2021-01-21 23:59:39外网很难下载,贼慢,所以特此分享一个链接。 -
fasttext-0.9.2-cp37-cp37m-win_amd64
2021-08-19 13:01:16fasttext-0.9.2-cp37-cp37m-win_amd64 -
基于FastText的短文本分类
2021-01-12 21:38:01FastText是Facebook AI Research推出的文本分类和词训练工具,它的最大特点是模型简单并且在文本分类的准确率上,和现有的深度学习的方法效果相近,即在保证了准确率的情况下大大缩短了分类时间。 -
fastText-fastText-latest-build43.zip
2020-03-18 09:24:49为所有只能源码安装fasttext的小伙伴。 Fasttext最大的特点是模型简单,只有一层的隐层以及输出层,因此训练速度非常快,在普通的CPU上可以实现分钟级别的训练,比深度模型的训练要快几个数量级。 -
FastText-0.9.2.zip
2021-05-05 16:33:53FastText源码 -
TextClassification-Keras:在Keras中实现的文本分类模型,包括:FastText,TextCNN,TextRNN,TextBiRNN,...
2021-02-03 15:25:04这个代码库实现了一个各种深学习模型使用Keras框架,其中包括文本分类:FastText,TextCNN,TextRNN,TextBiRNN,TextAttBiRNN,韩,RCNN,RCNNVariant等除了模型实现,简化应用程序包括在内。 指导 环境 Python ... -
fastText:用于快速文本分类和表示的库-开源
2021-05-13 22:11:15FastText是一个开放源代码,免费的,轻量级的库,允许用户学习文本表示形式和文本分类器。 它适用于标准的通用硬件。 以后可以缩小模型的尺寸,甚至可以放在移动设备上。 ext分类是许多应用程序的核心问题,例如垃圾... -
valohai-fasttext-example:使用 fastText 进行文本分类的生产机器学习管道
2021-05-30 10:38:08检查的代码以了解如何使用fastText 的Python 绑定。 是一个机器学习平台,可自动执行 MLOps 和记录保存。 检查的代码,了解如何将自定义 ML 代码与 Valohai 集成。 是一个高性能、易于学习、快速编码并准备用于... -
multisense-prob-fasttext:ACL 2018论文
2021-05-14 00:38:14我们使用FastText作为子词表示,以增强稀有词或训练词汇表之外的词的语义估计。 该论文的BibTeX条目是: @InProceedings { athi_multift_2018 , author = { Ben Athiwaratkun, Andrew Gordon Wilson, and Anima ... -
fasttext的使用,预料格式,调用方法
2021-01-06 15:08:02from fasttext import FastText import numpy as np def get_data_path(by_word=True,train=True): if by_word: return ./classify/data_by_word_train.txt if train else ./classify/data_by_word_test.txt else... -
Fasttext
2022-02-25 09:56:30Fasttext Paper Fasttext特点 模型简单,只有一层的隐层以及输出层,因此训练速度非常快 不需要训练词向量,Fasttext自己会训练 两个优化:Hierarchical Softmax、N-gram Fasttext模型架构 fastText模型架构和word...Fasttext
Fasttext特点
- 模型简单,只有一层的隐层以及输出层,因此训练速度非常快
- 不需要训练词向量,Fasttext自己会训练
- 两个优化:Hierarchical Softmax、N-gram
Fasttext模型架构
fastText模型架构和word2vec中的CBOW很相似, 不同之处是fastText预测标签而CBOW预测的是中间词,即模型架构类似但是模型的任务不同。
CBOW架构
(1) word2vec将上下文关系转化为多分类任务,进而训练逻辑回归模型,这里的类别数量 V V V词库大小。
通常的文本数据中,词库少则数万,多则百万,在训练中直接训练多分类逻辑回归并不现实。
(2) word2vec中提供了两种针对大规模多分类问题的优化手段, negative sampling 和hierarchical softmax。在优化中,negative sampling 只更新少量负面类,从而减轻了计算量。hierarchical softmax 将词库表示成前缀树,从树根到叶子的路径可以表示为一系列二分类器,一次多分类计算的复杂度从|V|降低到了树的高度。整体的复杂度从。Fasttext架构
fastText模型架构:其中 x 1 , x 2 , … , x N − 1 , x N x_1,x_2,…,x_{N−1},x_N x1,x2,…,xN−1,xN表示一个文本中的n-gram向量,每个特征是词向量的平均值。这和前文中提到的cbow相似,cbow用上下文去预测中心词,而此处用全部的n-gram去预测指定类别。- x 1 , x 2 , … , x N − 1 , x N x_1,x_2,…,x_{N−1},x_N x1,x2,…,xN−1,xN一个句子的特征,初始值为随机生成也可以采用预训练的词向量
- hidden: X i X_i Xi 的平均值 x
- output: 样本标签
目标函数
N N N:样本个数
y n y_n yn:第n个样本对应的类别
f f f:损失函数softmaxt
x n x_n xn:第n个样本的归一化特征
A A A:权重矩阵(构建词,embedding)
B B B:权重矩阵(隐层到输出层)词向量初始化
一个句子的embedding为 [ i w 1 , i w 2 , … . i w n , o w 1 , o w 2 , … o w s ] [iw_1,iw_2,….iw_n,ow_1,ow_2,…ow_s] [iw1,iw2,….iwn,ow1,ow2,…ows]
i w i iw_i iwi:语料中出现的词,排在数组的前面
o w i ow_i owi:n-gram或n-char特征
初始化为随机数, 如果提供预训练的词向量,对应的词采用预训练的词向量层次softmax
当语料类别较多时,使用hierarchical Softmax(hs)减轻计算量 hs利用Huffman 树实现,词生成词向量或label分类问题作为叶子节点 根据词或label的count构建Huffman树,则叶子到root一定存在一条路径利用逻辑回归二分类计算loss。n-gram和n-char
Fasttext方法不同与word2vec方法,引入了两类特征并进行embedding。其中n-gram颗粒度是词与词之间,n-char是单个词之间。两类特征的存储均通过计算hash值的方法实现。
n-gram
示例: who am I? n-gram设置为2
n-gram特征有,who, who am, am, am I, I
n-char
示例: where, n=3, 设置起止符<, >
n-char特征有,<wh, whe, her, ere, er>FastText词向量与word2vec对比
- 模型的输出层
- word2vec的输出层,对应下一个单词的概率最大值;fasttext的输出层是分类的label
- 模型的输入层:
- word2vec的输入层,是 context window 内的word;而fasttext 对应的整个sentence的内容,包括word,也包括 n-gram的内容;
代码
import fasttext ## 1 is positive, 0 is negative f = open('train.txt', 'w') f.write('__label__1 i love you\n') f.write('__label__1 he loves me\n') f.write('__label__1 she likes baseball\n') f.write('__label__0 i hate you\n') f.write('__label__0 sorry for that\n') f.write('__label__0 this is awful') f.close() f = open('test.txt', 'w') f.write('sorry hate you') f.close() ## 训练 trainDataFile = 'train.txt' classifier = fasttext.train_supervised( input=trainDataFile, ## 文件输入 label_prefix='__label__', ## label前缀 dim=2,# 词向量维度 epoch=2, ## epoch次数 lr=1, # 学习率 lr_update_rate=50, # 多少步更新学习率 min_count=1, # 最少的单词出现次数 loss='softmax', ## loss function {ns, hs, softmax} [softmax] word_ngrams=2, # n-gram 窗口大小 bucket=1000000) ## 叶子数 ## 保存模型 classifier.save_model("Model.bin") ## 测试集测试 testDataFile = 'test.txt' classifier = fasttext.load_model('Model.bin') result = classifier.test(testDataFile) print ('测试集上数据量', result[0]) print ('测试集上准确率', result[1]) print ('测试集上召回率', result[2]) res = classifier.predict(text=testDataFile) print(res)
Fasttext 参数
The following arguments are mandatory: -input training file path -output output file path The following arguments are optional: -verbose verbosity level [2] The following arguments for the dictionary are optional: -minCount minimal number of word occurrences [1] -minCountLabel minimal number of label occurrences [0] -wordNgrams max length of word ngram [1] -bucket number of buckets [2000000] -minn min length of char ngram [0] -maxn max length of char ngram [0] -t sampling threshold [0.0001] -label labels prefix [__label__] The following arguments for training are optional: -lr learning rate [0.1] -lrUpdateRate change the rate of updates for the learning rate [100] -dim size of word vectors [100] -ws size of the context window [5] -epoch number of epochs [5] -neg number of negatives sampled [5] -loss loss function {ns, hs, softmax} [softmax] -thread number of threads [12] -pretrainedVectors pretrained word vectors for supervised learning [] -saveOutput whether output params should be saved [0] The following arguments for quantization are optional: -cutoff number of words and ngrams to retain [0] -retrain finetune embeddings if a cutoff is applied [0] -qnorm quantizing the norm separately [0] -qout quantizing the classifier [0] -dsub size of each sub-vector [2]
-
Fasttext 用新闻数据进行模型训练 训练结果库 bin 文件
2022-01-05 18:49:09Fasttext 用新闻数据进行模型训练 训练结果库 -
gru fasttext
2019-02-28 15:29:28使用双向GRU和LSTM进行FastText文本分类 # This is a script version of Meng Ye's Notebook: https://www.kaggle.com/konohayui/bi-gru-cnn-poolings/code # I'm trying to reproduce the best single public ... -
fasttext图书分类数据集
2021-08-28 18:29:44fasttext图书分类