fasttext工具介绍

fastText是由Facebook Research团队于2016年开源的一个词向量计算和文本分类工具。尽管在学术上并未带来巨大创新,但其在实际应用中的表现却非常出色,特别是在文本分类任务中,fastText往往能以浅层网络结构取得与深度网络相媲美的精度,同时在训练时间上远快于深度网络。 

​​​​​​​ 

fasttext工具包

作为NLP工程领域常用的工具包, fasttext有两大作用💥

  • 进行文本分类
  • 训练词向量

fasttext工具包的优势

快速的进行训练和预测是fasttext的最大优势,fasttext工具包中内含的fasttext模型具有十分简单的网络结构,使用fasttext模型训练词向量时使用层次softmax结构, 来提升超多类别下的模型性能,由于fasttext模型过于简单无法捕捉词序特征, 因此会进行n-gram特征提取以弥补模型缺陷提升精度。

fasttext的安装

pip install fasttext

💯验证:

import fasttext
  • 如果执行上述命令后没有报错,且Python解释器没有提示“ModuleNotFoundError: No module named 'fasttext'”等错误信息,则说明fasttext已经成功安装。

fasttext文本分类 

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

文本分类种类 :

  • 二分类:
    • 文本被分类两个类别中, 往往这两个类别是对立面, 比如: 判断一句评论是好评还是差评.
  • 单标签多分类:
    • 文本被分入到多个类别中, 且每条文本只能属于某一个类别(即被打上某一个标签)
  • 多标签多分类:
    • 文本被分人到多个类别中, 但每条文本可以属于多个类别(即被打上多个标签)

fastText 库常用方法 :

训练词向量模型

使用fastText可以训练词向量模型,这些词向量能够捕捉单词之间的语义关系。训练词向量的基本命令格式如下:

./fasttext skipgram -input input.txt -output model

这里,-input参数指定输入文件,-output参数指定输出模型文件的名称。skipgram是训练词向量时使用的算法,类似于word2vec中的skip-gram算法。

2. 训练文本分类模型

fastText的主要用途之一是文本分类。它支持监督学习模式下的文本分类,训练命令的基本格式如下:

./fasttext supervised -input train.txt -output model

或者,在Python中,可以使用train_supervised方法:

import fasttext  model = fasttext.train_supervised('train.csv', lr=1.0, wordNgrams=2, epoch=25, ...)

其中,train.txttrain.csv是包含训练数据的文件,每行文本前通常带有标签(例如__label__类别)。lr是学习率,wordNgrams是n-gram的最大长度,epoch是训练的轮数等。这些参数可以根据具体任务进行调整以优化模型性能。

3. 模型预测

训练完成后,可以使用fastText模型对新的文本数据进行分类预测。在命令行中,可以使用predict命令:
在Python中,可以使用predict方法:

predictions = model.predict(x)  # x是待预测的文本

4. 模型评估

为了评估模型的性能,可以使用测试集数据,并计算准确率、召回率等指标。在Python中,虽然fastText库本身不直接提供评估函数,但你可以自己编写代码来计算这些指标,或者将预测结果与测试集的标签进行比较。

5. 模型保存与加载

训练好的模型可以保存为二进制文件,以便将来使用。在Python中,可以使用save_model方法保存模型:

model.save_model("model_cooking.bin")

加载模型时,使用load_model函数:

model = fasttext.load_model("model_cooking.bin")

文本分类实现

数据集介绍,本案例烹饪相关的数据集, 它是由facebook AI实验室提供的演示数据集

# 查看数据的前10条
$ head cooking.stackexchange.txt#
__label__sauce __label__cheese How much does potato starch affect a cheese sauce recipe?
__label__food-safety __label__acidity Dangerous pathogens capable of growing in acidic environments
__label__cast-iron __label__stove How do I cover up the white spots on my cast iron stove?
__label__restaurant Michelin Three Star Restaurant; but if the chef is not there
__label__knife-skills __label__dicing Without knife skills, how can I quickly and accurately dice vegetables?
__label__storage-method __label__equipment __label__bread What's the purpose of a bread box?
__label__baking __label__food-safety __label__substitutions __label__peanuts how to seperate peanut oil from roasted peanuts at home?
__label__chocolate American equivalent for British chocolate terms
__label__baking __label__oven __label__convection Fan bake vs bake
__label__sauce __label__storage-lifetime __label__acidity __label__mayonnaise Regulation and balancing of readymade packed mayonnaise and other sauces
  • fasttext工具支持多种格式的输入数据,包括这种以__label__前缀标记类别的格式。在这种格式中,每个样本的类别被前缀__label__所标记,后跟实际的类别名称,然后是文本内容。这种格式使得fasttext能够轻松地识别每个样本的类别和对应的文本,从而进行文本分类任务。

训练集与验证集的划分

