[1023]fastText文本分类算法

2023-11-03

github:https://github.com/facebookresearch/fastText
pypi:https://pypi.org/project/fasttext/

简介

fastText是一种Facebook AI Research在16年开源的一个文本分类器。 其特点就是fast。相对于其它文本分类模型,如SVM,Logistic Regression和neural network等模型,fastText在保持分类效果的同时,大大缩短了训练时间。

fastText专注于文本分类,在许多标准问题上的分类效果非常好。

模型架构

fastText的模型架构和 word2vec 中的 CBOW 模型的结构很相似。CBOW 模型是利用上下文来预测中间词,而fastText 是利用上下文来预测文本的类别。而且从本质上来说,word2vec是属于无监督学习,fastText 是有监督学习。但两者都是三层的网络(输入层、单层隐藏层、输出层),具体的模型结构如下:

上面图中 xi 表示的是文本中第 i 个词的特征向量,该模型的负对数似然函数如下:

上面式子中的矩阵 A 是词查找表,整个模型是查找出所有的词表示之后取平均值,用该平均值来代表文本表示,然后将这个文本表示输入到线性分类器中,也就是输出层的 softmax 函数。式子中的 B 是函数 f 的权重系数。

分层 softmax(Hierarchical softmax)

首先来看看softmax 函数的表达式如下:

然而在类别非常多的时候,利用softmax 计算的代价是非常大的,时间复杂度为 O(kh) ,其中 k 是类别的数量,h 是文本表示的维度。而基于霍夫曼树否建的层次 softmax 的时间复杂度为 O(h;log2(k)) (二叉树的时间复杂度是 O(log2(k)) )。霍夫曼树是从根节点开始寻找,而且在霍夫曼树中权重越大的节点越靠近根节点,这也进一步加快了搜索的速度。

N-grams 特征

传统的词袋模型不能保存上下文的语义,例如“我爱你”和“你爱我”在传统的词袋模型中表达的意思是一样的,N-grams 模型能很好的保存上下文的语义,能将上面两个短语给区分开。而且在这里使用了 hash trick 进行特征向量降维。hash trick 的降维思想是讲原始特征空间通过 hash 函数映射到低维空间。

使用

  • 安装
pip install fasttext==0.9.1
  • code
# -*- coding:utf-8 -*-
"""
@author: zhouxinfei
@license: Apache Licence
@file: *.py
@time: 2021/07/14
@site:
@software: PyCharm2020.1
"""
import time
import os,sys,random
import csv
import jieba
import fasttext


csv.field_size_limit(int(sys.maxsize/100_0000_0000))

file_path = r'./sample/category_sample.csv'
file_path2 =file_path.replace('.csv','.txt')

# 生成样本
def sample_deal():
    out = open(file_path2,'w',encoding='utf-8',newline='')
    with open(file_path, encoding='utf-8',newline='') as f:
        reader = csv.reader(f)
        for row in reader:
            if len(row)<2:
                print(row)
                continue
            seglist = jieba.lcut(','.join(row[1:]))
            line="__label__" + row[0] + ' ' + ' '.join(seglist) + '\n'
            out.write(line)

def train():
    # 有监督的学习,训练分类器
    classifier = fasttext.train_supervised(input=file_path2,label_prefix='__label__',
                dim=256,epoch=2000,lr=0.1,wordNgrams=3,loss='softmax', verbose=2)
    classifier.save_model(r'./train_model/classifier.model')

# 单一测试
def one_test():
    classifier = fasttext.load_model(r'./model/category_classifier_sec.model')
    name='好客便利店'
    seglist=jieba.lcut(name)
    text=' '.join(seglist)
    labels= classifier.predict(text=text, k=3)
    # labels= classifier.predict([' '.join(seglist)], k=3)
    print(labels)
    print(labels[0][0],labels[1][0])

# 整体测试
def all_test():
    classifier = fasttext.load_model(r'./model/category_classifier_sec.model')
    # path='./sample/fasttext_new.txt'
    path='./sample/category_sample.txt'
    result = classifier.test(path=path)
    print('测试集上数据量', result[0])
    print('测试集上准确率', result[1])
    print('测试集上召回率', result[2])
    with open(path, encoding='utf-8') as fp:
        for line in fp.readlines():
            line = line.strip()
            if line == '':
                continue
            labels = classifier.predict(line, k=1)
            print(line, labels[0][0],labels[1][0])


