fastext是什么?

Facebook AI Research Lab 发布的一个用于快速进行文本分类和单词表示的库。优点是很快,可以进行分钟级训练,这意味着你可以在几分钟时间内就训练好一个分类模型。

本文主要内容?

使用fasttext训练一个效果不错的新闻文本分类器/模型。

使用到的技术和环境?

1. python 3.7、fasttext 0.9.1(截至2020/3/29最新版本) Windows 10 (实验过程中使用的环境)

2. 1核2G 1Mbps 腾讯云服务器 Ubuntu 18.04 (最终的模型产出于此,如果你手头有Linux系统,那最好不过了)

需要注意什么?

1. 博主并非是专业的NLP学习者,所以以下内容是参考诸多博客、官方doc以及GitHub上的项目说明而来,算是拾人牙慧。但总结一些坑,便于后来者食用。

2. 强烈建议使用Linux or Mac OS 系统来训练,哪怕你是要在Windows下使用(训练的模型是可以多系统之间通用的,比如我在Linux-Ubuntu中训练,在Windows上可以正常使用)。但是在Windows下训练也是可行的,至少可以通过python安装fasttext库来使用,但是会有问题——无法进行自动超参数优化(至少目前如此)。

重要的文档?

官方的文档及博客 GitHub fastext 项目 


Let's start

Step1: 准备训练集和测试集 

这里的参考训练测试集来自 一位博主博客,他已经进行过中文分词,所以可以直接拿来训练。

下载地址(如果地址失效,请在博客下方留言评论,或者尝试联系上方QQ/Email)

news_fasttext_train.txt 训练集365M
news_fasttext_test.txt 测试集310M

如果上述链接失效,可从下述链接获取:

链接:https://pan.baidu.com/s/1izR-0oUFhZ4v5lrVYFng6A
提取码:n5w6

Step2: 在机器上构建fasttext

1. Windows 10 os : 过程中发现许多人在安装时遇到了问题,这里建议直接使用python pip工具安装

pip/pip3 install fastext

安装成功后,import它即可。

2. Linux  os : 按照官网教程,下面照搬过来

命令行键入:

$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make

如果没有git工具,按照提示安装一下。

Step3 : 进行训练

是的,你已经可以开始训练了,而训练....也只需要一行命令,即为简单,且可以在几分钟内完成。

1. 使用默认参数进行训练:

命令行键入:

$ ./fasttext supervised -input news_fasttext_train.txt -output model_xxxx

其中-input后跟训练集的路径,要修改为自己放置训练集的path,如果就放在fasttext文件夹下,那么直接按照上面运行即可。-output是模型的名字,训练完成后会产生一个model_xxxx.bin的文件,即是模型,可以自行设置模型文件名。

2. 自己设定参数进行训练:

命令行键入:

$ ./fasttext supervised -input news_fasttext_train.txt -output model_xxxx -lr 

上面的命令新增设定了-lr学习率和-epoch训练集送入的次数,当然还有其他的参数,请自行前往官网或者GitHub项目查看并设定,再进行训练。

3. 自动超参数优化

找到最佳超参数对于构建有效模型至关重要。但是,手动搜索最佳超参数很困难。但是,fasttext可以为你找到对于测试集来说最佳的超参数,然后使用这些超参数,再用训练集进行训练。而使用自动超参数优化,只需要在命令行中加入-autotune-validation 测试集path。

命令行键入:

$ ./fasttext supervised -input news_fasttext_train.txt -output model_xxxx -autotune-validation news_fasttext_test.txt

这样一来,就可以不用自己费力调参,直接得到对于测试集来说最佳的模型,从我使用的情况来看,确实如此。下图中,我展示了两个新闻主题的训练过程中的数据,最后使用此功能得到了相较此前最好的效果。证明,使用自动超参数优化来做,比自己摸索调参要来的更快、效果更好。

Step4 : 计算一下评价数据

precision、recall、f1-score ,尤其后者是评价模型优劣的重要数据,我们来计算一下。

这里要使用到python来写脚本:(脚本来自上面博客,但是在py3.7下运行会出错,我进行了修改)

 1 # -*- coding: utf-8 -*-
 2 # @Author  : yocichen
 3 # @Email   : yocichen@126.com
 4 # @File    : test.py
 5 # @Software: PyCharm
 6 # @Time    : 2020/3/27 21:49
 7
 8 import fasttext
 9
