自然语言处理NLP入门 -- 第四节文本分类
目标
本章的目标是帮助你理解文本分类的基本概念,并通过具体示例学习如何使用 scikit-learn
训练文本分类模型,以及如何利用 OpenAI API 进行文本分类。
5.1 什么是文本分类?
文本分类(Text Classification)是自然语言处理(NLP)中的一个基础任务,指的是将文本数据自动归类到一个或多个预定义类别中的过程。例如:
- 垃圾邮件检测:判定邮件是“垃圾邮件”还是“正常邮件”。
- 情感分析:分析评论或社交媒体上的文本,判断其情感是“正面”、“负面”还是“中性”。
- 新闻分类:将新闻归类到“体育”、“政治”、“科技”等类别。
文本分类的常见方法
- 基于规则的方法:使用关键字匹配等方法进行分类,适用于简单场景。
- 机器学习方法:使用
scikit-learn
训练分类模型,如朴素贝叶斯(Naïve Bayes)
、支持向量机(SVM)
等。 - 深度学习方法:使用
BERT
、LSTM
、Transformer
等深度神经网络进行分类,适用于大规模数据。 - 预训练模型(如 OpenAI API):直接使用强大的 NLP 模型进行分类,无需训练自己的模型。
5.2 使用 scikit-learn
训练文本分类模型
步骤
- 准备数据集
- 文本预处理(分词、去停用词、向量化)
- 训练分类模型
- 测试和评估模型
示例 1:垃圾邮件分类
我们使用 scikit-learn
的 Pipeline
训练一个简单的垃圾邮件分类器。
Step 1:安装必要的库
!pip install scikit-learn numpy pandas nltk
Step 2:导入所需库
import pandas as pd # 用于处理数据集
import numpy as np # 用于数值计算
import nltk # 自然语言处理工具包
from sklearn.model_selection import train_test_split # 用于数据集划分
from sklearn.feature_extraction.text import TfidfVectorizer # 用于文本特征提取
from sklearn.naive_bayes import MultinomialNB # 朴素贝叶斯分类器
from sklearn.pipeline import Pipeline # 机器学习流水线(自动化处理流程)
from sklearn.metrics import accuracy_score, classification_report # 评估模型性能
Step 3:加载数据
我们使用一个简单的数据集,其中包含邮件内容及其分类(ham
表示正常邮件,spam
表示垃圾邮件)。
# 创建一个简单的数据集
data = {"text": ["Get free money now!","Hello, how are you?","Congratulations! You have won a prize.","Call me when you get a chance.","Claim your free gift today!","Meeting at 3 PM, don't be late.","Win a brand new iPhone now!"],"label": ["spam", "ham", "spam", "ham", "spam", "ham", "spam"]
}# 转换数据为 Pandas DataFramedf = pd.DataFrame(data)# 将标签(类别)转换为数值(spam = 1, ham = 0)
df['label'] = df['label'].map({'spam': 1, 'ham': 0})
print(df)
示例输出:
text label
0 Get free money now! 1
1 Hello, how are you? 0
2 Congratulations! You have won a prize. 1
3 Call me when you get a chance. 0
4 Claim your free gift today! 1
5 Meeting at 3 PM, don't be late. 0
6 Win a brand new iPhone now! 1
Step 4:数据预处理
TfidfVectorizer
:将文本转换为数值向量,去除停用词(如the
,and
)。MultinomialNB
:使用朴素贝叶斯算法进行分类。
# 划分数据集(80% 训练,20% 测试)
X_train, X_test, y_train, y_test = train_test_split(df["text"], df["label"], test_size=0.2, random_state=42)# 创建文本分类管道(Pipeline)
pipeline = Pipeline([("tfidf", TfidfVectorizer(stop_words="english")), # 文本向量化并去除停用词("classifier", MultinomialNB()) # 朴素贝叶斯分类器
])# 训练模型
pipeline.fit(X_train, y_train)# 进行预测
y_pred = pipeline.predict(X_test)# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
Step 5:测试新文本
new_texts = ["Win a free iPhone!", "Meeting at 9 PM online.", "Get rich fast with this simple trick!"]
predictions = pipeline.predict(new_texts)for text, label in zip(new_texts, predictions):print(f"'{text}' -> {'Spam' if label == 1 else 'Ham'}")
示例输出:
'Win a free iPhone!' -> Spam
'Meeting at 9 PM online.' -> Ham
'Get rich fast with this simple trick!' -> Spam
5.3 使用 OpenAI API 进行文本分类
如果你不想训练自己的模型,可以直接使用 OpenAI 的 GPT 进行文本分类。
步骤
- 获取 OpenAI API Key
- 调用 OpenAI API 进行文本分类
- 解析 API 结果
Step 1:安装 openai
库
!pip install openai
Step 2:编写 API 调用代码
import openai# 设置 API Key(你需要在 OpenAI 官网申请)
openai.api_key = "your-api-key"def classify_text(text):response = openai.chat.completions.create(model="gpt-4",messages=[{"role": "system", "content": "You are a text classification assistant."},{"role": "user", "content": f"Classify the following message as 'spam' or 'ham': {text}"}])return response.choices[0].message.content# 测试 API
test_messages = ["Win a free iPhone!", "Let's have lunch together."]
for msg in test_messages:print(f"'{msg}' -> {classify_text(msg)}")
示例输出
'Win a free iPhone!' -> I would classify this message as 'spam'.
'Let's have lunch together.' -> The message "Let's have lunch together" can be classified as 'ham'.
总结
- 你学习了 文本分类的基本概念。
- 你用
scikit-learn
训练了一个垃圾邮件分类器。 - 你使用 OpenAI API 进行文本分类,并且可以轻松调用预训练模型。
- 你可以尝试 不同的数据集和任务,比如情感分析、新闻分类等。
下节课,我们将介绍词向量和文本表示(Word Embeddings),帮助你理解 NLP 如何将文本转化为计算机可理解的数值表示! 🚀
相关文章:
自然语言处理NLP入门 -- 第四节文本分类
目标 本章的目标是帮助你理解文本分类的基本概念,并通过具体示例学习如何使用 scikit-learn 训练文本分类模型,以及如何利用 OpenAI API 进行文本分类。 5.1 什么是文本分类? 文本分类(Text Classification)是自然语…...

