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

【设计模式】使用python 实践框架设计

  1. 单一职责原则(SRP):一个类应该只有一个职责,意味着该类只应该有一个引起变化的原因。这使得代码更易于维护和理解。

  2. 开放封闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着可以通过添加新代码来扩展功能,而不是修改现有代码。

  3. 里氏替换原则(LSP):子类对象应该能够替换父类对象而不影响程序的正确性。这要求子类必须完全实现父类的行为。

  4. 接口隔离原则(ISP):不应强迫一个类依赖于它不使用的接口。多个特定客户端接口要好于一个通用接口。

  5. 依赖反转原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

  6. 合成复用原则(CRP):优先使用对象组合而不是继承来达到复用的目的。组合可以提供更灵活的解决方案,并且避免了继承带来的复杂性。

结合机器学习中大模型微调的数据处理场景,尝试梳理学习以下设计模式:

  • 模板方法模式 (Template Method):在方法中定义算法框架。
  • 策略模式 (Strategy):定义一系列算法,使算法可以互换,提高系统的灵活性。
  • 组合模式 (Composite):部分-整体层次关系,简化对复杂树形结构的操作。
  • 适配器模式 (Adapter):将一个接口转换为另一个接口,解决不兼容接口的问题,增加系统的可复用性。
  • 建造者模式 (Builder):构建复杂对象的步骤,逐步配置对象,便于管理和扩展。
  • 工厂方法模式 (Factory Method):需要创建对象时,子类决定具体类,增加新形状时,不需要修改现有代码,只需实现新类。
