NLP09-加强1-对比SVM

支持向量机(SVM)

(一)导入 SVM 相关库

(二) 修改模型初始化

(三) 比较

朴素贝叶斯分类器

SVM分类器


支持向量机(SVM)

代码修改基于NLP09-朴素贝叶斯问句分类(3/3)

(一)导入 SVM 相关库

from sklearn.svm import SVC  # 导入 SVM

(二) 修改模型初始化

    # 模型训练def train_model(self):self.to_vect()# 使用 SVM 替换朴素贝叶斯svm_model = SVC(kernel='linear', C=1.0)  # 线性核函数,C 是正则化参数svm_model.fit(self.train_vec, self.train_y)self.model = svm_model

详细解释SVM

参见 机器学习——支持向量机(SVM)

# 使用 SVM 替换朴素贝叶斯svm_model = SVC(kernel='linear', C=1.0)  # 线性核函数,C 是正则化参数

(三) 比较

性能评估指标主要是:准确性、精确率、召回率、F1-Score

朴素贝叶斯分类器

为了进行性能评估,我们需要使用 train_test_split 来分割数据集,并使用 sklearn.metrics 来计算准确性、精确率、召回率和 F1-Score。下面是修改后的完整代码,包含了数据集划分和各项评估指标的计算:

import os.path
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from common import constant
from ch import data_loader, nlp_utilclass QuestionClassify:def __init__(self):self.train_x = Noneself.train_y = Noneself.tfidf_vec = Noneself.train_vec = Noneself.model = Noneself.question_category_dict = None# 文本向量化def to_vect(self):if self.tfidf_vec is None:# 加载训练数据self.train_x, self.train_y = data_loader.load_train_data()# 初始化一个Tfidfself.tfidf_vec = TfidfVectorizer()# 确保 self.train_x 是字符串列表if isinstance(self.train_x[0], list):self.train_x = [" ".join(doc) for doc in self.train_x]self.train_vec = self.tfidf_vec.fit_transform(self.train_x).toarray()# 模型训练def train_model(self):self.to_vect()# 使用 train_test_split 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(self.train_vec, self.train_y, test_size=0.2, random_state=42)# 使用朴素贝叶斯模型nb_model = MultinomialNB(alpha=0.01)nb_model.fit(X_train, y_train)  # 训练模型self.model = nb_model# 预测并计算评估指标y_pred = self.model.predict(X_test)# 计算并打印评估指标accuracy = accuracy_score(y_test, y_pred)precision = precision_score(y_test, y_pred, average='weighted')recall = recall_score(y_test, y_pred, average='weighted')f1 = f1_score(y_test, y_pred, average='weighted')print(f"Accuracy: {accuracy:.4f}")print(f"Precision: {precision:.4f}")print(f"Recall: {recall:.4f}")print(f"F1-Score: {f1:.4f}")# 模型预测def predict(self, question):# 词性标注做电影相关实体的抽取question_cut = nlp_util.movie_pos(question)# 原问句列表(刘德华演过哪些电影)question_src_list = []# 转换后的问句(nr演过哪些电影)question_pos_list = []for item in question_cut:question_src_list.append(item.word)if item.flag in ['nr', 'nm', 'nnt']:question_pos_list.append(item.flag)else:question_pos_list.append(item.word)question_pos_text = [" ".join(question_pos_list)]# 文本向量化question_vect = self.tfidf_vec.transform(question_pos_text).toarray()# 输入模型进行预测,得到结果predict = self.model.predict(question_vect)[0]return predictdef init_question_category_dict(self):# 读取问题(类别-描述)映射文件question_category_path = os.path.join(constant.DATA_DIR, "question_classification.txt")with open(question_category_path, "r", encoding="utf-8") as file:question_category_list = file.readlines()self.question_category_dict = {}for category_item in question_category_list:category_id, category_desc = category_item.strip().split(":")self.question_category_dict[int(category_id)] = category_descdef get_question_desc(self, category):if self.question_category_dict is None:self.init_question_category_dict()return self.question_category_dict[category]if __name__ == "__main__":classify = QuestionClassify()classify.train_model()  # 训练模型并打印评估指标result = classify.predict("刘德华和成龙合作演过哪些电影呢?&&")print(classify.get_question_desc(result))print(result)

修改代码解析:

# 使用 train_test_split 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(self.train_vec, self.train_y, test_size=0.2, random_state=42)

详见 NLP06-Scikit-Learn 机器学习库(鸢尾花为例)的数据集拆分部分。

        # 预测并计算评估指标y_pred = self.model.predict(X_test)# 计算并打印评估指标accuracy = accuracy_score(y_test, y_pred)precision = precision_score(y_test, y_pred, average='weighted')recall = recall_score(y_test, y_pred, average='weighted')f1 = f1_score(y_test, y_pred, average='weighted')

 这几个指标是常用的分类模型评估指标。

(1) 准确率(Accuracy)

