python——Fasttext新手学习笔记。

Fasttext 如他的名字一样,最大的特点:fast。

[https://github.com/facebookresearch/fastText/tree/master/python#requirements]

FastText是一个高效学习单词表示和句子分类的库。在本文中,我们将介绍如何在Python中使用FastText。

目录

  • 需求/要求(指的是环境要求)
  • 安装
  • 使用概述
    1、词表示模型
    2、文本分类模型
    3、重要(提示):数据预处理和编码约定(习惯)
    4、更多示例
  • API 应用程序接口
    1、无监督训练 参数
    2、有监督训练 参数

要求

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)

API


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对象下面的一些方法。
在这里插入图片描述
这个就不翻译了,因为命名的很直白。

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值