文本分类——脸书的高效杰出工具fastText

时间:2024-03-28 22:12:20

1. fastText介绍

  • fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新。但是它的优点也非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 在10分钟之内够训练10亿词级别语料库的词向量,能够对有着30万多类别的50多万句子在1分钟之内分类。
  • FastText是一个开源的,免费的,轻量级的库。允许用户学习文本表达和文本分类。可以工作于标准通用硬件。模型大小可以剪裁以适应移动设备。
  • 这个项目是由两部分组成的分别是
    (1) fastText文本分类
    (2)词嵌入学习
    本文关注(1)fastText文本分类
  • github

2. fastText文档

3. fastText安装

  • 操作系统
    MacOS或Linux
  • gcc-4.6.3以上 clang3.3以上
  • 需要有make工具
  • 词语相似性计算
    python2.6以上
    numpy和scipy
  • 编译
$ git clone https://github.com/facebookresearch/fastText.git 
$ cd fastText 
$ make

4. fastText文本分类教程

(1) [email protected][email protected]的意义

例:Why not put knives in the dishwasher?
标注标签:equipment, cleaning, knives
预测标签top5:food-safety, baking, equipment, substitutions, bread
[email protected]=(#预测正确的标签)/(#预测出的标签)=1/5=0.2
[email protected]=(#预测正确的标签)/(#标注出的标签)=1/3=0.3

(2) 选项

参数名称 用途 取值范围 默认值
-epochs迭代次数 模型训练时,对每个样本的扫描次数 [5,50] 5
-lr 学习速率 模型训练时,参数更新的速度。此值为模型训练开始时的学习速率,训练过程中系统自动调节该值 [0.1, 1.0] 0.1
-ngrams n元特征 ngrams可以弥补bow无序性的缺陷 [1, 5] 1
-loss hs 当进行多类别预测时,使用hierarchical softmax的输出层可以加速线性分类器速度

选项

(3)官网厨具分类例子

(1)文本预处理
a. 大写字母转小写
b. 去除单词中的标点符号
(2)代码

# 1. 数据准备
# 下载
$ wget https://s3-us-west-1.amazonaws.com/fasttext-vectors/cooking.stackexchange.tar.gz && tar xvzf cooking.stackexchange.tar.gz
# 训练集
$ head -n 12404 cooking.stackexchange.txt > cooking.train
# 验证集
$ tail -n 3000 cooking.stackexchange.txt > cooking.valid
# 2. 分类器
# 训练
$ ./fasttext supervised -input cooking.train -output model_cooking
# 验证准确率 top1
$ ./fasttext test model_cooking.bin cooking.valid   
# 验证准确率 top5
$ ./fasttext test model_cooking.bin cooking.valid 5 
# 交互式预测
$ ./fasttext predict model_cooking.bin -
# 3. 改进模型
# (1)去掉标点符号 大写字母转小写
$ cat cooking.stackexchange.txt | sed -e "s/\([.\!?,'/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > cooking.preprocessed.txt
$ head -n 12404 cooking.preprocessed.txt > cooking.train
$ tail -n 3000 cooking.preprocessed.txt > cooking.valid
# (2)调节epochs和learning rate
# 调节每个样本被扫描的次数
$ ./fasttext supervised -input cooking.train -output model_cooking -epoch 25
# 调节学习速率
$ ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0
# (3)使用ngrams特征
$ ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2
# (4)使用hierarchical sofmax
$ ./fasttext supervised -input cooking.train -output model_cooking -lr 1.0 -epoch 25 -wordNgrams 2 -bucket 200000 -dim 50 -loss hs

文本分类——脸书的高效杰出工具fastText

文本分类——脸书的高效杰出工具fastText

5. 中文新闻分类例子

#!/usr/bin/env python
#coding:utf-8
"""
"""
from fastText import train_supervised
# 打印结果
def print_results(N, p, r):
    print("N\t" + str(N))
    print("[email protected]{}\t{:.3f}".format(1, p))
    print("[email protected]{}\t{:.3f}".format(1, r))

# 训练过程
model = train_supervised(input="/home/yf/fastText/data/THUCNews/news_fasttext_train.txt", epoch=25, lr=1.0, wordNgrams=2, verbose=2, minCount=-1)

# 打印结果
print_results(*model.test("/home/yf/fastText/data/THUCNews/news_fasttext_test.txt"))

文本分类——脸书的高效杰出工具fastText