# 查看数据总数
$ wc cooking.stackexchange.txt 15404  169582 1401900 cooking.stackexchange.txt 

# 12404条数据作为训练数据
$ head -n 12404 cooking.stackexchange.txt > cooking.train
# 3000条数据作为验证数据
$ tail -n 3000 cooking.stackexchange.txt > cooking.valid
  • 使用head命令来获取cooking.stackexchange.txt文件的前12404行,并将这部分内容重定向(>)到cooking.train文件中,作为训练数据。

训练模型 

# 导入fasttext
import fasttext
# 使用train_supervised方法进行文本分类模型的训练
model = fasttext.train_supervised(input="cooking/cooking.train")
  • 其中 input 参数是一个字符串,指定了训练数据文件的路径。

使用模型进行预测并评估

model.predict("Which baking dish is best to bake a banana bread ?")、
# 元组中的第一项代表标签, 第二项代表对应的概率
(('__label__baking',), array([0.06550845]))

通过我们常识可知预测是错误的

model.predict("Why not put knives in the dishwasher?")
(('__label__food-safety',), array([0.07541209]))

模型调优

通过查看数据, 我们发现数据中存在许多标点符号与单词相连以及大小写不统一,这些因素对我们最终的分类目标没有益处, 反是增加了模型提取分类规律的难度,因此我们选择将它们去除或转化。

# 处理前的部分数据
__label__fish Arctic char available in North-America
__label__pasta __label__salt __label__boiling When cooking pasta in salted water how much of the salt is absorbed?
__label__coffee Emergency Coffee via Chocolate Covered Coffee Beans?
__label__cake Non-beet alternatives to standard red food dye
__label__cheese __label__lentils Could cheese "halt" the tenderness of cooking lentils?
__label__asian-cuisine __label__chili-peppers __label__kimchi __label__korean-cuisine What kind of peppers are used in Gochugaru ()?
__label__consistency Pavlova Roll failure
__label__eggs __label__bread What qualities should I be looking for when making the best French Toast?
__label__meat __label__flour __label__stews __label__braising Coating meat in flour before browning, bad idea?
__label__food-safety Raw roast beef on the edge of safe?
__label__pork __label__food-identification How do I determine the cut of a pork steak prior to purchasing it?

cat cooking.stackexchange.txt | sed -e "s/\([.\!?,'/()]\)/ \1 /g" | tr "[:upper:]" "[:lower:]" > cooking.preprocessed.txt

处理后的部分数据:

__label__fish arctic char available in north-america
__label__pasta __label__salt __label__boiling when cooking pasta in salted water how much of the salt is absorbed ?
__label__coffee emergency coffee via chocolate covered coffee beans ?
__label__cake non-beet alternatives to standard red food dye
__label__cheese __label__lentils could cheese "halt" the tenderness of cooking lentils ?
__label__asian-cuisine __label__chili-peppers __label__kimchi __label__korean-cuisine what kind of peppers are used in gochugaru  (  )  ?
__label__consistency pavlova roll failure
__label__eggs __label__bread what qualities should i be looking for when making the best french toast ?
__label__meat __label__flour __label__stews __label__braising coating meat in flour before browning ,  bad idea ?
__label__food-safety raw roast beef on the edge of safe ?
__label__pork __label__food-identification how do i determine the cut of a pork steak prior to purchasing it ?

然后重新训练,再增加训练轮数,增加n-gram特征...

模型保存与重加载

model.save_model("model/model_cooking.bin")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

长沙理工大学本科毕业论文(Latex模板)补充

🎈🎈🎈本模板不是原创,来自于github公开的项目。 具体链接是https://github.com/csust-latex-sig/CSUSTBachelorThesis 某大佬开源的,我用了之后做了点补充说明。(😝) 一、Latex的安…

用GPT做足球预测案例分享

自从GPT出来后,一直想利用GPT的能力做点什么,想了很多项目,比如用GPT写小说,用GPT做股票分析,用GPT写营销文章,最终我选了一个比较有意思的方向:GPT足球预测。因为每天都有足球比赛,…

Maven一键配置阿里云远程仓库,让你的项目依赖飞起来!

文章目录 引言一、为什么选择阿里云Maven仓库?二、如何设置Maven阿里云远程仓库?三、使用阿里云Maven仓库的注意事项总结 引言 在软件开发的世界里,Maven无疑是一个强大的项目管理工具,它能够帮助我们自动化构建、依赖管理和项目…

比较两个已排过序的文件的命令comm

比较两个已排过序的文件的命令comm There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave qui…

QT5.14.2与Mysql8.0.16配置笔记

1、前言 我的QT版本为 qt-opensource-windows-x86-5.14.2。这是QT官方能提供的自带安装包的最近版本,更新的版本需要自己编译源代码,可点击此链接进行下载:Index of /archive/qt/5.14/5.14.2,选择下载 qt-opensource-windows-x86…