#coding:utf8
import pandas as pd
from abc import ABC, abstractmethod
import jsonclass Trainset:def __init__(self):self.raw_data_path = Noneself.feature_column_list = Noneself.label_strategy = Noneself.trainset_ratio = Noneself.train_data = Noneself.test_data = Noneself.oversample = Noneself.data_format = Nonedef __str__(self):return f"raw data path: {self.raw_data_path}\nfeature_column_list: {self.feature_column_list}\nlabel_strategy: {self.label_strategy}\n" \f"trainset_ratio: {self.trainset_ratio}\ntrain_df: {len(self.train_data)}\ntest_df: {len(self.test_data)}\nsample:\n{self.train_data.iloc[7]}"def save_train_data(self, path):with open(path, "w", encoding="utf8") as fout:for i in range(len(self.train_data)):fout.write(self.train_data.iloc[i]+"\n")def save_test_data(self, path):with open(path, "w", encoding="utf8") as fout:for i in range(len(self.test_data)):fout.write(self.test_data.iloc[i] + "\n")
class LabelStrategy(ABC):@staticmethod@abstractmethoddef gen_label(row):passclass ImportantType1(LabelStrategy):@staticmethoddef gen_label(row):if row['是否重要新闻标签'] == 1 and row['判断条件一'] == 'Y':return 1else:return 0class ImportantType2(LabelStrategy):@staticmethoddef gen_label(row):if row['是否重要新闻标签'] == 1 and row['判断条件二'] == 'Y':return 1else:return 0class ImportantType3(LabelStrategy):@staticmethoddef gen_label(row):if row['是否重要新闻标签'] == 1 and row['判断条件三'] == 'Y':return 1else:return 0class ImportantType4(LabelStrategy):@staticmethoddef gen_label(row):if row['是否重要新闻标签'] == 1 and row['判断条件四'] == 'Y':return 1else:return 0class DataFormat(ABC):@staticmethod@abstractmethoddef transform(row):passclass BertDataFormat(DataFormat):@staticmethoddef transform(row):return str(row['label']) + "\t" + row["feature"]class QwenDataFormat(DataFormat):prompt = "请判断以下新闻会不会对对应股票价格造成重大负面影响,造成股价异常下跌?会导致股价大幅下跌输出1,不会输出0。新闻为:"@classmethod# classmethod和staticmethod的共同的是可以不实例化类就调用类内方法,区别是classmethod可以通过cls使用类内变量,而staticmethod无法调用类内变量def transform(cls, row):return json.dumps({"type": "chatml", "message":[{"role": "user", "content": cls.prompt+row['feature']},{"role": "assistant", "content": str(row['label'])}],"source": "self-made"}, ensure_ascii=False)class TrainsetBuilder:def __init__(self):self.trainset = Trainset()self.train_df = Noneself.test_df = Noneself.data_format_dict = {'bert': BertDataFormat,'qwen': QwenDataFormat}def set_data_path(self, raw_data_path):self.trainset.raw_data_path = raw_data_pathreturn selfdef set_feature(self, feature_column_list):self.trainset.feature_column_list = feature_column_listreturn selfdef set_label_strategy(self, label_strategy):self.trainset.label_strategy = label_strategyreturn selfdef set_trainset_ratio(self, ratio):self.trainset.trainset_ratio = ratioreturn selfdef set_data_format(self, data_format):self.trainset.data_format = data_formatreturn selfdef set_oversample(self, oversample=True):self.trainset.oversample = oversamplereturn selfdef balance_label(self):pos_df = self.train_df[self.train_df['label'].isin([1])]neg_df = self.train_df[self.train_df['label'].isin([0])]if len(neg_df) > 1.5 * len(pos_df):oversampel_ratio = int(len(neg_df)/len(pos_df))print(f"pos:{len(pos_df)}, neg:{len(neg_df)}, oversampel_ratio:{oversampel_ratio}")pos_df = pd.concat([pos_df] * oversampel_ratio, ignore_index=True)elif len(pos_df) > 1.5 * len(neg_df):oversampel_ratio = int(len(pos_df) / len(neg_df))print(f"pos:{len(pos_df)}, neg:{len(neg_df)}, oversampel_ratio:{oversampel_ratio}")neg_df = pd.concat([neg_df] * oversampel_ratio, ignore_index=True)train_df = pd.concat([pos_df, neg_df])self.train_df = train_df.sample(frac=1, random_state=87).reset_index(drop=True)def build(self):data_df = pd.read_csv(self.trainset.raw_data_path, encoding="gbk")data_df['feature'] = data_df.apply(lambda row: ",".join([row[i] for i in self.trainset.feature_column_list]),  axis=1)data_df['label'] = data_df.apply(lambda row: self.trainset.label_strategy.gen_label(row),  axis=1)data_df = data_df[['feature', 'label']]data_df = data_df.sample(frac=1, random_state=42).reset_index(drop=True)self.train_df = data_df.head(int(len(data_df) * self.trainset.trainset_ratio))self.test_df = data_df.tail(len(data_df) - len(self.train_df))if self.trainset.oversample:self.balance_label()self.trainset.train_data = self.train_df.apply(lambda row: self.data_format_dict.get(self.trainset.data_format, BertDataFormat).transform(row), axis=1)print(type(self.trainset.train_data))print(self.trainset.train_data)self.trainset.test_data = self.test_df.apply(lambda row: self.data_format_dict.get(self.trainset.data_format, BertDataFormat).transform(row), axis=1)return self.trainsetif __name__ == "__main__":builder = TrainsetBuilder()trainset = (builder.set_data_path("./raw_data/outputresult.csv").set_feature(['新闻标题']).set_label_strategy(ImportantType4) #ImportantType1, ImportantType2, ImportantType3, ImportantType4.set_trainset_ratio(0.8).set_oversample(True).set_data_format('bert') #bert, qwen.build())print(trainset)output_dir = "./data/"trainset.save_train_data(output_dir + "bert_train.tsv")trainset.save_test_data(output_dir + "bert_test.tsv")

相关文章:

【设计模式】使用python 实践框架设计

单一职责原则(SRP):一个类应该只有一个职责,意味着该类只应该有一个引起变化的原因。这使得代码更易于维护和理解。 开放封闭原则(OCP):软件实体(类、模块、函数等)应该…...

Apache paimon-CDC

CDC集成 paimon支持五种方式通过模式转化数据提取到paimon表中。添加的列会实时同步到Paimon表中 MySQL同步表:将MySQL中的一张或多张表同步到一张Paimon表中。MySQL同步数据库:将MySQL的整个数据库同步到一个Paimon数据库中。API同步表:将您的自定义DataStream输入同步到一…...

如何分析算法的执行效率和资源消耗