10 # 1. 加载模型
11 # 模型文件名自行修改
12 classifier = fasttext.load_model('Model/model_0328_1854.bin')
13
14 # 2. 读入测试集文件,进行预处理
15 labels_right = []
16 texts = []
17 with open("Data/news_fasttext_test.txt", encoding='utf-8') as fr:
18     for line in fr:
19         line = line.rstrip()
20         labels_right.append(line.split("\t")[1].replace("__label__", ""))
21         texts.append(line.split("\t")[0])
22
23 labels_predict = []
24 for t in texts:
25     res = classifier.predict(t)
26     labels_predict.append(res[0][0].replace('__label__', ''))
27
28 text_labels = list(set(labels_right)) # 训练集中的标签类别
29 text_predict_labels = list(set(labels_predict)) # 预测结果中的标签类别
30
31 A = dict.fromkeys(text_labels,0)  #预测正确的各个类的数目
32 B = dict.fromkeys(text_labels,0)   #测试数据集中各个类的数目
33 C = dict.fromkeys(text_predict_labels,0) #预测结果中各个类的数目
34 for i in range(0,len(labels_right)):
35     B[labels_right[i]] += 1
36     C[labels_predict[i]] += 1
37     if labels_right[i] == labels_predict[i]:
38         A[labels_right[i]] += 1
39
40 print('A:', A)
41 print('B', B)
42 print('C', C)
43
44 # 3. 计算准确率,召回率,F值
45 for key in B:
46     try:
47         r = float(A[key]) / float(B[key])
48         p = float(A[key]) / float(C[key])
49         f = p * r * 2 / (p + r)
50         print("%s:\t p:%f\t r:%f\t f:%f" % (key,p,r,f))
51     except:
52         print("error:", key, "right:", A.get(key,0), "real:", B.get(key,0), "predict:",C.get(key,0))

python script

运行结果:

Step5 :实战测试一下

我在各大新闻网站随机摘抄了20条新闻(片段),其中大部分是财经新闻,来小小的测试一下我们的分类器/模型。

下载地址:

news_sample.txt 新闻片段 9.95kb

链接:https://pan.baidu.com/s/1bURmHsQn_v5UevZqY8vBeg
提取码:numq

stop_words.txt 停用词 17.2kb

链接:https://pan.baidu.com/s/1Qzpk4KAOlI5Wmm7iuIaelQ
提取码:gfda

下面编写脚本来加载上面训练好的模型,进行简单测试

 1 # -*- coding: GBK -*-
 2 # @Author  : yocichen
 3 # @Email   : yocichen@126.com
 4 # @File    : predict.py
 5 # @Software: PyCharm
 6 # @Time    : 2020/3/27 13:15
 7
 8 import fasttext
 9 import sys, os
10 import jieba
11 from preprocess import *
12
13 # 加载模型
14 model = fasttext.load_model('Model/model_0328_1854.bin')
15
16 with open('Data/news_sample.txt', encoding='utf-8') as f:
17     for line in f:
18         handle_text = seg(line.lower().replace('\n', ''), stop_words(), apply=clean_txt)
19         res1 = model.predict(handle_text)
20         print(res1[0][0].replace('__label__', ''))

predict.py

 1 import re
 2 from types import MethodType, FunctionType
 3 import jieba # 中文分词第三方库,需要自行安装 pip3 install jieba / 在pycharm中安装也可
 4
 5 # 文本清洗
 6 def clean_txt(raw):
 7     fil = re.compile(r"[^0-9a-zA-Z\u4e00-\u9fa5]+")
 8     return fil.sub(' ', raw)
 9
10 # 中文分词,去通用词,再连接成字符串
11 def seg(sentence, sw, apply=None):
12     if isinstance(apply, FunctionType) or isinstance(apply, MethodType):
13         sentence = apply(sentence)
14     return ' '.join([i for i in jieba.cut(sentence) if i.strip() and i not in sw])
15
16 # 停用词,stop_words.txt 需要下载
17 def stop_words():
18     with open('Data/stop_words.txt', 'r', encoding='utf-8') as swf:
19         return [line.strip() for line in swf]
20
21
22 # 对某个sentence进行处理:
23 # content = '上海天然橡胶期价周三再创年内新高,主力合约突破21000元/吨重要关口。'
24 # res = seg(content.lower().replace('\n', ''), stop_words(), apply=clean_txt)
25 # print(res)

preprocess.py

测试结果:

根据人工判断进行比对,准确率大概在 18-19/20吧!


到这里,使用fastext训练一个新闻文本分类器,就结束了,其实自己的工作并不多,但是也学到了一些文本分类相关的东西,愿后来的你也能有所收获!

参考文档

[1] https://www.cnblogs.com/hyserendipity/p/11698606.html

[2] jieba库使用说明

[3] 利用Fast-Text进行中文文本分类[前期在用这里的训练集,虽然f1很高0.98,但实际使用效果并不好,不推荐]