为什么固定尺寸 AdSense 广告依旧会出现并非指定的尺寸广告?

经常在网站上投放谷歌 AdSense广告的站长应该都碰到过,明明投放的是固定尺寸的广告位里旧会出现并非指定尺寸的AdSense 广告,很诡异的感觉。其实这都是因为你的 AdSense 账号广告优化造成的,其中里面就包含了广告尺寸优化,只需要在…

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六:Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法,了解Spring是如何处理特殊的beanName(带&符号前缀)与Spring的别名机制。今天我们继续往方法下面看: doGetBean 这个方法…

Vue笔记11-Composition API的优势

Options API存在的问题 使用传统Options API中,新增或者修改一个需求,就需要分别在data,methods,computed里修改,而这些选项分布在代码的各个地方,中间还穿插着其他Optional API,如果代码量上来…

表单代码示例

<template><el-form ref"form" :model"formData" :rules"formRules" label-width"100px"><el-form-item label"姓名" prop"name"><el-input v-model"formData.name"></el-i…

何为vue脚手架?

一. vue脚手架的基本知识 1. Vue脚手架是什么&#xff1f; ① Vue脚手架&#xff0c;也称为Vue CLI或vue-cli&#xff08;Command Line Interface&#xff09;&#xff1b;② Vue脚手架是一个基于Vue.js的快速生成项目股价的工具&#xff0c;它可以帮助开发者快速搭建一个带有r…

hadoop集群常用命令搜集——筑梦之路

服务启停命令 # 脚本启停hadoop全部服务(master节点执行&#xff0c;各节点需配置免密)./start-all.sh # 包含yarn(ResourceManager,NodeManager)和hdfs(JournalNode,NameNode, DataNode, DFSZKFailoverController) ./stop-all.sh# 脚本启停ResourceManager,NodeManager./s…

JAVA之(方法的重载与重写、this关键字、super关键字)

方法的重载与重写 一、方法的重载与重写1、回顾方法的定义2、重载的概念3、重写 二、this关键字1、何为this方法2、使用方法&#xff08;1&#xff09;在构造方法中指构造器所创建的新对象&#xff08;2&#xff09; 方法中指调用该方法的对象&#xff08;3&#xff09; 在类本…

【ARMv8/v9 GIC 系列 6 -- 中断优先级详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt prioritizationInterrupt Priority ValueSGI And PPI Priority SetSecure And Non-secure Priority AccessInterrupt prioritization 在ARM GICv3和GICv4架构中,中断的优先级化(prioritization)是通过以下几种方式来描…

centos7.9 rpm包安装mysql8.2.0数据库、root设置客户端登录、配置并发、表名大小写敏感、启动重启指令等记录

centos安装mysql8数据库,下载的是rpm-bundle.tar包,这样可以在内网环境离线安装,工作中医院的服务器很多也是内网的,所以这里记录下rpm-bundle.tar包安装的步骤。 lscpu 查看处理器是x86还是arm 下载对应的版本 bundle tar包 ((mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar))…

2023年了,还在手动px转rem吗?

px-to-rem 使用amfe-flexible和postcss-pxtorem在webpack中配置px转rem npm i amfe-flexible -Snpm i postcss-pxtorem -D在main.js中 import flexible from amfe-flexible Vue.use(flexible);index.html中 <meta name"viewport" content"widthdevice-w…

onMouseEnter和onMouseOver区别

onMouseEnter 和 onMouseOver 是两个在 JavaScript 中用于处理鼠标事件的不同事件。 onMouseEnter&#xff1a; 当鼠标指针进入元素的边界时触发。事件只在鼠标从元素外部进入到元素内部时触发一次&#xff0c;不会冒泡。如果鼠标指针进入了元素的子元素&#xff0c;不会触发父…

Web3D引擎,three.js堪称扛把子,Babylon.js差点意思。

涉及到Web3D开发&#xff0c;Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎&#xff0c;用于创建交互式的3D图形应用程序&#xff0c;但要细论起来&#xff0c;three.js普及度远超Babylon .js. 一、二者的介绍 Three.js&#xff1a; Three.js 是一…

13、广告-算法优化

算法优化 算法优化在程序化广告中起着至关重要的作用&#xff0c;通过优化算法可以提高广告投放的精准度和效果。算法优化涉及多个方面&#xff0c;包括广告投放策略、用户行为分析、竞价算法和实时数据处理等。 &#xff08;一&#xff09;广告投放策略优化 广告投放策略是…

Socket编程用到的函数TCP UDP实例

最基本的 Socket 模型 参考这次答应我&#xff0c;一举拿下 I/O 多路复用&#xff01; (qq.com) Socket编程详解-CSDN博客 Socket是一种通信机制&#xff0c;通过它可以在不同主机之间进行数据交换。在Socket编程中&#xff0c;有两种常见的通信模式&#xff1a;客户端-服务…

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…