分析算法的执行效率和资源消耗可以从以下几个方面入手: 一、时间复杂度分析 定义和概念 时间复杂度是衡量算法执行时间随输入规模增长的速度的指标。它通常用大 O 符号表示,表示算法执行时间与输入规模之间的关系。例如,一个算法的时间复杂度为 O(n),表示该算法的执行时间…...

提示工程(Prompt Engineering)指南(进阶篇)

在 Prompt Engineering 的进阶阶段,我们着重关注提示的结构化、复杂任务的分解、反馈循环以及模型的高级特性利用。随着生成式 AI 技术的快速发展,Prompt Engineering 已经从基础的单一指令优化转向了更具系统性的设计思维,并应用于多轮对话、…...

音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现

一、引言 从《音视频入门基础:FLV专题(18)——Audio Tag简介》可以知道,未加密的情况下,FLV文件中的一个Audio Tag Tag header AudioTagHeader AUDIODATA。本文讲述FFmpeg源码中是怎样解码Audio Tag的AudioTagHead…...

前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML

HTML 基础入门&#xff1a;从零开始构建网页骨架 目录 1. 什么是 HTML&#xff1f;HTML 的核心作用 2. HTML 基本结构2.1 DOCTYPE 声明2.2 <html> 标签2.3 <head> 标签2.4 <body> 标签 3. HTML 常用标签详解3.1 标题标签3.2 段落和文本标签3.3 链接标签3.4 图…...

字符脱敏工具类