if __name__ == '__main__':
    # sample_deal()
    train()
    # one_test()
    # all_test()

在训练fastText的时候有两点需要特别注意,一个是wordNgrams,一个是loss,这两个是fastText的精髓所在,之后会提到。

在使用fastText进行文本训练的时候需要提前分词,这里的wordNgrams是根据分词的结果来组织架构的;

事实上在训练文本分类的时候有个副产物就是word2vec,fastText在实现文本分类的时候其实和cbow非常类似,就是把word2vec求和之后过了一个fc进行的分类。

fastText 运行速度快的原因

1)多线程训练:fastText在训练的时候是采用的多线程进行训练的。每个训练线程在更新参数时并没有加锁,这会给参数更新带来一些噪音,但是不会影响最终的结果。无论是 google 的 word2vec 实现,还是 fastText 库,都没有加锁。线程的默认是12个,可以手动的进行设置。

2)分层softmax:对于类别过多的类目,fastText并不是使用的原生的softmax过交叉熵,而是使用的分层softmax,这样会大大提高模型的训练和预测的速度。

fasttext参数:
The following arguments 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]
-minCount     minimal number of word occurences [1]
-neg          number of negatives sampled [5]
-wordNgrams   max length of word ngram [1]
-loss         loss function {ns, hs, softmax} [ns]
-bucket       number of buckets [2000000]
-minn         min length of char ngram [3]
-maxn         max length of char ngram [6]
-thread       number of threads [12]
-t            sampling threshold [0.0001]
-label        labels prefix [__label__]

-lr:学习速率[0.1]
-lrUpdateRate:更改学习率的更新速率[100]
-dim :字向量大小[100]
-ws:上下文窗口的大小[5]
-epoch:历元数[5]
-neg:抽样数量[5]
-loss:损失函数 {ns,hs,softmax} [ns]
-thread:线程数[12]
-pretrainedVectors:用于监督学习的预培训字向量
-saveOutput:输出参数是否应该保存[0]

方括号[]中的值表示传递的参数的默认值

参考:https://www.cnblogs.com/hyserendipity/p/11698606.html
https://www.cnblogs.com/jiangxinyang/p/9669294.html
https://blog.csdn.net/john_bh/article/details/79268850
https://www.jianshu.com/p/e828f02e41c8
http://www.atyun.com/3590.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[1023]fastText文本分类算法 的相关文章