(2) 精确率(Precision)

(3) 召回率(Recall)

(4) F1-Score

输出结果:

SVM分类器

import os.path
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC  # 导入 SVM
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from common import constant
from ch import data_loader, nlp_utilclass QuestionClassify:def __init__(self):self.train_x = Noneself.train_y = Noneself.tfidf_vec = Noneself.train_vec = Noneself.model = Noneself.question_category_dict = None# 文本向量化def to_vect(self):if self.tfidf_vec is None:# 加载训练数据self.train_x, self.train_y = data_loader.load_train_data()# 初始化一个Tfidfself.tfidf_vec = TfidfVectorizer()# 确保 self.train_x 是字符串列表if isinstance(self.train_x[0], list):self.train_x = [" ".join(doc) for doc in self.train_x]self.train_vec = self.tfidf_vec.fit_transform(self.train_x).toarray()# 模型训练def train_model(self):self.to_vect()# 使用 train_test_split 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(self.train_vec, self.train_y, test_size=0.2, random_state=42)# 使用 SVM(支持向量机)替换朴素贝叶斯svm_model = SVC(kernel='linear', C=1.0)  # 线性核函数,C 是正则化参数svm_model.fit(X_train, y_train)  # 训练模型self.model = svm_model# 预测并计算评估指标y_pred = self.model.predict(X_test)# 计算并打印评估指标accuracy = accuracy_score(y_test, y_pred)precision = precision_score(y_test, y_pred, average='weighted', zero_division=0)recall = recall_score(y_test, y_pred, average='weighted', zero_division=0)f1 = f1_score(y_test, y_pred, average='weighted')print(f"Accuracy: {accuracy:.4f}")print(f"Precision: {precision:.4f}")print(f"Recall: {recall:.4f}")print(f"F1-Score: {f1:.4f}")# 模型预测def predict(self, question):# 词性标注做电影相关实体的抽取question_cut = nlp_util.movie_pos(question)# 原问句列表(刘德华演过哪些电影)question_src_list = []# 转换后的问句(nr演过哪些电影)question_pos_list = []for item in question_cut:question_src_list.append(item.word)if item.flag in ['nr', 'nm', 'nnt']:question_pos_list.append(item.flag)else:question_pos_list.append(item.word)question_pos_text = [" ".join(question_pos_list)]# 文本向量化question_vect = self.tfidf_vec.transform(question_pos_text).toarray()# 输入模型进行预测,得到结果predict = self.model.predict(question_vect)[0]return predictdef init_question_category_dict(self):# 读取问题(类别-描述)映射文件question_category_path = os.path.join(constant.DATA_DIR, "question_classification.txt")with open(question_category_path, "r", encoding="utf-8") as file:question_category_list = file.readlines()self.question_category_dict = {}for category_item in question_category_list:category_id, category_desc = category_item.strip().split(":")self.question_category_dict[int(category_id)] = category_descdef get_question_desc(self, category):if self.question_category_dict is None:self.init_question_category_dict()return self.question_category_dict[category]if __name__ == "__main__":classify = QuestionClassify()classify.train_model()  # 训练模型并打印评估指标result = classify.predict("刘德华和成龙合作演过哪些电影呢?&&")print(classify.get_question_desc(result))print(result)

输出结果:

 分析:

 朴素贝叶斯表现更好,可能原因如下:

  • 数据集较小:如果数据集较小,朴素贝叶斯可能会比 SVM 表现更好,因为 SVM 需要更多的数据来找到最优超平面。
  • 特征独立性假设成立:在文本分类任务中,词语之间的独立性假设可能并不会显著影响朴素贝叶斯的性能。
  • 参数调优不当:如果 SVM 的参数(如 C、kernel、gamma)没有调优好,性能可能会较差。
  • 类别分布均衡:如果数据集的类别分布较为均衡,朴素贝叶斯的性能可能会更好。

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

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

相关文章

Spring 源码硬核解析系列专题(八):Spring Security 的认证与授权源码解析

在前几期中,我们从 Spring 核心到 Spring Boot,再到 Spring Cloud,逐步探索了 Spring 生态的底层原理。作为企业级应用的关键组件,Spring Security 提供了全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本篇将深入 Spring Security 的源码,剖析…

DeepSeek 开源了 DeepEP

DeepSeek又开源了一个超强技术:DeepEP通信库。实现了MOE之间的通信,性能更强了! DeepEP作为全球首个专为MoE(专家混合)模型训练和推理量身定制的EP(专家并行)通信库,其诞生标志着通…

【C语言】指针笔试题

前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区,使用前需先按Fn键 1.1、功能区 ESC:退出 F1:显示帮助信息 F2:重命名 F4:重复上一步操作 F5:刷新网页 …

在 macOS 系统上安装 kubectl

在 macOS 系统上安装 kubectl 官网:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos/ 用 Homebrew 在 macOS 系统上安装 如果你是 macOS 系统,且用的是 Homebrew 包管理工具, 则可以用 Homebrew 安装 kubectl。 运行…