1、字符脱敏工具类 import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils;/*** 数据脱敏工具类** date 2024/10/30 13:44*/Slf4j public class DataDesensitizationUtils {public static final String STAR_1 "*";public static final …...

【jvm】jvm对象都分配在堆上吗

目录 1. 说明2. 堆上分配3. 栈上分配&#xff08;逃逸分析和标量替换&#xff09;4. 方法区分配5. 直接内存&#xff08;非堆内存&#xff09; 1. 说明 1.JVM的对象并不总是分配在堆上。2.堆是JVM用于存储对象实例的主要内存区域&#xff0c;存在一些特殊情况&#xff0c;对象…...

@AutoWired和 @Resource原理深度分析!

嗨&#xff0c;你好呀&#xff0c;我是猿java Autowired和Resource是 Java程序员经常用来实现依赖注入的两个注解&#xff0c;这篇文章&#xff0c;我们将详细分析这两个注解的工作原理、使用示例和它们之间的对比。 依赖注入概述 依赖注入是一种常见的设计模式&#xff0c;…...

C++设计模式创建型模式———原型模式

文章目录 一、引言二、原型模式三、总结 一、引言 与工厂模式相同&#xff0c;原型模式&#xff08;Prototype&#xff09;也是创建型模式。原型模式通过一个对象&#xff08;原型对象&#xff09;克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&am…...

重学SpringBoot3-Spring WebFlux之SSE服务器发送事件

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE&#xff1f;2. Spring Boot 3 响应式编程与 SSE为什么选择响应式编程实现 SSE&#xff1f; 3. 实现 SSE 的基本步骤3.…...

YOLO即插即用模块---AgentAttention

Agent Attention: On the Integration of Softmax and Linear Attention 论文地址&#xff1a;https://arxiv.org/pdf/2312.08874 问题&#xff1a; 普遍使用的 Softmax 注意力机制在视觉 Transformer 模型中计算复杂度过高&#xff0c;限制了其在各种场景中的应用。 方法&a…...

探索开源语音识别的未来:高效利用先进的自动语音识别技术20241030

&#x1f680; 探索开源语音识别的未来&#xff1a;高效利用自动语音识别技术 &#x1f31f; 引言 在数字化时代&#xff0c;语音识别技术正在引领人机交互的新潮流&#xff0c;为各行业带来了颠覆性的改变。开源的自动语音识别&#xff08;ASR&#xff09;系统&#xff0c;如…...

学习路之TP6--workman安装

一、安装 首先通过 composer 安装 composer require topthink/think-worker 报错&#xff1a; 分析&#xff1a;最新版本需要TP8&#xff0c;或装低版本的 composer require topthink/think-worker:^3.*安装后&#xff0c; 增加目录 vendor\workerman vendor\topthink\think-w…...

.NET内网实战:通过白名单文件反序列化漏洞绕过UAC

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧&#xff0c;对内网和后渗透感兴趣的朋友们可以订阅该电子报刊&#xff0c;解锁更多的报刊内容。 02基本介绍 03原理分析 在渗透测试和红…...

AI Agents - 自动化项目:计划、评估和分配

Agents: Role 角色Goal 目标Backstory 背景故事 Tasks&#xff1a; Description 描述Expected Output 期望输出Agent 代理 Automated Project: Planning, Estimation, and Allocation Initial Imports 1.本地文件helper.py # Add your utilities or helper functions to…...

Git的.gitignore文件

一、各语言对应的.gitignore模板文件 项目地址&#xff1a;https://github.com/github/gitignore 二、.gitignore文件不生效 .gitignore文件只是ignore没有被追踪的文件&#xff0c;已被追踪的文件&#xff0c;要先删除缓存文件。 # 单个文件 git rm --cached file/path/to…...

网站安全,WAF网站保护暴力破解

雷池的核心功能 通过过滤和监控 Web 应用与互联网之间的 HTTP 流量&#xff0c;功能包括&#xff1a; SQL 注入保护&#xff1a;防止恶意 SQL 代码的注入&#xff0c;保护网站数据安全。跨站脚本攻击 (XSS)&#xff1a;阻止攻击者在用户浏览器中执行恶意脚本。暴力破解防护&a…...

深度学习:梯度下降算法简介

梯度下降算法简介 梯度下降算法 我们思考这样一个问题&#xff0c;现在需要用一条直线来回归拟合这三个点&#xff0c;直线的方程是 y w ^ x b y \hat{w}x b yw^xb&#xff0c;我们假设斜率 w ^ \hat{w} w^是已知的&#xff0c;现在想要找到一个最好的截距 b b b。 一条…...

SparkSQL整合Hive后,如何启动hiveserver2服务

当spark sql与hive整合后&#xff0c;我们就无法启动hiveserver2的服务了&#xff0c;每次都要先启动hive的元数据服务&#xff08;nohup hive --service metastore&#xff09;才能启动hive,之前的beeline命令也用不了&#xff0c;hiveserver2的无法启动&#xff0c;这也导致我…...

前端路由如何从0开始配置?vue-router 的使用

在 Web 开发中&#xff0c;路由是指根据 URL 的不同部分将请求分发到不同的处理函数或页面的过程。路由是单页应用&#xff08;SPA, Single Page Application&#xff09;和服务器端渲染&#xff08;SSR, Server-Side Rendering&#xff09;应用中的一个重要概念。 在开发中如何…...

Java中的运算符【与C语言的区别】

目录 1. 算术运算符 1.0 赋值运算符&#xff1a; 1.1 四则运算符&#xff1a; - * / % 【取余与C有点不同】 1.2 增量运算符&#xff1a; - * / % * 【右侧运算结果会自动转换类型】 1.3 自增、自减&#xff1a;、-- 2. 关系运算符 3. 逻辑运算符 3.1 短路求值 3.2 【…...

二、基础语法

入门了解 注释 **作用&#xff1a;**在代码中加一些注释和说明&#xff0c;方便自己或者其他程序员阅读代码 两种格式&#xff1a; 单行注释&#xff1a;// 描述信息 通常放在一行代码的上方&#xff0c;或者一条语句的末尾&#xff0c;对该行代码进行说明 多行注释&#x…...

DB-GPT系列(一):DB-GPT能帮你做什么?

DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL and Agents)&#xff0c;围绕大模型提供灵活、可拓展的AI原生数据应用管理与开发能力&#xff0c;可以帮助企业快速构建、部署智能AI数据应用&#xff0c;通过智能数据分析、洞察…...

【Python各个击破】numpy

简介 NumPy是一个开源的Python库&#xff0c;它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。它是大多数Python科学计算的基础&#xff0c;包括Pandas、SciPy和scikit-learn等库都建立在NumPy之上。 安装 !pip install numpy导入 import numpy as np用法 # …...

【STM32 Blue Pill编程实例】-4位7段数码管使用

