Fasttext 如他的名字一样,最大的特点:fast。
[https://github.com/facebookresearch/fastText/tree/master/python#requirements]
FastText是一个高效学习单词表示和句子分类的库。在本文中,我们将介绍如何在Python中使用FastText。
FastText基于现代Mac OS和Linux发行版,因为它使用C++ 11个特性,它需要一个良好支持C++11的编译器。你需要python版本为2.7或>3.4,Numpy,Scipy和pybind11(调用C++的python扩展模块的工具)
为了安装最新版,你可以这么做
pip install fasttext
实测用这个虽然简单,但是容易出问题,可以下载三方或者使用gensim.models。
1、词表示模型(训练词向量模型)
为了学习出词向量,如本文所述,我们可以使用 fasttest.train_unsupervised() 这个函数如下:
import fasttext
#Skipgram Model
model = fasttext.train_unsupervised('data.txt', model = 'skipgram')
#Cbow Model
model = fasttext.train_unsupervised('data.txt', model = 'cbow')
其实有个问题,当你用很小的数据集训练时候,记得调整一个参数 mincount(默认是5),不然会出不来词表。
中文的分词之后,用空格隔开,也同样可以放入训练。
其中data.txt是使用UTF-8编码的训练文件。
返回的模型对象,代表学习到的模型。你可以用它去检索信息。
print(model.words) # 得到字典词表
print(model['king']) # 找到king对应的词向量
这里想要说明一句 不知道是不是封装了的原因,在我实现的过程中这种方式报错。取而代之的是以下这种方式
print(model) # 存储位置
print(model.get_words()) # 词表
print(model.get_word_vector('to')) # 对应词向量
你还可以保存和读取模型对象。
保存:save_model
model.save_model('model_filename.bin')
读取(取回):load_model
model = fasttext.load_model('model_filename.bin')
2、文本分类模型
(其实无监督用来训练词向量,有监督用来训练分类模型) 评估标准 P,R,F1
为了使用这里描述的方法训练文本分类器,我们可以使用fasttext.train_supervised()函数,如下所示:
import fasttext
model=fasttext.train_supervised('data.train.txt')
其中data.train.txt是一个文本文件,每行包括一个训练句子和标签,默认情况下,我们假设标签是以__label__开头的字符串单词。
一旦对模型进行训练,我们就可以检索单词和标签列表。
print(model.words)
print(model.labels)
#print(model.get_words())
#print(model.get_labels()) 我的还是下面这个有显示
为了通过计算精确率(Precision)和召回率(Recall)来评估模型,我们使用test函数。
def print_result(N,p,r):
print('N\t'+str(N))
print("P@{}\t{:.3f}".format(1, p))
print("R@{}\t{:.3f}".format(1, r))
print(*model.test('test.txt')) # 迭代输出返回内容
我们还可以预测特定文本的标签:
model.predict("which baking dish is best to bake a banana bread ?")
默认情况下,predict方法只返回一个标签:可能性最大的那一个。你也可以通过指定参数k来实现对多个标签的预测。
model.predict("which baking dish is best to bake a banana bread ?", k = 3)
如果你想要的预测更多,你可以通过字符串数组来实现。
model.predict(['which ...','I love yyh','...'],k=3)
当然,你也可以像单词表示用法那样,将模型保存到文件中或从文件中加载模型。
量化压缩模型文件
当你想要保存一个有监督的模型文件时,FastText可以通过牺牲一点点的性能来压缩他,已获得一个更小的模型文件。
#使用之前的训练模型,调用
model.quantize(input='data.train.txt',retrain=True) # 数据集太小会报错 !!!
#接下来展示结果和存储新模型
print_result(*model.test(valid_data))
model.save_model("model_filename.ftz")
model_filename.ftz 比model_filename.bin 的大小 要小很多。
3、重要提示:数据预处理/编码规定
通常,正确预处理数据很重要。
FastText采用UTF-8编码文本,python2的所有文本必须为unicode,python3的所有文本必须为str。传递的文本江北pybind11编码为UTF-8在传递给Fasttext的C++库之前。这意味着在构建模型时,使用UTF-8编码文本很重要。在类unix系统上,可以使用iconv转换文本。
FastText将根据以下ASCII字符(字节)标记(将文本拆分为多个部分),特别的是,他并不知道UTF-8的空白(字符)。我们建议用户将UTF-8空白/单词边界转换为以下适当的符号之一。
1、空格 2、制表符tab 3、垂直制表符 4、回车 5、换页 6、null 字节
4、更多示例
为了更好地了解FastText模型,请考虑主要的README文件,特别是我们网站上的教程。
你可以在doc文件夹中找到更多的python示例。
与任何包一样,你可以使用帮助函数。
例如。
import fasttext
help(fasttext.FastTest)
train_unsupervised 参数 用来训练词向量模型
input :训练文件路径
model :无监督训练使用的模型 {cbow 和 skip-gram} 默认为skip-gram
lr :学习率 默认为0.05
dim : 词向量维度 默认为100
ws :(windows size) 窗口大小 默认为5
epoch : 默认训练五轮
minCount : 最小词数 默认为5 当数据集略小要记得调整
minCountLabel :=0 因为是无监督。
minn :最小char级别的3-gram(subword)
maxn :最大char级别的6-gram (subword)
neg :负例采样个数 默认为5
wordNgrams :最大的词n-gram长度 默认为1
loss :损失函数 {ns,hs,softmax,ova} 默认是ns 负采样 , hs 是分层softmax
bucket : 桶数默认为2000000
thread:cpu线程数 默认为12
lrUpdateRate:学习率更新,默认为100
t:负采样阈值 默认0.0001
verbose:=2
train_supervised 参数 用来训练分类模型 没有model参数√
input :训练文件路径
lr :学习率 默认为0.1 √
dim : 词向量维度 默认为100
ws :(windows size) 窗口大小 默认为5
minCount : 最小词数 默认为1√
minCountLabel :=1 √ 最小标签数
minn :=0√
maxn :=0√
neg :负例采样个数 默认为5
wordNgrams :最大的词n-gram长度 默认为1
loss :损失函数 {ns,hs,softmax,ova} 默认是softmax√
bucket : 桶数默认为2000000
thread:cpu线程数 默认为12
lrUpdateRate:学习率更新,默认为100
t:负采样阈值 默认0.0001
label :标签前缀 默认 '_ label _'√
verbose:=2 控制打印输出 2显示每个epoch 1显示最后一个epoch
pretrainedVectors:用于监督学习的预训练词向量(.vec文件),给出路径 ,默认为‘ ’
模型压缩:用于减小模型大小和内存占用,后缀.ftz
model.quantize(self,
input=None, 训练文件路径
qout=None, 修剪输出层
cutoff=0, 重新训练的词和ngram个数
retrain=False, 是否重新训练
epochs=None, 多少轮
lr=None, 学习率
thread=None, 线程
verbose=None,
dsub=2, 压缩成几块
qnorm=False) 是否归一化
模型的存取 save_model / load_model
model.save_model(self,path): 给出存储路径
model = ff.load_model(self,path)
模型的单例预测
model.predict(self,
text, utf-8 字符串文本
k=1, 返回标签的个数,可以理解为最大K项
threshord=0.0) 概率阈值,大于才返回
模型批量预测
model.test(self,
path, 文件路径
k=1) 最大k项
返回:[N,p,r] 样本个数,精确率,召回率
Model对象
train_unsupervised、train_supervised、load_model 都会返回一个_FastText类的对象,我们一般命名为model。
model对象下面的一些方法。
这个就不翻译了,因为命名的很直白。