当前位置: 首页 > news >正文

重生归来,我要成功 Python 高手--day44 迁移学习 Fasttext 文本分类 词向量

Fasttext:是一种轻量化的预训练模型,适合文本分类和文本向量化

优势

结构简单

进行训练词向量的时候由于使用层次softmax结构能够提升模型的训练效率

使用n-gram特征提取以弥补模型缺陷提高精度

由三层组成

输入层:对文本词嵌入之后的词向量包含n-n-gram特征

把文本进行拆分,结果n-gram进行拆词,并且转化为词向量

隐藏层:对输入数据的求和平均

把所有的n-gram向量求和\平均,就得到一个代表文本的特征向量

输出层:文档对应的预测标签

根据特征向量,预测标签

层次softmax:

对于普通的softmax做出优化,主要是词表的数据分类特别大的时候,底层就会使用哈夫曼树,来表示类别,将原表的线性计算成本,降低到对数级别

思想

将所有的分类组成一个二叉树每个类别是一个叶子节点,预测一个词的概率不是直接算这个词的softmax而是从根节点出发走到这个词的叶子节点,每一步都是一个二分类问题,最终概率是路径上决策概率的乘积

构建一个哈夫曼树:这个数由n个子节点,每个子节点有对应的权重值,构建的过程为

1.将所有的权重看成有n颗数的森林,每个森林只有一个节点

2.选出两个权重值最小的森林组成一个新的树,这个树的根节点是这两个权重的和,小的在左边大的在右边,

3.从森林中删除这两个节点,并将新树加入到这个森林中

4.重复2-3步骤,直到森林只有一个树为止,那么这个数就是哈夫曼树

由图可知,权重值越大那么离根节点就越近,并且如果这个根节点为n,那么新增的节点就是n-1

哈夫曼编码:将哈夫曼树的左子树变为0,右子树变为1从根节点到叶子节点所经过的分支就变成0/1组成的序列便是这个节点对应的字符编码,这个编码就是哈夫曼编码

D的哈夫曼编码就是:110,从根节点到对应的叶子节点

层次softmax的优势

传统的softmax的时间复杂度为L(labels的数量), 但是使用层次化softmax之后时间复杂度的log(L) (二叉树的高度和宽度的近似), 从而在多分类的场景提高了效率.

负采样

负采样每次让一个训练样本仅仅更新一小部分的权重, 这样就会降低梯度下降过程中的计算量

优点:

提高训练速度, 选择了部分数据进行计算损失, 损失计算更加简单.

改进效果, 增加部分负样本, 能够模拟真实场景下的噪声情况, 能够让模型的稳健性更强.

文本分类

文本分类的是将文档分配给一个或多个类别. 当今文本分类的实现多是使用机器学习方法从训练数据中提取分类规则以进行分类, 因此构建文本分类器需要带标签的数据.

文本分类的种类:二分类 单标签多分类 多标签多分类

文本分类的过程

1,获取数据2,训练集和验证集的划分3,训练模型4,使用模型进行预测和评估5,模型调优6,模型保存于重加载

1,获取数据,fasttext的数据集要求标签是“__label__ 类别名”这种格式如果是多标签:“

__label__ 类别名1 __label__ 类别名2 ”这种格式

2.训练集和验证集划分

3.训练模型

fasttext.train_supervised是 FastText 中专门用于监督式文本分类训练的函数

import fasttext def dm01_train_data(): # 进行训练 # 使用fasttext的train_supervised方法进行文本分类模型的训练 model = fasttext.train_supervised('../data/cooking_train.txt') result=model.predict("Which baking dish is best to bake a banana bread ?") print(f'result: {result}') result3=model.test('../data/cooking_valid.txt') # 测试结果: (3000, 0.138, 0.05967997693527462) # 验证集样本 精度 召回率 print(f'测试结果: {result3}')

数据处理

# 对数据进行预处理(统一大小写,符号和单词分离) def dm02_preprocess(): # 获取训练模型 model = fasttext.train_supervised('../data/cooking.pre.train') result = model.test('../data/cooking.pre.valid') # (3000, 0.174, 0.07524866657056364) print(f'result: {result}')