4位7段数码管使用 文章目录 4位7段数码管使用1、7段数码介绍2、硬件准备与接线3、模块配置4、代码实现在本文中,我们将介绍如何将 STM32 Blue Pill开发板与 4 位 7 段数码管连接,并在 STM32CubeIDE 中对其进行编程。 在文章中首先将介绍 4 位 7 段数码管及其与 STM32 Blue Pi…...

[进阶]java基础之集合(三)数据结构

文章目录 数据结构概述常见的数据结构数据结构(栈)数据结构(队列)数据结构(数组)数据结构(链表) 数据结构 概述 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业…...

《Apache Cordova/PhoneGap 使用技巧分享》

一、引言 在移动应用开发的领域中&#xff0c;Apache Cordova&#xff08;也被称为 PhoneGap&#xff09;是一个强大的工具&#xff0c;它允许开发者使用 HTML、CSS 和 JavaScript 等 Web 技术来构建跨平台的移动应用。这种方式不仅能够提高开发效率&#xff0c;还能降低开发成…...

SCP(Secure Copy

SCP&#xff08;Secure Copy&#xff09;‌是Linux系统下基于SSH协议的安全文件传输工具&#xff0c;用于在本地和远程主机间安全、快速地传输文件和目录。SCP命令通过加密传输确保数据的安全性&#xff0c;并且不占用过多系统资源‌。 SCP的基本用法 ‌基本语法‌&#xff1a…...

uniApp 省市区自定义数据

关于自定义省市区选择 其实也是用了 uniApp的内置组件 picker <picker mode"multiSelector" change"bindRegionChange" columnchange"bindMultiPickerColumnChange" :value"valueRegion" :range"multiArray"><v…...

政府网站考评 集约化建设/百度网盘搜索入口

给定一棵二叉搜索树和其中的一个节点 p &#xff0c;找到该节点在树中的中序后继。如果节点没有中序后继&#xff0c;请返回 null 。 节点 p 的后继是值比 p.val 大的节点中键值最小的节点&#xff0c;即按中序遍历的顺序节点 p 的下一个节点。 示例 1&#xff1a; 输入&am…...

wordpress文章插件/推广公司产品

生命周期分三个状态 mounting(组件挂载阶段) updating(组件更新) unmounting(组件移除) props与state 生命周期分四个阶段 创建阶段 实例化阶段 getInitialState componentWillMount render componentDidMount 更新状态 componentWillReceiveProps shouldComponentUpdate compo…...

网站简易后台/中山网站建设

1.概述 存储过程也是一种PL/SQL块&#xff0c;是存入数据库的PL/SQL块。 但存储过程不同于已经普通的PL/SQL程序&#xff0c;我们通常把PL/SQL程序称为无名块&#xff0c;而存储过程是以命名的方式存储于数据库中的。 因此&#xff0c;我们可以这样理解&#xff0c;为PLSQL程…...

自己做的网站如何在百度搜到/百度自媒体怎么注册

琪琪词资源网-教程方法;在Linux中打开了太多文件(Too many open files)的三种解决方法电脑技巧&#xff0c;以下是给大家带来的教程方法;在Linux中打开了太多文件(Too many open files)的三种解决方法&#xff0c;大家可以了解一下哦!回答一、[rootlxadmin nginx]# cat /proc/s…...

深圳有做网站最近价格/竞价托管外包服务

★模板介绍★织梦婚纱影楼/婚纱摄影工作室模版&#xff0c;婚纱影楼、婚纱摄影工作室、个人写真、外景拍摄等摄影类网站&#xff0c;完全傻瓜式建站&#xff0c;测试完整无错&#xff0c;兼容所有主流浏览器。网站手工DIVcss&#xff0c;代码精简&#xff0c;全站精心优化&…...

仿牌网站怎么做301跳转/高级搜索技巧

1.分布式架构介绍 分布式系统&#xff08;distributed system&#xff09;是建立在网络之上的软件系统。正是因为软件的特性&#xff0c;所以分布式系统具有高度的内聚性和透明性。因此&#xff0c;网络和分布式系统之间的区别更多的在于高层软件&#xff08;特别是操作系统&am…...