随机推荐

  • 企业在数字化转型,数据化运营上遇到了哪些困境,如何解决?

    公司决策者意识到成功的数字体验越来越重要 调查受访者表示 这种成功的衡量标准是 用户体验和满意度提高 53 市场敏捷性提高 49 收入和盈利能力增加 49 员工生产力提高 49 以及更快的上市时间 48 然而 数字战略的失败原因是由于系统各
  • ios中模拟手势单击或是双击

    1 拓展UITouch类和UIEvent类 通过category 具体见附件TouchSynthesis h和TouchSynthesis m 2 在需要的类中 定义UITouch和UIEvent类的对象 UITouch touch UIT
  • 交换机连接不同网段的主机为何ping不通

    大家都知道 如果一交换机连接的主机在同一网段 则各主机可以互相通信 可为什么连接不同网段的主机就ping不通了呢 我想很多人都有这样的想法 交换机不是基于帧的源MAC地址进行学习 目标MAC地址进行转发吗 也就是说 当第一次通信时 即交换机
  • adb如何启动

    adb 怎么启动应用 来源于 解晴新生 Android的应用分为两种 一种是常用的有界面的App 另一种是自动化测试中的无界面Instrumentation 两种应用都可以使用adb am 命令启动它 工具 原料 adb App启动方法 步
  • C++ 纵横字谜的答案(详解)

    输入一个r行c列 1 r c 10 的网格 黑格用 表示 每个白格都填有一个字母 如果一个白格的左边相邻位置或者上边相邻位置没有白格 可能是黑格 也可能出了网格边界 则称这个白格是一个起始格 首先把所有起始格按照从上到下 从左到右的顺序编号
  • LaTeX新人教程,30分钟从完全陌生到基本入门

    对于真心渴望迅速上手LaTeX的人 前言部分可以跳过不看 本教程面向对LaTeX完全无认知无基础的新人 旨在让新人能够用最简单快捷的方式 轻松入门 能够迅速使用LaTeX完成基本的文本编辑 这个教材最终能够达到的水平是能够使用LaTeX写一
  • echarts饼图显示百分比_复合饼图和双层饼图的制作方法

    Excel数据分析中 我们经常会用到饼状图 今天我们来分享一下复合饼图和双层饼图的制作方法 01 复合饼图复合饼图 从主饼图提取部分数值 并将其组合到另一个饼图中 复合饼图主要有两个作用 1 提高小百分比数据的可读性 在Excel中插入饼图
  • RabbitMQ五种消息模式

    1 简单模式 工作的流程 当生产者生产消息后 将消息发往队列 当队列中有消息时 消费者会实时的监听队列中的消息 如果有消息则会执行消息 2 工作模式 默认的传统队列是为均摊消费 存在不公平性 如果每个消费者速度不一样的情况下 均摊消费是不公
  • 和你一起从零开始写RISC-V处理器(1)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 前言 一 RISC V简介 二 指令实现的前期准备 1 指令 2 ADD指令和ADDI指令 3 三级流水线结构 4 一个需要注意的点 5 再来一个需要注意的点 6 环境搭建
  • DDD领域驱动篇——第一章(一文带你领略DDD、微服务和中台设计)

    在讲DDD之前 我对领域驱动曾经有过一段时间的了解 其实这个概念当我第一次听的时候发现很泛化 而且很抽象甚至难以理解 后来我发现这个玩意得需要很多时间 很多框架 技术的演进 软件迭代到了一定的瓶颈 业务愈发复杂而带来一系列架构转变和业务重构
  • 【JavaEE】图书管理系统-简易版

    文章目录 book包 Book类 BookList类 operation包 AddOperation 类 BorrowOperation 类 DelOperation类 DisplayOperation 类 ExitOperation 类
  • 智慧文本Supertext:错失千万,标书中的一字之差到底有多可怕?

    一招不慎 满盘皆输 这句话对于经常会参与投标工作的朋友来说 或许深有同感 国内一家企业投标 因为业务人员的疏忽 将 投标书 投标人名字中的 张 写成了 章 因为这一字之差 让这家极具竞争力的企业陷入争议 最终与成功失之交臂 在投标工作的准备
  • python 抓取alexa数据

    要抓取http www alexa cn rank baidu com网站的排名信息 例如抓取以下信息 需要微信扫描登录 因为这个网站抓取数据是收费 所以就利用网站提供API服务获取json信息 上面的API KEY值需要花钱买的 注意开通
  • 最新最新通信工程毕业设计题目选题推荐100例

    文章目录 1前言 2 如何选题 3 通信工程选题方向 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 1前言
  • 使用Docker实现持续集成

    使用Docker实现持续集成 基于Docker的特征 现在常见的利用Docker进行持续集成的流程如下 开发者提交代码 触发镜像构建 构建镜像上传至私有仓库 镜像下载至执行机器 镜像运行 其基本拓扑结构如图1所示
  • JSP实现等腰杨辉三角,你真的了解杨辉三角吗?

    jsp实现等腰杨辉三角 什么是杨辉三角 java实现杨辉三角 jsp实现杨辉三角 在jsp实现之前 先了解一下什么是杨辉三角 再通过java实现一下杨辉三角 最后通过jsp实现等腰杨辉三角 什么是杨辉三角 杨辉三角形 又称贾宪三角形 帕斯卡
  • 发布一个开源的新闻api(整理后就开源)

    目录 说明 基础说明 其他说明 通用接口 登录 注册 更改密码 需要token 更换头像 需要token 获取用户列表 需要token 上传文件 5000端口 获取文件 5000端口 源码文件 db文件均不能获取 验证token 需要tok
  • Java技术——内部类

    内部类 inner class 定义 在一个类中定义另外一个类 这个类就叫做内部类 优点 内部类可以让我们将逻辑上相关的一组类组织起来 并由外部类来控制内部类的可见性 当我们建立一个内部类时 其对象 就拥有了与外部类对象 之间的一种关系 这
  • pid算法C语言实现

    理论我就不多说了 网都已经很多了 但能直接看到效果的确不多 这里我就提供一个 语言实现的可以看到效果的实际例程 pid h ifndef PID H define PID H typedef struct pid int error las
  • [1023]fastText文本分类算法

    文章目录 简介 模型架构 分层 softmax Hierarchical softmax N grams 特征 使用 fastText 运行速度快的原因 fasttext参数 github https github com facebook