增加训练轮数

# 增加训练轮数 def dm03_epochs(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',epoch=25) # 模型的测试 result = model.test('../data/cooking.pre.valid') # (3000, 0.5183333333333333, 0.22416029984143002) print(f'result: {result}')

调整学习率

# 调整学习率 def dm04_lr(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',lr=1.0,epoch=25) # 模型的测试 result = model.test('../data/cooking.pre.valid') # result: (3000, 0.581, 0.2512613521695257) print(f'result: {result}')

增加n-gram特征

# 增加n-gram特征,相邻 def dm05_ngram(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',lr=1.0,epoch=50,wordNgrams=2) # 模型的测试 result = model.test('../data/cooking.pre.valid') # (3000, 0.6316666666666667, 0.27317284128585845) print(f'result: {result}')

改变损失函数的计算方式

# 改变损失的计算方式 def dm06_loss(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',lr=1.0,epoch=50,wordNgrams=2,loss='hs') # 模型的测试 result = model.test('../data/cooking.pre.valid') # result: (3000, 0.6043333333333333, 0.2613521695257316) print(f'result: {result}')

自动参数调优

# 自动超参数调优autotuneValidationFile参数需要指定验证数据集所在路径, 它将在验证集上使用随机搜索方法寻找可能最优的超参数. # 使用autotuneDuration参数可以控制随机搜索的时间, 默认是300s def dm07_auto(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train', autotuneValidationFile='../data/cooking.pre.valid',autotuneDuration=300) # 模型的测试 result = model.test('../data/cooking.pre.valid') # result: (3000, 0.5803333333333334, 0.2509730431022056) print(f'result: {result}')

多标签多分类

# 多标签多分类形式 def dm08_ova(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',lr=0.5,epoch=50,wordNgrams=2,loss='ova') # 模型的测试 result = model.test('../data/cooking.pre.valid') # result: (3000, 0.6113333333333333, 0.26437941473259335) print(f'result: {result}')

模型的保存和重加载

# 模型的保存和重加载 def dm09_save(): # 获取有监督模型 model = fasttext.train_supervised('../data/cooking.pre.train',lr=0.5,epoch=50,wordNgrams=2) # 模型的保存 model.save_model('../model/fasttext_model.bin') # 模型的重加载 model = fasttext.load_model('../model/fasttext_model.bin') # 模型的测试 result = model.test('../data/cooking.pre.valid') # result: (3000, 0.6113333333333333, 0.26437941473259335) print(f'result: {result}')

训练词向量:

用向量表示文本中的词汇(或字符)是现代机器学习中最流行的做法, 这些向量能够很好的捕捉语言之间的关系, 从而提升基于词向量的各种NLP任务的效果.

训练词向量过程:

第一步: 获取数据

第二步: 训练词向量

第三步: 模型超参数设定

第四步: 模型效果检验

第五步: 模型的保存与重加载

http://www.cnnetsun.cn/news/69946.html

相关文章:

  • STM32CubeMX的main.c开头介绍
  • 26.MPSOC FPGA linux读AHT20传感器
  • 嵌入式系统时序图完全指南:从原理到实战
  • 小团队与大团队的管理差异
  • [CISCN2019 华东南赛区]Web4
  • AI编程革命!Claude Skills大揭秘:小白也能快速上手的Agent开发神器,大模型开发者必看!
  • 内点法求最优潮流附matlab代码
  • 三相PWM整流器有限集模型预测电流控制附Simulink仿真模型
  • 光伏四可“可观”功能:光伏电站全景数字化的底层支撑技术
  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别
  • 若依物联网
  • PSEN1抗体:如何揭示阿尔茨海默病致病机制与治疗新靶点?
  • Docker Engine 升级指南:保障容器安全的关键步骤
  • 基于zigbee灯光控制照明及色温调节系统的设计与实现(有完整资料)
  • 7、Python高级语法:描述器、属性与元编程实战
  • 【开题答辩全过程】以 基于java技术的校园一卡通系统的设计与实现为例,包含答辩的问题和答案