精华内容
下载资源
问答
  • Facebook 于北京时间2019年6月25日更新FastText代码,增加了FastText.ZIP:Compressing Text Classification Models论文的模型压缩实现,论文地址https://arxiv.org/abs/1612.03651 压缩后的模型能减小到10M以内 一...

    Facebook 于北京时间2019年6月25日更新FastText代码,增加了FastText.ZIP:Compressing Text Classification Models论文的模型压缩实现,论文地址https://arxiv.org/abs/1612.03651

    压缩后的模型能减小到10M以内

    一、新版函数的变化

    1.classification text的supervisor()变为train_supervisor(),只能输入模型的学习参数以及训练集文件,去掉直接保存模型的功能

    注:词向量训练的函数也有修改,可以自行查看github代码

    旧版代码:

    新版代码:

    2.保存模型要用save_model()

    二、预测结果的改变

    旧版中预测单个文本,也必须把分词结果保存在list中, 新版可以直接单句string形式输入也可以list,同时输出标签会带有前缀“__label__”

    预测结果如下:

    输入string:(('__label__测试',), array([1.00000727]))

    或者输入list:([['__label__测试']], array([[1.00000727]]))

    二、对训练好的模型进行压缩

    import fasttext
    
    old_model_path = 'clf.model.bin'
    source_model_path = model_path
    old_model = fasttext.load_model(source_model_path)
    
    data_path = 'train.txt'
    
    '''compress'''
    print('begin compress')  #参数retrain=True的话需要输入原来的训练数据,会重新训练,模型不重新训练,还有其他参数未研究
    old_model.quantize()
    print('compress finish')
    old_model.save_model(model_path.replace('.bin', '.ftz'))
    print('save finished')
    

    压缩后文件大小:

    注意:旧版本的代码训练的模型由于与新版本不一样,要重新训练,否则load_model旧模型会报错
    ValueError: /home/mnt/ppt_project_data/ppt_fasttext_clf_files/online_model/clf_ppt.model.bin has wrong file format!

    Process finished with exit code 1

    展开全文
  • centos 下 gcc c++ 版本更新 Fasttext Glove

    千次阅读 2017-03-14 09:22:22
    在centos下更新gcc版本是一件非常痛苦的事情。这个使用Mac电脑的人感受不到,使用服务器搞项目的才懂。 在网上搜了很多资源,网上最流行的的解决方案如下链接,非常繁琐,而且运行中出了问题。简直是

    centos 默认的gcc版本为4.4.7,对于GitHub上的很多项目都没法正常编译。为了编译Glove词向量工具,遇到以下错误:因为GCC版本较低导致很多项目都不能正常编译。

    在网上搜了很多资源,网上最流行的的解决方案如下链接,非常繁琐,而且运行中出了问题。简直是要崩溃,和我其它帖子一样,觉得要以平民化最简单的方法解决这个问题,以正视听。



    在centos下更新gcc版本是一件非常痛苦的事情。这个使用Mac电脑的人感受不到,使用服务器搞项目的才懂。参考了一下链接进行了修正:

    http://www.mudbest.com/centos%e5%8d%87%e7%ba%a7gcc4-4-7%e5%8d%87%e7%ba%a7gcc4-8%e6%89%8b%e8%ae%b0/


    于是,首先借助一个非常好用的工具devtoolset-2,安装这个非常容易,见教程,很多电脑里已经有了该工具。见一下链接:

    http://blog.csdn.net/qq_14821541/article/details/52297859

    安装devtoolset-2其实就两个命令

    wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
    yum install devtoolset-2

    我的电脑已有该工具。或者采用wget命令直接下载,yum安装,该方法更容易。

    wget http://people.centos.org/tru/devtools-2/devtools-2.repo
    mv devtools-2.repo /etc/yum.repos.d
    yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++


    这样就安装好了,但是gcc -v还是显示版本号为4.4.7,需要选择默认的gcc版本,一种是使用的时候切换,但这样比较麻烦,直接把原版本覆盖掉:

    mv /usr/bin/gcc /usr/bin/gcc-4.4.7
    mv /usr/bin/g++ /usr/bin/g++-4.4.7
    mv /usr/bin/c++ /usr/bin/c++-4.4.7
    ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/gcc
    ln -s /opt/rh/devtoolset-2/root/usr/bin/c++ /usr/bin/c++
    ln -s /opt/rh/devtoolset-2/root/usr/bin/g++ /usr/bin/g++

    之后,在查看版本,输入:gcc --version或者gcc -v,发现版本已经更新,可以顺利编译。






    展开全文
  • FastText详解

    千次阅读 2020-03-08 22:50:53
    1、fastText原理及实践 https://zhuanlan.zhihu.com/p/32965521 在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练...

    词向量对比word2vec https://zhuanlan.zhihu.com/p/75391062

    0、实战经验

    word2vec vs fastText区别?

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

    word2vec vs fastText区别?

    1)都可以无监督学习词向量,fastText训练词向量时会考虑字词subword;

    2)fastText还可以进行有监督学习进行文本分类,其主要特点:结构与CBOW类似,但学习目标是人工标注的分类结果;

    3)分层Softmax的叶子结点(类别)相对w2v(所有词汇)少很多,样本中标签多的类别被分配短的搜寻路径

    • 引入字符级的N-gram特征,考虑词序特征;(一定程度上捕捉词序信息)。中文n-gram针对的是word,而不是char。对应到中文,应该对应的是分词之后的词,而不是字。英文是char字符级的n-gram、

    • 引入subword来处理长词,处理未登陆词问题,以及低频词(n-gram共享)

    • 采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径

    训练快原因:fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax

    做文本分类时,和Word2vec的CBOW有两个区别:

    1. 使用类别标签替换了中心词。

    2. 使用句子中所有单词作为输入,而不再是单单的针对滑动窗口中的单词。

     

    文本分类:深入剖析hierarchical softmax(一般利用CBOW)

    • 输入层:利用n个上下文词的one-hot编码与词向量矩阵相乘,找到每个单词的词向量

    • 投影层:将n个上下文词的词向量相加求和得到X

    • 输出层:对应一个哈夫曼树,以每个词在语料库中的频次构造出来的哈夫曼树,叶节点有V个,即词汇表的大小。非叶子节点有V-1个。

    哈夫曼树详解:每一个叶节点有对应的唯一从根节点出发路径,可用0,1进行编码,左1右0。路径上的非叶子节点都对应一个向量,该向量是参数向量,最终更新的也是该向量。

    如何确定条件概率:现有一个上下文向量X,经过未知节点之后找到正确的中心词,在找的过程中,每经过一个子节点,都要进行一次判断,看是往左走还是往右走,刚好哈夫曼树左为1右为0,即每走一步都可看作是一个二分类,总结一句话就是:上下文词找到中心词的过程就是上下文词经过多个二分类之后最终到达目标词,每一步都要进行判断。

    时间复杂度:从O(N)降到O(logN)

     

    无监督训练词向量(一般利用Skip-gram)

    使用负采样的skip-gram的基础上,将每个中心词视为子词subword的集合,并学习子词的词向量。

    举个例子,现在我们的中心词是 'where',设定子词大小为3,那么子词集合分为两个部分,注意是两个部分

    • 第一部分普通子词形如这样:  '<wh”,“whe”,“her”,“ere”,“re>'
    • 第二部分就是特殊子词,也就是整词  '<where>'
    • 那么对应到模型是,原来我的输入是 'where' 的词向量,现在在Fasttext就是所有子词的词向量的和。

    注意哦,这里是所有子词,是包含特殊子词,也就是整词的。对于背景词,直接使用整词就可以。

    简单来说,就是输入层使用子词(普通子词加上整词),输出层使用整词。

    如果遇到了OOV怎么办?使用普通子词的向量和来表示就可以。

    其实这里的子词,在名字上和文本分类文章的ngram很类似,不过,这里使用的是就char的n-gram,缓解的问题并不是语序,而是利用了词序形态的规律。对应到中文,其实就是偏旁部首。我记得阿里好像有发一个关于fasttext的中文版本,训练的就是偏旁部首。

     

    损失函数

    loss {ns, hs, softmax},负采样, 霍夫曼层次softmax,softmax

    • softmax loss简单来说,就是将神经网络的logit用softmax包裹起来,再丢到交叉熵里面去。
    • 看到知乎上说什么softmax loss是不严谨的说法。实际上,很多顶会论文大佬们都是用softmax loss作为softmax function+cross entropy loss的简称。
    • 总结一下,softmax是激活函数,交叉熵是损失函数softmax loss是使用了softmax funciton的交叉熵损失

     

    Hash解决n-gram带来的参数增多训练变慢的问题

    使用了n-gram信息之后,词表肯定是变大了的。

    比如想要n=1 or n=2 or n=3等等吧,n的取值范围越大,你的词表越大。这就会出现问题:参数越多训练越慢。

    针对这个问题,怎么解决呢?使用哈希。

    • 举个简单例子,不一定准确,"我/爱/中国/共产党",我在更新的时候,把'我','爱','中国','共产党'我们都使用同一个参数来代表(这种情况很难遇见,理解一下就好),那么在更新训练参数的时候,我只需要更新一个参数就把这个四个词都更新了,当然会快一点。
    • 但是会出现一个问题,就是精度的问题。这个过程,不知道大家有咩有想到和albert很类似。哈希这个过程我自己感觉有点共享参数的意思。
    • 为了节省空间,fastText在原作者的实现中并不是每一个n-gram都学习一个单独的embedding,而是首先将n-gram进行hash,hash到同一个位置的多个n-gram是会共享一个embedding的

    1、fastText原理

    https://zhuanlan.zhihu.com/p/32965521

    FastText是将句子中的每个词通过一个lookup层映射成词向量,对词向量叠加取平均作为句子的向量,然后直接用线性分类器进行分类,FastText中没有非线性的隐藏层,结构相对简单而且模型训练的更快。

    在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练10亿词级别语料库的词向量在10分钟之内,能够分类有着30万多类别的50多万句子在1分钟之内。

    1.1、预备知识

    1. Softmax回归:又被称作多项逻辑回归(multinomial logistic regression),它是逻辑回归在处理多类别任务上的推广
    2. 分层Softmax:树的结构是根据类标的频数构造的霍夫曼树
    3. n-gram特征
    4. word2vec:CBOW模型架构和fastText模型非常相似

    二、fasttext分类

    注意,一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型,这另当别论。

    (1)字符级别的n-gram

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

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

    “<ap”, “app”, “ppl”, “ple”, “le>”

    其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。

    这带来两点好处

    1. 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享

    2. 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。

    (2)模型架构

    输入是一句话,x1到xn就是这句话的单词或者是n-gram。每一个都对应一个向量,然后对这些向量取平均就得到了文本向量,然后用这个平均向量取预测标签。当类别不多的时候,最简单的softmax;当标签数量巨大的时候,要用到hierarchical softmax。

    论文中的两个tricks:

    • hierarchical softmax:类别数较多时,通过构建一个霍夫曼编码树来加速softmax layer的计算,和之前word2vec中的trick相同
    • N-gram features: 只用unigram的话会丢掉word order信息,所以通过加入N-gram features进行补充,用hashing来减少N-gram的存储

    但是也有人指出论文中选取的数据集都是对句子词序不是很敏感的数据集,所以得到文中的试验结果并不奇怪。

    fasttext vs CBOW

    • 和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均
    • 不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标

    值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间。

    (3)核心思想

    仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器,分类器的输入是一个用来表征当前文档的向量;

    模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量。那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均。叠加词向量背后的思想就是传统的词袋法,即将文档看成一个由词构成的集合。

    于是fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类

    这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类

    (4)分类效果

    为何fastText的分类效果常常不输于传统的非线性分类器?

    假设我们有两段文本:    我 来到 达观数据  ;俺 去了 达而观信息科技    

    这两段文本意思几乎一模一样,如果要分类,肯定要分到同一个类中去。但在传统的分类器中,用来表征这两段文本的向量可能差距非常大。传统的文本分类中,你需要计算出每个词的权重,比如tfidf值, “我”和“俺” 算出的tfidf值相差可能会比较大,其它词类似,于是,VSM(向量空间模型)中用来表征这两段文本的文本向量差别可能比较大。

    但是fastText就不一样了,它是用单词的embedding叠加获得的文档向量,词向量的重要特点就是向量的距离可以用来衡量单词间的语义相似程度,于是,在fastText模型中,这两段文本的向量应该是非常相似的,于是,它们很大概率会被分到同一个类中。

    使用词embedding而非词本身作为特征,这是fastText效果好的一个原因;另一个原因就是字符级n-gram特征的引入对分类效果会有一些提升 。

    (5)embedding

    fastText单词的embedding跟常见的embedding方法没什么不同,都是先随机初始化,然后再通过反向传播学习参数,维度就是人工指定的一个超参数,是词向量的维度。

    embedding并不是输入,是fastText需要学习的隐层参数

    不过有两点要注意的地方,第一是如果你说的fastText的embedding是通过supervised的方式来训练一个文本分类器并同时学习embedding的话,那么这个embedding的学习过程就是有监督的,与word2vec等无监督的模型是有一定区别的;

    第二是fastText还会学习n-gram(这里的n-gram其实有两种,分别是char-n-gram和word-n-gram)的embedding,这使得它可以在一定程度上捕捉词序信息。为了节省空间,fastText在原作者的实现中并不是每一个n-gram都学习一个单独的embedding,而是首先将n-gram进行hash,hash到同一个位置的多个n-gram是会共享一个embedding的

     

    展开全文
  • 初识 fastText

    千次阅读 2020-05-13 18:20:24
    参考资料: ... ... FastText API 文档 & 参数说明 https://blog.csdn.net/qq_32023541/article/details/80845913 https://blog.csdn.net/princemrgao/art...

    参考资料:

    https://blog.csdn.net/feilong_csdn/article/details/88655927 

    https://blog.csdn.net/qq_16633405/article/details/80578431

    FastText   API 文档 & 参数说明

    https://blog.csdn.net/qq_32023541/article/details/80845913

    https://blog.csdn.net/princemrgao/article/details/94600844

    一、概要

    1.1 什么是FastText

    fastText是一个用于文本分类和词向量表示的库,它能够把文本转化成连续的向量然后用于后续具体的语言任务

    特点就是fast。相对于其它文本分类模型,如SVM,Logistic Regression和neural network等模型,fastText在保持分类效果的同时,大大缩短了训练时间。

    1.2 FastText优缺点

    1. 适合大型数据+高效的训练速度:能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”
    2. 支持多语言表达:利用其语言形态结构,fastText能够被设计用来支持包括英语、德语、西班牙语、法语以及捷克语等多种语言。FastText的性能要比时下流行的word2vec工具明显好上不少,也比其他目前最先进的词态词汇表征要好。
    3. fastText专注于文本分类,在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。

    二、FastText原理

    fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。

    1. fastText 模型输入一个词的序列(一段文本或者一句话)输出这个词序列属于不同类别的概率。
    2. 序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间(隐藏)层,中间层再映射到标签。
    3. fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
    4. fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。

    2.1 第一部分:模型架构

    fastText的模型架构类似于CBOW,两种模型都是基于Hierarchical Softmax,都是三层架构:输入层、 隐藏层、输出层。

                                                                                                 CBOW架构

                                                                                                    fastText 

     其中x1,x2,…,xN−1,xN表示一个文本中的n-gram向量,每个特征是词向量的平均值。

    2.2 第二部分:层次 Softmax

    word2vec将上下文关系转化为多分类任务,进而训练逻辑回归模型,这里的类别数量|V|词库大小。通常的文本数据中,词库少则数万,多则百万,在训练中直接训练多分类逻辑回归并不现实。word2vec中提供了两种针对大规模多分类问题的优化手段, negative sampling hierarchical softmax。在优化中,

    • negative sampling 只更新少量负面类,从而减轻了计算量。
    • hierarchical softmax 将词库表示成前缀树,从树根到叶子的路径可以表示为一系列二分类器,一次多分类计算的复杂度从|V|降低到了树的高度

    标准softmax:

    softmax函数常在神经网络输出层充当激活函数,目的就是将输出层的值归一化到0-1区间,将神经元输出构造成概率分布,主要就是起到将神经元输出值进行归一化的作用

    层次softmax:

    计算一个类别的softmax概率时,我们需要对所有类别概率做归一化,在这类别很大情况下非常耗时,因此提出了分层softmax(Hierarchical Softmax),思想是根据类别的频率构造哈夫曼树来代替标准softmax,通过分层softmax可以将复杂度从N降低到logN,下图给出分层softmax示例:

    在这里插入图片描述

    将输入层中的词和词组构成特征向量,再将特征向量通过线性变换映射到隐藏层,隐藏层通过求解最大似然函数,然后根据每个类别的权重和模型参数构建Huffman树,将Huffman树作为输出。

    在层次softmax模型中,叶子结点的词没有直接输出的向量,而非叶子节点都有响应的输出在模型的训练过程中,通过Huffman编码,构造了一颗庞大的Huffman树,同时会给非叶子结点赋予向量。我们要计算的是目标词w的概率,这个概率的具体含义,是指从root结点开始随机走,走到目标词w的概率。因此在途中路过非叶子结点(包括root)时,需要分别知道往左走和往右走的概率。

    以上图中目标词为w2为例,在这里插入图片描述

     

     

    到这里可以看出目标词为w的概率可以表示为:在这里插入图片描述

     

     

    其中θn(w,j)是非叶子结点n(w,j)的向量表示(即输出向量);h是隐藏层的输出值,从输入词的向量中计算得来;sign(x,j)是一个特殊函数定义

    在这里插入图片描述

    此外,所有词的概率和为1,即在这里插入图片描述

    最终得到参数更新公式为:在这里插入图片描述

    疑问:

    计算每一条路径的时间复杂度是O(logD),要比O(D)低很多,但是普通的softmax是一下子把所有的词的打分都算出来了,而层次softmax只是算出来一条路径的概率,还有其他的词的概率需要再一次计算,虽然每一条路径的时间复杂度低,但是要计算所有的路径,如何比较计算多次与计算一次谁的用时少呢?

    首先,的确是普通的softmax一次就把需要的所有词的打分就计算出来了,在进行归一化时不用反复计算,层次softmax需要每条路径都计算一次,但是即使这样,层次softmax也比普通的softmax计算量少。

    输出层是层次softmax,构建的霍夫曼树如题所示,现在要让输出层输出字典中所有词的概率分布,就要计算每个词的概率,每个词对应的是图中的叶节点,现在假设求出了‘足球’这个词的概率,求这个词概率的时间复杂度是 O(logD),那其他词的概率怎么求呢?需要一一计算每一条路径吗?事实上,当我们求出‘足球’这个词的概率之后,与红线相连的父节点的另一条分支的概率也求出来了,不需要再重新计算。

    最后不知道概率的分支只有权值为14的父节点对应的两个叶节点,只需要求出他们其中一个的概率就可以把所有的叶节点的概率求出来,而求14对应的概率的时间复杂度 O(剩余分支时间复杂度)<=O(logD),所以,求出所有叶节点的概率的时间复杂度是O(logD)+O(剩余分支时间复杂度),根据时间复杂度的定义,时间复杂度相加的结果是几个加数的最大值,所以层次softmax的总的时间复杂度仍然是O(logD)。

    参考: https://blog.csdn.net/itplus/article/details/37969979

    2.3 第三部分:N-gram 特征

    常用的特征是词袋模型(将输入数据转化为对应的Bow形式)。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。n-gram是基于语言模型的算法,基本思想是将文本内容按照子节顺序进行大小为N的窗口滑动操作,最终形成窗口为N的字节片段序列。而且需要额外注意一点是n-gram可以根据粒度不同有不同的含义,有字粒度的n-gram和词粒度的n-gram。

    “我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram。

    同时n-gram也可以在字符级别工作,例如对单个单词matter来说,假设采用3-gram特征,那么matter可以表示成图中五个3-gram特征,这五个特征都有各自的词向量,五个特征的词向量和即为matter这个词的向其中“<”和“>”是作为边界符号被添加,来将一个单词的ngrams与单词本身区分开来:

    在这里插入图片描述

    使用n-gram有如下优点
    1、为罕见的单词生成更好的单词向量:根据上面的字符级别的n-gram来说,即是这个单词出现的次数很少,但是组成单词的字符和其他单词有共享的部分,因此这一点可以优化生成的单词向量
    2、在词汇单词中,即使单词没有出现在训练语料库中,仍然可以从字符级n-gram中构造单词的词向量
    3、n-gram可以让模型学习到局部单词顺序的部分信息, 如果不考虑n-gram则便是取每个单词,这样无法考虑到词序所包含的信息,即也可理解为上下文信息,因此通过n-gram的方式关联相邻的几个词,这样会让模型在训练的时候保持词序信息

    三、fastText教程-单词表示词向量

    1、获取数据

    2、训练词向量 

    $ mkdir result
    $ ./fasttext skipgram -input data/fil9 -output result/fil9
    

    分解上述命令:./fasttext使用skipgram模型调用二进制fastText可执行文件,当然也可以使用cbow模型,-input表示输入数据路径,-output表示训练的词向量模型所在路径,当fastText运行时,屏幕会显示进度和估计的完成时间,程序完成后,结果目录应该出现如下两个文件,可通过下面命令查看:

    $ ls -l result
    -rw-r-r-- 1 bojanowski 1876110778 978480850 Dec 20 11:01 fil9.bin
    -rw-r-r-- 1 bojanowski 1876110778 190004182 Dec 20 11:01 fil9.vec
    

    fil9.bin文件是一个二进制文件,它存储了整个fastText模型,随后可以进行加载,fil9.vec文件是一个包含单词向量的文本文件,每一行对应词汇表中的每个单词,可通过如下命令查看fil9.vec中的信息

    $ head -n 4 result/fil9.vec
    218316 100
    the -0.10363 -0.063669 0.032436 -0.040798 0.53749 0.00097867 0.10083 0.24829 ...
    of -0.0083724 0.0059414 -0.046618 -0.072735 0.83007 0.038895 -0.13634 0.60063 ...
    one 0.32731 0.044409 -0.46484 0.14716 0.7431 0.24684 -0.11301 0.51721 0.73262 ...
    

    从上面结果可见,第一行显示的是单词向量和向量维度,接下来几行是词汇表中所有单词的单词向量,顺序是按照频率降低的顺序进行排序

    3、模型参数调优

    1、模型中最重要的两个参数是:词向量大小维度、subwords范围的大小

    • 词向量维度越大,便能获得更多的信息但同时也需要更多的训练数据,同时如果它们过大,模型也就更难训练速度更慢,默认情况下使用的是100维的向量,但在100-300维都是常用到的调参范围。
    • subwords是一个单词序列中包含最小(minn)到最大(maxn)之间的所有字符串(也即是n-grams),默认情况下我们接受3-6个字符串中间的所有子单词,但不同的语言可能有不同的合适范围
    $ ./fasttext skipgram -input data/fil9 -output result/fil9 -minn 2 -maxn 5 -dim 300
    

    2、另外两个参数epoch、learning rate

    • epoch根据训练数据量的不同,可以进行更改,epoch参数即是控制训练时在数据集上循环的次数,默认情况下在数据集上循环5次,但当数据集非常大时,我们也可以适当减少训练的次数
    • 另一个参数学习率,学习率越高模型收敛的速度就越快,但存在对数据集过度拟合的风险,默认值时0.05,这是一个很好的折中,当然在训练过程中,也可以对其进行调参,可调范围是[0.01, 1],下面命令便尝试对这两个参数进行调整:
    $ ./fasttext skipgram -input data/fil9 -output result/fil9 -epoch 1 -lr 0.5
    

    3、最后fastText是多线程的,默认情况下使用12个线程,如果你的机器只有更少的CPU核数,也可以通过如下参数对使用的CPU核数进行调整

    $ ./fasttext skipgram -input data/fil9 -output result/fil9 -thread 4

    四、FastText词向量与word2vec对比

    FastText= word2vec中 cbow + h-softmax的灵活使用

    灵活体现在两个方面:

    • 模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是分类的label。不过不管输出层对应的是什么内容,其对应的vector都不会被保留和使用;
    • 模型的输入层:word2vec的输入层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;

    两者本质的不同,体现在 h-softmax的使用。

    Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。

    fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。

    五、常见问题

    3、模型中使用单词短语而不是单个单词最佳方式是什么

    目前使用单词短语或句子最好的方式是使用词向量的bow(bag of words),另一种方式例如New York,我们可以将其处理成New_York也会有帮助

    4、为什么fastText甚至可以为语料库中未出现的单词产生词向量

    fastText一个重要的特性便是有能力为任何单词产生词向量,即使是未出现的,组装的单词。主要是因为fastText是通过包含在单词中的子字符substring of character来构建单词的词向量,正文中也有论述,因此这种训练模型的方式使得fastText可以为拼写错误的单词或者连接组装的单词产生词向量

    8、可以在连续的数据集上使用fastText吗 

    不可以,fastText仅仅是用于离散的数据集,因此无法直接在连续的数据集上使用,但是可以将连续的数据离散化后使用fastText

    12、如何完全重现fastText的运行结果,为什么每次运行的结果都有些差异

    当多次运行fastText时,因为优化算法异步随机梯度下降算法或Hogwild,所以每次得到的结果都会略有不同,如果想要fastText运行结果复现,则必须将参数thread设置为1,这样你就可以在每次运行时获得完成相同的性能

    展开全文
  • fasttext 训练

    2020-04-10 16:59:49
    fasttext 训练 下载fasttext编译 和安装使用fasttext变换数据使用和测试 下载fasttext 官网: https://github.com/facebookresearch/fastText 编译 和安装 wget ...
  • models.fasttext - FastText模型

    千次阅读 2019-04-09 15:15:40
    通过Fasttext学习单词表示:使用子词信息丰富单词向量。 该模块允许从训练语料库中训练单词嵌入,并具有获得词汇外单词的单词向量的附加能力。 该模块包含带有Python接口的Fasttext的快速本机C实现。这是不是只是...
  • fasttext使用笔记

    2021-03-17 00:49:34
    http://blog.csdn.net/m0_37306360/article/details/72832606这里记录使用fastText训练word vector笔记下载到本机:$ gitclone https://github.com/facebookresearch/fastText.git$ cdfastText$ makeMake报错:原因...
  • fasttext源码解析

    千次阅读 2019-06-23 16:32:35
    转载自知乎 作者:张晓辉 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明...最近花了一些时间通读了fb的fasttext的源码。远离了c++好长一段时间,猛地一看c++,太亲切了。简单的说,f...
  • fasttext整体介绍

    2019-11-28 18:36:24
    Word2vec, Fasttext, Glove, Elmo, Bert, Flair pre-train Word Embedding源码+数据Github网址: 词向量预训练实现Github fastText原理篇 一、fastText简介 fastText是一个快速文本分类算法,与基于神经网络的分类...
  • fastText算法

    2019-12-20 19:21:24
    1.1:fastText背景 fasttext是facebook开源的一个词向量与文本分类工具,在2016年开源,典型应用场景是“带监督的文本分类问题”。提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。 ...
  • FastText 2种方式: windows10系统安装gensim即可 pip install gensim 1. gensim (1) 可用于训练词向量 (2) 可找出相似的词向量 from gensim.models import FastText # data_token为分词 可运用自己的语料库 data_...
  • FastText学习笔记

    万次阅读 多人点赞 2018-08-07 22:18:00
    了解fasttext 使用fasttext进行分类 分类问题 首先介绍分类问题,以二分类问题为例。目前具有人工标注的数据集,数据集分为2类标签,正例和反例。数据示例如下: 正例: 印度药企对中国市场充满期待 反例: 中国...
  • liunx版本下操作:$ git clone ...安装成功后的导入:新建test.py文件,写入:import fastText.FastText as fasttext(可能会瞟红线)新增:最近发现fasttext的github更新了,引入方式发生了...
  • fasttext简介

    千次阅读 2018-04-29 10:50:38
    fasttext的基础理论 前言简介 fasttext是NLP里,一个非常高效的,基于词向量化的,用于文本分类的模型。虽然其原理比较简单,但是其中涉及到了不少的用于提速和准确率的小技巧。 这篇文章主要从理论的层面...
  • FastText的内部机制

    千次阅读 2018-07-17 18:55:58
    fasttext是一个被用于对词向量和句子分类进行高效学习训练的工具库,采用c++编写,并支持训练过程中的多进程处理。你可以使用这个工具在监督和非监督情况下训练单词和句子的向量表示。这些训练出来的词向量,可以...
  • fasttext(1) -- 认识 fasttext 和 初步使用

    千次阅读 2018-06-28 11:18:36
    fastText 的 Python接口:https://github.com/salestock/fastText.py (1) fasttext 简介: FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度...
  • 上一篇文章中,我们对fastText的原理进行了介绍,fastText原理篇,接下来我们进行代码实战,本文中使用fastText对新闻文本数据进行文本分类。 fasttext是facebook开源的一个词向量与文本分类工具,在学术上没有太多...
  • glove/word2vec/fasttext目前词向量比较通用的三种方式,之前三款词向量的原始训练过程还是挺繁琐的,这边笔者列举一下再自己使用过程中快速训练的方式。 其中,word2vec可见:python︱gensim训练word2vec及相关...
  • fasttext

    2021-03-21 11:43:42
    FastText之train_supervised参数说明: input_file 训练文件路径(必须) model skipgram或者CBOW default skipgram lr 学习率 default 0.1 dim 词向量维度 default 100 ws 上下文窗口大小 default 5 epoch epochs ...
  • 一、整体结构 fastText的代码整体结构如下图所示: 1、fastText简介 ...2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText两个重要的优化:Hierarchical Softmax、N-gr...
  • fastText(更新中...)

    2018-06-09 20:30:05
    nlp中的卷积神经网络分类问题(更新中…) 当谈到nlp相关处理模型的时候,可能你会随口说出多个模型,但是这些模型都离不开基础的“配件”,那就是RNN、LSTM、GRU,但是对于很多问题,原来用于图像处理的CNN表现效果...
  • fastText(二):微博短文本下fastText的应用(一)

    千次阅读 热门讨论 2018-08-21 15:05:13
    针对这一问题,这里分享一下fastText在微博短文本的应用。 任务目标 简单介绍一下整个任务的目标:给微博内容打上标签,例如美妆、宠物用品等。这类问题可以转化为经典的多分类问题。然而微博内容较短,并且文字...
  • fastText的原理剖析

    2021-02-20 00:25:51
    fastText的原理剖析 目标 能够说出fasttext的架构 能够说出fasttext速度快的原因 能够说出fastText中层次化的softmax是如何实现的 1. fastText的模型架构 fastText的架构非常简单,有三层:输入层、隐含层、输出层...
  • fastText模型

    2021-08-27 11:18:34
    文章目录目标一、fastText的模型架构1. N-gram的理解1.1 bag of word2. fastTex模型中层次化的softmax2.1 哈夫曼树和哈夫曼编码2.1.1 哈夫曼树的定义2.1.2 哈夫曼树的相关概念2.1.3 哈夫曼树的构造算法2.1.3 哈夫曼...
  • fasttext文本分类

    2019-10-27 09:44:20
    前几天为了实现文本分类,看了不少博客文章之类的,就fasttext还算稍微能看懂,代码也最终能跑得起来,但是好多博客的代码都是更新之前的了,会报错,找坑填坑一路爬出来,总算跑通了,发出来做个记录吧。...
  • FastText算法

    2019-06-22 18:23:00
    转载自:... 0. 目录 ...2. FastText原理 2.1 模型架构 2.2 层次SoftMax 2.3 N-gram子词特征 3. fastText和word2vec的区别 4. 总结 1. 前言 自然语言处理(NLP)是机器学...
  • fasttext作为NPL领域中机器学习的优秀范例值得研究。模型架构我对fasttext模型架构理解与CBOW很像。在训练时,通过N-gram把词向量喂入模型,输出属于各类的概率,并比对标签修正模型在预测时,输入的是词序列,输出...
  • NLP模型——FastText

    2019-05-22 20:47:42
    FastText一、预备知识1.1 Softmax 回归1.2 分层Softmax1.3 n-gram特征二、word2vec三、FastText 原理四、FastText 实战 fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新。...
  • 本系列分为四部分,这篇文章是本系列第三篇,在...现在保持每周更新的频率,内容都是机器学习相关内容和读一些论文的笔记,欢迎一起讨论学习~ fastText 是 facebook 开源的一个词向量计算以及文本分类工具,fa...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,736
精华内容 694
关键字:

更新fasttext