【redis】数据类型之bitmaps
Redis的Bitmaps是一种基于字符串的数据结构,用于处理位级别的操作。虽然Bitmaps在Redis中并不是一种独立的数据类型,而是基于字符串实现的,但它们提供了高效的位操作功能,适用于需要处理大量布尔值或二进制数据的场景。 基本概念…...

计算机网络-MPLS转发原理
在上一篇关于 MPLS 基础的文章中,我们了解了 MPLS 的基本概念、术语以及它在网络中的重要性。今天,我们将深入探讨 MPLS 转发的原理与流程,帮助大家更好地理解 MPLS 是如何在实际网络中工作的。 一、MPLS 转发概述 MPLS 转发的本质是将数据…...

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos
一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施,它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos,服务在启动时可以自动注册,而其他服务则可以通过名称来查找并访问这些注册好的实例。同时,Nacos…...
【每日关注】科技圈重要动态
时代新动态 2025 年 2 月 12 日科技圈重要动态总结全球 AI 治理新进展巴黎 AI 宣言签署,美英缺席 科技巨头合作与竞争苹果联姻阿里开发中国版AI功能DeepSeek生态持续扩展OpenAI拒绝马斯克收购,矛盾公开化 汽车行业动态小米汽车销量跃居新势力第二比亚迪智…...
【算法】用C++实现A*算法
A*算法的背景与原理 A*(A-Star)算法是一种广泛应用于路径规划和图搜索问题中的启发式搜索算法。它结合了Dijkstra算法的广度优先搜索和贪心最佳优先搜索的优点,通过引入启发式函数来估计从当前节点到目标节点的成本,从而有效地减少搜索空间。A*算法的核心思想是使用一个评…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性
现代细胞计数仪采用自动化方法,在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力,而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下,自动对焦可能会失效,从而影响细胞…...