一个使用fasttext训练的新闻文本分类器/模型的更多相关文章

  1. 基于Bayes和KNN的newsgroup 18828文本分类器的Python实现

    向@yangliuy大牛学习NLP,这篇博客是数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(上)的Python实现.入门为主,没有太多自己的东西. 1. ...

  2. 文本情感分析(二):基于word2vec、glove和fasttext词向量的文本表示

    上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用 ...

  3. fastText 训练和使用

    2019-09-09 16:33:11 问题描述:fastText是如何进行文本分类的. 问题求解: fastText是一种Facebook AI Research在16年开源的一个文本分类器. 其特 ...

  4. 基于jieba,TfidfVectorizer,LogisticRegression进行搜狐新闻文本分类

    一.简介 此文是对利用jieba,word2vec,LR进行搜狐新闻文本分类的准确性的提升,数据集和分词过程一样,这里就不在叙述,读者可参考前面的处理过程 经过jieba分词,产生24000条分词结果 ...

  5. 利用jieba,word2vec,LR进行搜狐新闻文本分类

    一.简介 1)jieba 中文叫做结巴,是一款中文分词工具,https://github.com/fxsjy/jieba 2)word2vec 单词向量化工具,https://radimrehurek ...

  6. 使用OpenCV训练Haar like+Adaboost分类器的常见问题

    <FAQ:OpenCV Haartraining>——使用OpenCV训练Haar like+Adaboost分类器的常见问题 最近使用OpenCV训练Haar like+Adaboost ...

  7. ZeroMQ接口函数之 :zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_z85_decode zmq_z85_decode(3)         ØMQ Manual - ØMQ/4.1 ...

  8. 使用OpenCV训练好的级联分类器识别人脸

    一.使用OpenCV训练好的级联分类器来识别图像中的人脸 当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载: OpenCV分类器 import cv2 # 矩形颜色和描边 color ...

  9. 一个简单的代码生成器(T4文本模板运用)

    说要写这篇文章有一段时间了,但因为最近各方面的压力导致心情十二分的不好,下班后往往都洗洗睡了.今天痛定思痛,终于把这件拖了很久的事做了.好,不废话了,现在看看"一个简单的代码生成器" ...

随机推荐

  1. Quartz Tutorial 11 - Miscellaneous Features of Quartz

    文章目录 Plug-Ins Quartz提供了一个接口(org.quartz.spi.SchedulerPlugin) 用于插入附加的功能. 与Quartz一同发布的,提供了各种实用功能的插件可以在o ...

  2. 线程sleep,wait,notify,join,yield方法解析

    线程的五种状态 线程从创建到销毁一般分为五种状态,如下图: 1) 新建 当用new关键字创建一个线程时,就是新建状态. 2) 就绪 调用了 start 方法之后,线程就进入了就绪阶段.此时,线程不会立 ...

  3. Python——12类的继承

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. jvm的运行参数

    1.我们为什么要对jvm做优化? 在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们可能将有下面的需求: 运行的应用“卡住了”,日志不输出,程序没有反应 服务器的CPU负 ...

  5. 超详细的HDFS读写流程详解(最容易理解的方式)

    HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).Datanode(数据节点)和Seco ...

  6. elasticsearch 创建索引

    一.基本概念 索引:含有相同属性的文档的集合. //可以想象成一个数据库 database 类型:索引可以定义一个或多个类型,文档必须属于一个类型. //可以想象成数据库中的表 table 文档:文档 ...

  7. unzip详解,Linux系统如何解压缩zip文件?

    通常在使用linux时会自带了unzip,但是在最小化安装之后,可能系统里就无法使用此命令了. yum list unzip 查看是否安装 如果没安装过就继续 yum install unzip 安装 ...

  8. Oracle根据实体类比对2个数据库结构差异(demo)

    源起 在公司做项目时 经常出现 实体结构和线上的数据结构以及公司开发库数据结构不匹配的问题 但是又不能直接把开发库导入到生产库因为生产库已经有实际数据了 所以弄了一个小工具 此处只做记录用 demo级 ...

  9. OpenCV3入门(十四)图像特效—挤压、哈哈镜、扭曲

    一.图像挤压特效 1.原理 图像压效果本质的图像坐标的非线性变换,将图像向内挤压,挤压的过程产生压缩变形,从而形成的效果. 挤压效果的实现是通过极坐标的形式,设图像中心为O(x,y),某点距离中心O的 ...

  10. Simulink仿真入门到精通(十七) Simulink代码生成技术详解

    17.1 基于模型的设计 基于模型设计是一种流程,较之传统软件开发流程而言,使开发者能够更快捷.更高效地进行开发.适用范围包括汽车电子信号处理.控制系统.通信行业和半导体行业. V字模型开发流程整体描 ...