fasttext 训练数据的训练模型每次都要全量训练吗

2370人阅读
机器学习(56)
今天早上在地铁上看到知乎上看到有人使用fasttext进行文本分类,到公司试了下情况在GitHub上找了下,最开始是c++版本的实现,不过有java、python版本的实现了,正好拿下来试试手,
python情况:
python版本参考,作者提供了详细的实现,并且提供了中文分词之后的数据,正好拿下来用用,感谢作者,代码提供的数据作者都提供了,点后链接在上面有百度盘,可下载,java接口用到的数据也一样:
http://blog.csdn.net/lxg0807/article/details/
import logging
import fasttext
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', )
#classifier = fasttext.supervised(&fasttext/news_fasttext_train.txt&,&fasttext/news_fasttext.model&,label_prefix=&__label__&)
#load训练好的模型
classifier = fasttext.load_model('fasttext/news_fasttext.model.bin', label_prefix='__label__')
result = classifier.test(&fasttext/news_fasttext_test.txt&)
print(result.precision)
print(result.recall)
labels_right = []
texts = []
with open(&fasttext/news_fasttext_test.txt&) as fr:
lines = fr.readlines()
for line in lines:
labels_right.append(line.split(&\t&)[1].rstrip().replace(&__label__&,&&))
texts.append(line.split(&\t&)[0])
print labels
print texts
labels_predict = [e[0] for e in classifier.predict(texts)] #预测输出结果为二维形式
# print labels_predict
text_labels = list(set(labels_right))
text_predict_labels = list(set(labels_predict))
print(text_predict_labels)
print(text_labels)
A = dict.fromkeys(text_labels,0)
#预测正确的各个类的数目
B = dict.fromkeys(text_labels,0)
#测试数据集中各个类的数目
C = dict.fromkeys(text_predict_labels,0) #预测结果中各个类的数目
for i in range(0,len(labels_right)):
B[labels_right[i]] += 1
C[labels_predict[i]] += 1
if labels_right[i] == labels_predict[i]:
A[labels_right[i]] += 1
#计算准确率,召回率,F值
for key in B:
p = float(A[key]) / float(B[key])
r = float(A[key]) / float(C[key])
f = p * r * 2 / (p + r)
print (&%s:\tp:%f\t%fr:\t%f& % (key,p,r,f))
java版本情况:
githup上下载地址:
/ivanhk/fastText_java
看了下sh脚本的使用方法,自己简单些了个text的方法,正好用用,后面会拿xgboost进行对比,看看效果,效果可以的写成service进行上线:
import java.util.L
import fasttext.FastT
import fasttext.M
import fasttext.P
public class Test {
public static void main(String[] args) throws Exception {
String[] text = {
&supervised&,
&/Users/shuubiasahi/Documents/python/fasttext/news_fasttext_train.txt&,
&-output&, &/Users/shuubiasahi/Documents/faste.model&, &-dim&,
&10&, &-lr&, &0.1&, &-wordNgrams&, &2&, &-minCount&, &1&,
&-bucket&, &&, &-epoch&, &5&, &-thread&, &4& };
Main op = new Main();
op.train(text);
FastText fasttext = new FastText();
String[] test = { &就读&, &科技&, &学生& ,&学生&,&学生&};
fasttext.loadModel(&/Users/shuubiasahi/Documents/faste.model.bin&);
List&Pair&Float, String&& list = fasttext.predict(test, 6);
//得到最大可能的六个预测概率
for (Pair&Float, String& parir : list) {
System.out.println(&key is:& + parir.getKey() + &
value is:&
+ parir.getValue());
System.out.println(Math.exp(list.get(0).getKey()));
//得到最大预测概率
这里设置bucket不适用设置过大,过大会产生OOM,而且模型保存太大,上面的设置模型保存就有1个g,-wordNgrams可以设置为2比设置为1能提高模型分类的准确性,
key is:0.0 & value is:__label__edu
key is:-17.75125 & value is:__label__affairs
key is:-17.75125 & value is:__label__economic
key is:-17.75125 & value is:__label__ent
key is:-17.75125 & value is:__label__fashion
key is:-17.75125 & value is:__label__game
注意fasttext对输入格式有要求,label标签使用 &“__label__”+实际标签的形式, & over
有问题联系我
& 我的模型已经上线了 & &效果还不错 &&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:197122次
积分:3723
积分:3723
排名:第9075名
原创:174篇
转载:10篇
评论:47条
(2)(8)(2)(6)(8)(10)(1)(2)(1)(6)(2)(1)(1)(3)(6)(9)(26)(91)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'带监督的文本分类算法FastText
该算法由facebook在2016年开源,典型应用场景是“带监督的文本分类问题”。
模型的优化目标如下:
其中,$&x_n,y_n&$是一条训练样本,$y_n$是训练目标,$x_n$是normalized bag of features。矩阵参数A是基于word的look-up table,也就是A是词的embedding向量。
$Ax_n$矩阵运算的数学意义是将word的embedding向量找到后相加或者取平均,得到hidden向量。
矩阵参数B是函数f的参数,函数f是一个多分类问题,所以$f(BAx_n)$是一个多分类的线性函数。优化目标是使的这个多分类问题的似然越大越好。
将优化目标表示为图模型如下:
与word2vec的区别
这个模型与word2vec有很多相似的地方,也有很多不相似的地方。相似地方让这两种算法不同的地方让这两
相似的地方:
图模型结构很像,都是采用embedding向量的形式,得到word的隐向量表达。
都采用很多相似的优化方法,比如使用Hierarchical softmax优化训练和预测中的打分速度。
不同的地方:
word2vec是一个无监督算法,而fasttext是一个有监督算法。word2vec的学习目标是skip的word,而fasttext的学习目标是人工标注的分类结果。
word2vec要求训练样本带有“序”的属性,而fasttext使用的是bag of words的思想,使用的是n-gram的无序属性。
V.S. 深度神经网络
fasttext只有1层神经网络,属于所谓的shallow learning,但是fasttext的效果并不差,而且具备学习和预测速度快的优势,在工业界这点非常重要。
比一般的神经网络模型的精确度还要高。
训练和评估速度快几百倍。10分钟内就可以在一台多核CPU训练10亿词汇。1分种内完成100万句子在31万中类型中的分类。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
专注于开发者的付费技术问答平台!
专注于开发者的付费技术问答平台!
今日搜狐热点FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的
fastText 文本分类(paper:),
另一部分是词嵌入学习(paper:(使用子字信息丰富词汇向量))。
按论文来说只有文本分类部分才是 fastText,但也有人把这两部分合在一起称为
fastText。笔者,在这即认为词嵌入学习属于FastText项目。
github链接:
高级词向量三部曲:
4、其他NLP词表示方法paper:
一、FastText架构
本节内容参考自:
1、开源中国社区 [
2、雷锋网文章:《》
1、fastText 架构原理
fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。
fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。
2、改善运算效率——softmax层级
对于有大量类别的数据集,fastText使用了一个分层分类器(而非扁平式架构)。不同的类别被整合进树形结构中(想象下二叉树而非 list)。在某些文本分类任务中类别很多,计算线性分类器的复杂度高。为了改善运行时间,fastText 模型使用了层次 Softmax 技巧。层次 Softmax 技巧建立在哈弗曼编码的基础上,对标签进行编码,能够极大地缩小模型预测目标的数量。(参考)
考虑到线性以及多种类别的对数模型,这大大减少了训练复杂性和测试文本分类器的时间。fastText 也利用了类别(class)不均衡这个事实(一些类别出现次数比其他的更多),通过使用 Huffman 算法建立用于表征类别的树形结构。因此,频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高。
二、FastText的词向量表征
1、FastText的N-gram特征
常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。
“我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。
如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram。
在 fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。
举例来说:fastText能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在fastText生成的文档中进行查找并且理解用户想要问的是有关女性的问题。
2、FastText词向量优势
(1)适合大型数据+高效的训练速度:能够训练模型“在使用标准多核CPU的情况下10分钟内处理超过10亿个词汇”,特别是与深度模型对比,fastText能将训练时间由数天缩短到几秒钟。使用一个标准多核 CPU,得到了在10分钟内训练完超过10亿词汇量模型的结果。此外, fastText还能在五分钟内将50万个句子分成超过30万个类别。
(2)支持多语言表达:利用其语言形态结构,fastText能够被设计用来支持包括英语、德语、西班牙语、法语以及捷克语等多种语言。它还使用了一种简单高效的纳入子字信息的方式,在用于像捷克语这样词态丰富的语言时,这种方式表现得非常好,这也证明了精心设计的字符 n-gram 特征是丰富词汇表征的重要来源。FastText的性能要比时下流行的word2vec工具明显好上不少,也比其他目前最先进的词态词汇表征要好。
(3)fastText专注于文本分类,在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。FastText与基于深度学习方法的Char-CNN以及VDCNN对比:
(4)比word2vec更考虑了相似性,比如 fastText 的词嵌入学习能够考虑 english-born 和 british-born 之间有相同的后缀,但 word2vec 却不能(具体参考)。
3、FastText词向量与word2vec对比
本节来源于博客:
FastText= word2vec中 cbow + h-softmax的灵活使用
灵活体现在两个方面:
1. 模型的输出层:word2vec的输出层,对应的是每一个term,计算某term的概率最大;而fasttext的输出层对应的是 分类的label。不过不管输出层对应的是什么内容,起对应的vector都不会被保留和使用;
2. 模型的输入层:word2vec的输出层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;
两者本质的不同,体现在 h-softmax的使用。
Wordvec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。
fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)
相关文章:
三、FastText实现
github链接:
fastText基于Mac OS或者Linux系统构筑,使用 C++11 的特性。需要python 2.6 或者更高版本支持,以及numpy & scipy等软件支持。
FastText默认参数:
$ ./fasttext supervised
Empty input or output path.
The following arguments are mandatory:
training file path
output file path
The following arguments are optional:
learning rate [0.1]
-lrUpdateRate
change the rate of updates for the learning rate [100]
size of word vectors [100]
size of the context window [5]
number of epochs [5]
minimal number of word occurences [1]
-minCountLabel
minimal number of label occurences [0]
number of negatives sampled [5]
-wordNgrams
max length of word ngram [1]
loss function {ns, hs, softmax} [ns]
number of buckets [2000000]
min length of char ngram [0]
max length of char ngram [0]
number of threads [12]
sampling threshold [0.0001]
labels prefix [__label__]
verbosity level [2]
-pretrainedVectors
pretrained word vectors for supervised learning []
Mikolov 在 fastTetxt 的论文中报告了两个实验,其中一个实验和 Tagspace 模型进行对比。实验是在 YFCC100M 数据集上进行的, YFCC100M 数据集包含将近 1 亿张图片以及摘要、标题和标签。实验使用摘要和标题去预测标签。Tagspace 模型是建立在 Wsabie 模型的基础上的。Wsabie 模型除了利用 CNN 抽取特征之外,还提出了一个带权近似配对排序 (Weighted Approximate-Rank Pairwise, WARP) 损失函数用于处理预测目标数量巨大的问题。
上面就是实验结果,从实验结果来看 fastText 能够取得比 Tagspace 好的效果,并拥有无以伦比的训练测试速度。但严格来说,这个实验对 Tagspace 有些不公平。YFCC100M 数据集是关于多标记分类的,即需要模型能从多个类别里预测出多个类。Tagspace 确实是做多标记分类的;但 fastText 只能做多类别分类,从多个类别里预测出一个类。而评价指标 prec@1 只评价一个预测结果,刚好能够评价多类别分类。
YFCC100M 数据:
延伸一:重磅:facebook公开了90种语言的Pre-trained word vectors
可怕的facebook,用fasttext进行训练,使用默认参数,300维度
本文已收录于以下专栏:
相关文章推荐
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单、高效,因此引起了很多人的关注。由于 word2vec 的作者 Tomas Miko...
如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错。
其是通过Robust Ranking来进行词向量定义。
测试facebook开源的基于深度学习的对文本分类的fastText模型
fasttext python包的安装:pip install fasttext第一步获取分类文本,文本直接用的清华大学的新...
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单、高效,因此引起了很多人的关注。由于 word2vec 的作者 Tomas Miko...
前言好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RNN...
PaddlePaddle出教程啦,教程一部分写的很详细,值得学习。
一期涉及新手入门、识别数字、图像分类、词向量、情感分析、语义角色标注、机器翻译、个性化推荐。
二期会有更多的图像内容。
1. Recurrent Neural Network (RNN)
尽管从多层感知器(MLP)到循环神经网络(RNN)的扩展看起来微不足道,但是这对于序列的学习具有深远的意义。循环神经网络(RN...
@author: huangyongye
@creat_date:
reference:
- [1] 【中文分词系列】 4. 基于双向LSTM的seq2seq字标注 ...
__Q__ 郑重声明:用户如收中奖消息请立即拨打总部活动颁奖电话【 一5407 】向{王经理}索取卡号办理领取! 办理成功后,确认无误后 {王经理}将2-3分钟内把您的奖金转 ...
原论文下载地址:https://arxiv.org/pdf/v1论文摘要本文百度出品。使用双向LSTM+CRFs 模型用于NLP序列标注问题(POS、分块、命名实体识别)。作者认为...
他的最新文章
讲师:姜飞俊
讲师:汪木铃
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)哪种词向量模型更胜一筹?Word2VecWordRankorFastText? - 推酷
哪种词向量模型更胜一筹?Word2VecWordRankorFastText?
更多深度文章,请关注云计算频道:
作者介绍 :
Parul Sethi,undergrad of Maths and IT at CIC, University of Delhi. RaRe Incubator Student.
在众多词嵌入(有的也称作词向量)模型中选择一个合适的模型是很困难的任务,是选择NLP常用的Word2Vec还是其他模型?
如图1所示,用WordRank,Word2Vec和FastText三种模型分别找出与“king”最相似的词语,WordRank的结果更加倾向于“king”这个词本身的属性或者和“king”同时出现最多的词,而Word2Vec的结果多是和“king”出现在相似的上下文。
图1. WordRank, Word2Vec和FastText三种模型输出与&king&最相似的词
不同模型实验结果对比
图2. 三种模型实验结果对比
实验对比数据集:
1.使用Google类比数据集进行词类比实验,包含19K词类比问题,包含语义和语法类比;
2.使用SimLex-999和WS-353数据集进行词相似度实验,参考
& & & 从上表可以看出, 每种模型用于不同任务时其效果表现出显著差异 。 如FastText在语法类比任务中效果最好,WordRank在语义类比任务中效果最好。 其原因在于,FastText引入词的形态学信息,而WordRank则是把寻找最相似词形式化为一个排序问题。即,给定词 w , WordRank输出一个序列化列表,将和词 w 共同出现最多的词排在列表前面。在词的相似度方面,Word2Vec在Simlex-999测试数据上表现效果更好,而wordrank在ws-353上表现更好。出现这些不同的结果可能是因为数据集使用了不同角度下的相似度,图1中三种模型输出&king&的最相似词的对比也说明了这些词嵌入模型对相似度理解方式的不同。
可视化比较
在使用TensorBoard对这三种词嵌入模型的结果进行可视化处理后,得出的结论和最开始三种模型的输出结果相似。TensorBoard使用PCA或者t-SNE方法将原始多维词向量降维至2维或者3维,原始词向量的信息会丢失一些,词之间的余弦相似度/距离会有所改变,但仍然是相关的,所以可视化的结果相对于图1中的结果会有所改变。
2D PCA results for Word2Vec& &
&& & & & & & & & &&
2D t-SNE results for Word2Vec
2D PCA results for FastText & & & & & & & & & & & &2D t-SNE results for FastText
& & &2D PCA results for WordRank& & & & & & & t-SNE results for WordRank
图3. 不同模型使用PCA与t-SNE的效果对比
从图3可以看出,在Word2Vec模型中,两种方法都表现不错。要注意的是,由于t-SNE是一种随机方法,所以即使是使用相同的参数设置,也可能得到不同结果。在FastText中,两种方法表现相似,稍次于Word2Vec。在WordRank模型上 ,t-SNE方法效果好于PCA,因为在PCA方法中,一些最相似的词反而在图中被置于较远的位置。
词频和模型性能
本节将会使用不同语料库分析不同词频范围上,词嵌入模型在词类比任务上的性能,如图4和图5所示。类比的四个词的平均频率会先算出来,然后和具有相似平均频率的类比一同存储。
& & & & & & &图4.& 在&Brow n corpus上,不同类比任务的准确率
图5. 在&text8 corpus上,不同类比任务的准确率
由图4和图5分析表明: &&
1.在语义类比中,三种模型在低频词语上表现相对较差,在高频词语上表现效果较好;
2.在语法类比中,FastText优于Word2Vec和WordRank 。FastText模型在低频词语上表现的相当好,但是当词频升高时,准确率迅速降低,而WordRank和Word2Vec在很少出现和很频 繁出现的词语上准确率较低;
3. FastText在综合类比中表现更好,最后一幅图说明整体类比结果与语法类比的结果比较相似,因为语法类比任务的数量远远多于语义类比,所以在综合结果中语法类比任务的结果占有更大的权重;
综上,WordRank更适合语义类比,FastText更适合不同语料库下所有词频的语法类比。
三种模型词类比
& & & 原文中作者展示了不同词向量模型在不同语料库(Brown corpus和text8
)上进行类比任务的日志,结果表明 WordRank在语义类比任务上效果优于其他两种模型,而FastText在语法类比上效果更好 。值得一提的是,如果用WordRank模型生成两个集合(词集合和上下文集合),WordRank使用它们词向量的内积对他们之间的关系建模,内积和他们之间的关系是直接成比例的,如果该词和上下文越相关,内积就会越大。将两者结合考虑,如:
&其中&w& 和&
分别表示词向量和上下文向量。
实验结果表明这种向量合并的组合方法有助于降低过拟合和噪音的影响,并且能够进一步提升模型效果。
1. 没有一种能够适用于不同NLP应用的词向量模型,应该根据你的具体使用场景选择合适的词向量模型。
除了模型本身 ,词频也会对类比任务结果的准确率有重要影响。正如上面图中所示,语料库中词的频率不同,模型性能也不同,例如,如果词频很高,得到的精确度可能会比较低。
以上为译文
本文由北邮 @爱可可-爱生活 &老师推荐, 阿里云云栖社区 组织翻译。
文章原标题《WordRank embedding: “crowned” is most similar to “king”, not word2vec’s “Canute” 》 &作者: Parul Sethi &译者:东东邪
文章为简译,更为详细的内容,请查看
PS:如果网站打不开,请下载本文附件查看原网页或
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致使用fastText进行文本分类
fastText文本分类学习笔记
先下载,然后make,得到可执行c文件
$ gitclone /facebookresearch/fastText.Git
$ cdfastText
文本分类,linux命令行:
./fasttext supervised -input train.txt -output model
训练集train.txt的输入格式为:
标签是以字符串label作为前缀的单词,后面的数字对应类别。我们可以将训练数据处理成这种形式,训练自己的文本分类模型。
一旦模型被训练,您可以通过使用以下方法计算测试集上的k的精度和召回率来对其进行评估:
$ ./fasttext test model.bin test.txt k
参数k可选,默认为1
为了预测获得一个文本的k个最可能的标签,使用:
$ ./fasttext predict model.bin test.txt k
其中test.txt包含要按行分类的文本。 这样输出为每一行的k个最可能的标签。
如果要计算句子或段落的向量表示,请使用:
$ ./fasttext print-sentence-vectors model.bin & text.txt
这假设text.txt文件包含您要获取向量的段落,一段为一行。 该程序将在文件中每行输出一个向量表示。
参数的命令以及可用的参数及其默认值:
$ ./fasttext supervised
Empty input or output path.
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 occurences [5]
-minCountLabel minimal number of label occurences [0]
-wordNgrams max length of word ngram [1] 几元语言模型
-bucket number of buckets [2000000]
-minn min length of char ngram [3] 单词的最小长度
-maxn max length of char ngram [6] 单词的最大长度
-t sampling threshold [0.0001]
-label labels prefix [label] 标签前缀的选择
The following arguments for training are optional: 训练集可选参数
-lr learning rate [0.05]
-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} [ns]
-thread number of threads [12]
-pretrainedVectors pretrained word vectors for supervised learning []
-saveOutput whether output params should be saved [0]}

我要回帖

更多关于 fasttext 训练数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信