004 Kafka异常处理

6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易,希望能对大家给予帮助 想要获取更多资源? 点击链接获取

数据结构与算法:二维前缀和、二维差分及离散化技巧

前言 有一维的前缀和以及差分当然有二维的~ 一、二维前缀和 1.内容 二维前缀和就是求二维数组上从&#xff08;0,0&#xff09;位置到&#xff08;i,j&#xff09;位置的累加和。 2.模板——二维区域和检索 - 矩阵不可变 class NumMatrix { public:vector<vector<i…

在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?

文章目录 父组件中 <ave-form> 的使用add 模式下触发逻辑value 的传入情况是否触发 getProducts()&#xff1f; 验证 add 模式下 getProducts() 是否触发结论&#xff1a; 检查父组件传入 value 的完整情况如何明确知道父组件传入的 value最终回答 父组件 index.vue子组件…

第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子

编程实现&#xff1a; 小猫照镜子。(背景非源素材) 具体要求&#xff1a; 1). 运行程序&#xff0c;角色、背景如图所示&#xff1b; 完整题目可点击下方链接查看&#xff0c;支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…

React + TypeScript 实现数据库逆向生成数据模型指南

React TypeScript 实现数据库逆向生成数据模型全栈指南 引言&#xff1a;逆向工程在现代开发中的价值 在微服务架构和快速迭代的背景下&#xff0c;数据库逆向生成数据模型已成为提升开发效率的核心技术。传统手动编写模型的方式存在模式同步延迟和类型安全缺失两大痛点。本文…

Android Audio实战——音频相关基础概念(附)

Android Audio 开发其实就是媒体源数字化的过程,通过将声波波形信号通过 ADC 转换成计算机支持的二进制的过程叫做音频采样 (Audio Sampling)。采样 (Sampling) 的核心是把连续的模拟信号转换成离散的数字信号。 一、声音的属性 1、响度 (Loudness) 响度是指人类可以感知到的…

小程序类目调整汇总公告

各位小程序开发者&#xff1a; 为进一步加强平台的规范管理&#xff0c;优化开发者类目选择体验&#xff0c;现对以下类目进行调整&#xff0c;请各位开发者知悉。 类目新增 非个人主体 #【交通服务-国际客运】 现资质要求 &#xff08;2选1&#xff09;&#xff1a; 1…

python的列表和元组别再傻傻分不清啦

目录 什么是下标&#xff1a; 正数索引&#xff1a;正数索引从左到右&#xff0c;从 0 开始。 负数索引&#xff1a;负数索引从右到左&#xff0c;从 -1 开始。 切片&#xff08;slice&#xff09;&#xff1a;除了单个元素&#xff0c;Python还支持通过切片访问序列的子集。…

dubbo转http方式调用

业务背景&#xff1a;在当前项目下&#xff0c;所有前端请求均通过外层网关转发到后端这边的dubbo服务&#xff0c;现计划去掉网关层&#xff0c;由前端直接http调用后端dubbo。 解决方案&#xff1a;在前端调用方式不变的前提下&#xff0c;后端服务新建controller层&#xf…

OpenHarmony构建系统实践-跨部件引用

上一篇通过gn构建系统利用部件构建了可执行程序、动态库和配置文件&#xff0c;以及部件内的引用&#xff0c;本篇通过实现跨部件的模块引用&#xff0c;通过实现部件间的使用方法&#xff0c;以此来达到复用三方部件和模块库的目的。 本节以实现两个自定义的部件为例&#xff…

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…

Windows 11【1001问】如何安装Windows 11

紧接上篇内容&#xff0c;本文详细介绍了从准备工作到具体安装步骤的完整流程&#xff0c;帮助用户顺利完成Windows 11系统的安装。内容涵盖了ISO镜像文件的下载与校验、启动U盘的制作、硬件兼容性检查&#xff0c;以及BIOS/UEFI设置和系统安装过程中的关键步骤。通过逐步指导&…

Chromedriver与Chrome版本映射表

‌Chromedriver与Chrome版本映射表‌如下&#xff1a; ‌Chrome 71-73版本对应Chromedriver 2.46‌‌Chrome 70-72版本对应Chromedriver 2.45‌‌Chrome 69-71版本对应Chromedriver 2.44‌‌Chrome 68-70版本对应Chromedriver 2.43‌‌Chrome 67-69版本对应Chromedriver 2.42‌…

LSM-Tree (日志结构合并树)

LSM-Tree&#xff08;日志结构合并树&#xff09;是一种高效处理写操作的存储结构&#xff0c;广泛应用于NoSQL数据库如LevelDB和RocksDB。其核心思想是将随机写入转换为顺序写入&#xff0c;提升吞吐量。以下是其原理及Java实现示例&#xff1a; ### **LSM-Tree 原理** 1. **…