记一次Self XSS+CSRF组合利用
视频教程在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录: 确认 XSS 漏洞 确认 CSRF 漏洞 这个漏洞是我在应用程序的订阅表单中发现的一个 XSS 漏洞,只能通过 POST 请求进行利用。通常情况下,基于 POST 的…...
JVM 类加载子系统在干什么?
JVM 类加载子系统是什么? 类加载子系统(Class Loader Subsystem)是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行。 类加载器(ClassLoader)是 字节码的搬运工&…...
Golang轻松实现消息模板变量替换:text/template
text/template 是 Go 语言标准库中的一个包,用于生成文本输出。它通过解析模板并根据给定的数据执行模板来生成最终的文本。text/template 提供了强大的模板引擎,支持条件判断、循环、变量替换等功能。 基本概念 模板:模板是一个文本文件或…...

DeepSeek模型R1服务器繁忙,怎么解决?
在当今科技飞速发展的时代,人工智能领域不断涌现出令人瞩目的创新成果,其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能,在行业内掀起了一股热潮,吸引了无数目光。然而,如同许多前沿技术在发…...
《探秘Windows 10驱动开发:从入门到实战》
《探秘Windows 10驱动开发:从入门到实战》 为什么要在 Windows 10 编写驱动程序 在当今数字化时代,计算机已成为人们生活和工作中不可或缺的工具 ,而 Windows 10 作为一款广泛使用的操作系统,其生态系统的丰富性和复杂性不言而喻。在这个庞大的体系中,驱动程序扮演着举足…...

Golang的容器化部署流程
# Golang的容器化部署流程 什么是容器化部署 容器化部署是将应用程序、运行环境及其依赖项打包在一起,以便可以在任何环境中快速、一致地运行的技术。它提供了更高效的资源利用、更便捷的部署和更稳定的环境。 的容器化支持 天生支持跨平台编译,使得将Go…...
计算机网络,大白话
好嘞,咱就从头到尾,给你好好说道说道计算机网络里这些“门门道道”的概念: 1. 网络(Network) 啥是网络? 你可以把网络想象成一个“大Party”,大家(设备)聚在一起&#…...

智慧城市V4系统小程序源码独立版全插件全开源
智慧城市V4系统小程序源码:多城市代理同城信息服务的全域解决方案 在数字化浪潮的推动下,智慧城市已成为全球发展的核心战略。作为这一领域的革新者,智慧城市V4系统小程序源码凭借其多城市代理同城信息服务能力与多商家营销功能,…...
SpringBoot分布式应用程序和数据库在物理位置分配上、路由上和数量上的最佳实践是什么?
在设计和部署Spring Boot分布式应用程序时,物理位置分配、路由和数据库数量的最佳实践对系统性能、可用性和可维护性至关重要。以下是相关建议: 1. 物理位置分配 最佳实践: 靠近用户部署:将应用实例部署在靠近用户的数据中心&a…...
【LeetCode Hot100 哈希】两数之和、字母异位词分组、最长连续序列
哈希 1. 两数之和题目描述解题思路步骤:时间复杂度:空间复杂度: 代码实现 2. 字母异位词分组题目描述解题思路步骤:时间复杂度:空间复杂度: 代码实现 3. 最长连续序列题目描述解题思路关键思路:…...

Jenkins 通过 Execute Shell 执行 shell 脚本 七
Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…...
无人机常见的定位方式
目录 1、卫星导航定位 2、基于地面基站定位 3、惯性导航定位 4、视觉定位 5、其他定位技术 目前无人机的定位方式主要有以下几种: 1、卫星导航定位 GPS 定位:全球定位系统是应用最广泛的卫星导航系统,无人机上的 GPS 接收器接收至少四…...

【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/dj…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...