Python - 深度学习系列36 重塑实体识别3

说明

从应用的角度,对实体识别的全流程进行进一步的明确。从全流程的角度上看,需要对数据做一些规范,并允许在不同的阶段插进来进行修改和迭代。

内容

1 原始数据

假设这个阶段,通过较为简单的方式对数据做了标记

在初始阶段,我们获得原始数据。然后,可能通过tf idf之类简单的方法获得一些实体列表。

x = '小王喊小明吃饭,小王大声喊'
y = '小王,小明'

考虑到数据应该是以文档形式给到的,所以可以约定如下,必须具有4个字段:

无论是x还是y,必须遵守最基本的utf-8 + 半角 + 两端无空格的规范。

字段解释
doc_id文档id,一篇文档包含n个句子
ss_id句子排序id, sentence sort id, 整型,标题是0, 正文从1开始编号
md5md5 hash id ,用于标记内容
x句子文本内容,必须以强分隔符结尾(如果是标题类的,手动补上一个中文句号)。强制分隔符包含中文句号、中英文问号、中英文叹号、换行符
y实体列表,使用英文逗号连接

强分割函数

import re
def split_sentences_with_punctuation(text):# 定义句子分隔符punctuation = r'([。?!?!\n])'# 根据句子分隔符进行分割,并保留分隔符parts = re.split(punctuation, text)# 将分隔符与句子重新组合sentences = []for i in range(0, len(parts), 2):sentence = parts[i].strip()if i + 1 < len(parts):sentence += parts[i + 1]sentences.append(sentence)return sentences# 示例文本
text = "我喜欢编程。你呢?这是一个很有趣的项目!\n我也喜欢读书。"# 分割句子,并保留分隔符
sentences = split_sentences_with_punctuation(text)
print(sentences)
['我喜欢编程。', '你呢?', '这是一个很有趣的项目!', '\n', '我也喜欢读书。', '']# 确保数据总是可以有一个强分割符import redef ensure_period(sentence= None):"""如果句子不是以句号、问号、感叹号或者感叹问号结尾,则在结尾添加一个句号。参数:sentence (str): 待检查的句子。返回:str: 添加句号后的句子。"""# 使用正则表达式匹配句子末尾的标点符号if not re.search(r'[。?!?!]$', sentence):sentence += '。'return sentence# 示例用法
sentence1 = "这是一个例句"
sentence2 = "这是一个例句!"
sentence3 = "这是一个例句?"
sentence4 = "这是一个例句."
sentence5 = "这是一个例句?"
sentence6 = "这是一个例句!"
sentence7 = "这是一个例句!?"
sentence8 = "这是一个例句?!"print(ensure_period(sentence1))  # 输出: "这是一个例句."
print(ensure_period(sentence2))  # 输出: "这是一个例句!"
print(ensure_period(sentence3))  # 输出: "这是一个例句?"
print(ensure_period(sentence4))  # 输出: "这是一个例句."
print(ensure_period(sentence5))  # 输出: "这是一个例句?"
print(ensure_period(sentence6))  # 输出: "这是一个例句!"
print(ensure_period(sentence7))  # 输出: "这是一个例句!?"
print(ensure_period(sentence8))  # 输出: "这是一个例句?!"

2 处理流程

基本的规范是utf8字符集和半角字符集。

# 标准处理函数
import redef extract_utf8_chars(input_string = None):# 定义一个正则表达式,用于匹配所有的UTF-8字符utf8_pattern = re.compile(r'[\u0000-\U0010FFFF]')# 使用findall方法找到所有匹配的字符utf8_chars = utf8_pattern.findall(input_string)return ''.join(utf8_chars)def toDBC(some_char):tem_str_ord = ord(some_char)res = None if tem_str_ord >65280 and tem_str_ord < 65375:res =tem_str_ord - 65248# 12288全角空格,160 &nbsp空格if tem_str_ord in [12288,160]:res = 32res_var_ord = res or tem_str_ordreturn chr(res_var_ord)
def tranform_half_widh(some_str = None):res_list = []return ''.join([toDBC(x) for x in some_str])

使用pydantic进行规范转化

# 强分割断句,确保末尾的强分隔符。
from typing import List, Optional
from pydantic import BaseModel,FieldValidationInfo, field_validatorclass Item(BaseModel):doc_id:strcontent:str# 验证器:确保 content 以强分隔符结尾@field_validator('content',mode='before')def ensure_utf8_and_halfwidth(cls, v):v = tranform_half_widh(extract_utf8_chars(v))  # 转换为半角字符return v# 给到一个document,将之分割为句子
class DocumentSplit(BaseModel):input_data_listofdict: List[Item] = [{'doc_id':'1', 'content':'这是第一篇文章。'}, {'doc_id':'2', 'content':'这是第二篇文章。'}]

先进行初始化

ds = DocumentSplit(input_data_listofdict = [{'doc_id':'1','content':'这是第一篇文章。这是第一篇文章'}, {'doc_id':'2', 'content':'这是第二篇文章。这是第二篇文章'}])

开始构造句子

from Basefuncs import * tem_df = pd.DataFrame([x.dict() for x in   ds.input_data_listofdict])
tem_df['sentences'] = tem_df['content'].apply(split_sentences_with_punctuation)# 构造句子
def make_sentences(some_dict = None):doc_id = some_dict['doc_id']sentences = some_dict['sentences']res_list = []for i, v in enumerate(sentences):tem_dict = {}tem_dict['doc_id'] = doc_idtem_dict['s_ord'] = i+1tem_dict['sentence'] = ensure_period(v)res_list.append(tem_dict)return res_list_s = cols2s(tem_df, cols = ['doc_id', 'sentences'], cols_key_mapping=['doc_id', 'sentences'])
_s1 = _s.apply(make_sentences)
tem_df1 = pd.DataFrame( flatten_list(_s1.to_list() ))doc_id	s_ord	sentence
0	1	1	这是第一篇文章。
1	1	2	这是第一篇文章。
2	2	1	这是第二篇文章。
3	2	2	这是第二篇文章。

以上处理完成了将原始数据转为标准格式的数据,每个句子将作为一个独立的个体。对于训练数据而言,可以无视句子在文章中的顺序;而作为预测来说,结果可以根据原文的顺序拼接起来。

3 创建环境

租用一个显卡主机,启动jupyter,然后将对应的模型考过去。

  • 1 拷贝老的模型,对无标签数据进行初级打标
  • 2 拷贝新的模型,根据数据进行下一步训练。

4 训练

4.1 数据预打标(prelabel_data.ipynb)

这个过程是通过各种方法收集到的实体打标数据,通常是打标尚具有缺陷的数据。总体上可以认为 80%正确的标签数据。

获取原始未达标数据,这部分数据应该已经存在于数据库中 clickhouse

from Basefuncs import * 
import pandas as pd 
import requests as req # 获取全部数据
host = 'xxx'
port = 19000
database = 'my_database'
user = 'xxx'
password = 'xxx'
name = 'tem'
chc = CHClient(host = host, port = port , database = database, user = user, password = password, name = name )
the_sql = 'show tables'
chc._exe_sql(the_sql)# 直接获取全部
query_data = chc.get_table('news_wz_retrain_ner')
# 整合数据
df = pd.DataFrame(query_data, columns = ['mid','title','content','task_id','task_rand'])
mid	title	content	task_id	task_rand
0	00007bfd99a62722a2ebc0bedef3c398	河南济源示范区:依托企业招才引智博聚兴产	714日,河南博士后科技服务团济源行活动启动,来自全省高等院校、科研院所的21名博士后、专...	42719	208
1	000193b97b50083acb76de6128094916	Omicron有何新变化?将如何影响市场?	辉瑞和德国拜恩泰科(BioNTech)公司也发布声明称“三剂疫苗可以将抗体水平提升25倍”;...	85212	746

数据规范化处理

对应的处理函数,确保了基本字符集以及断句,分隔符的规范。

import redef extract_utf8_chars(input_string = None):# 定义一个正则表达式,用于匹配所有的UTF-8字符utf8_pattern = re.compile(r'[\u0000-\U0010FFFF]')# 使用findall方法找到所有匹配的字符utf8_chars = utf8_pattern.findall(input_string)return ''.join(utf8_chars)def toDBC(some_char):tem_str_ord = ord(some_char)res = None if tem_str_ord >65280 and tem_str_ord < 65375:res =tem_str_ord - 65248# 12288全角空格,160 &nbsp空格if tem_str_ord in [12288,160]:res = 32res_var_ord = res or tem_str_ordreturn chr(res_var_ord)
def tranform_half_widh(some_str = None):res_list = []return ''.join([toDBC(x) for x in some_str])# 强分割
import re
def split_sentences_with_punctuation(text):# 定义句子分隔符punctuation = r'([。?!?!\n])'# 根据句子分隔符进行分割,并保留分隔符parts = re.split(punctuation, text)# 将分隔符与句子重新组合sentences = []for i in range(0, len(parts), 2):sentence = parts[i].strip()if i + 1 < len(parts):sentence += parts[i + 1]sentences.append(sentence)return sentencesimport redef ensure_period(sentence= None):"""如果句子不是以句号、问号、感叹号或者感叹问号结尾,则在结尾添加一个句号。参数:sentence (str): 待检查的句子。返回:str: 添加句号后的句子。"""# 使用正则表达式匹配句子末尾的标点符号if not re.search(r'[。?!?!]$', sentence):sentence += '。'return sentence# 强分割断句,确保末尾的强分隔符。
from typing import List, Optional
from pydantic import BaseModel,FieldValidationInfo, field_validatorclass Item(BaseModel):doc_id:strcontent:str# 验证器:确保 content 以强分隔符结尾@field_validator('content',mode='before')def ensure_utf8_and_halfwidth(cls, v):v = tranform_half_widh(extract_utf8_chars(v))  # 转换为半角字符return v# 给到一个document,将之分割为句子
class DocumentSplit(BaseModel):input_data_listofdict: List[Item] = [{'doc_id':'1', 'content':'这是第一篇文章。'}, {'doc_id':'2', 'content':'这是第二篇文章。'}]ds = DocumentSplit(input_data_listofdict = [{'doc_id':'1','content':'这是第一篇文章。这是第一篇文章'}, {'doc_id':'2', 'content':'这是第二篇文章。这是第二篇文章'}])

标题类数据准备
对于一篇文档来说,可能存在一个类似标题的数据。这类数据是高度概括的,从文字风格上,可能与正文不同;从作用上也不同,标题,也可能是摘要,目前是对文档的信息进行高度提炼。

所以在实体识别任务中,这些是需要区别对待的。(对于title数据,只要保证强分隔符即可)

通过DocumentSplit, 数据进行字符集的检查和转换。pydantic的处理效率接近pandas的apply方法,是可以量产的。

title_s = cols2s(df, cols=['mid','title'], cols_key_mapping=['doc_id', 'content'])
ds = DocumentSplit(input_data_listofdict = title_s.to_list())
the_data = pd.DataFrame([x.dict() for x in ds.input_data_listofdict])
doc_id	content
0	00007bfd99a62722a2ebc0bedef3c398	河南济源示范区:依托企业招才引智博聚兴产
1	000193b97b50083acb76de6128094916	Omicron有何新变化?将如何影响市场?

句子序号和分隔符规范化。每篇文档,0的序号预留给标题。

the_data.columns = ['doc_id', 'sentence']
the_data['s_ord'] = 0
the_data['sentence'] = the_data['sentence'].apply(ensure_period)
part1_df = the_data.copy()

part1_df就是标题部分的预处理结果。

正文类数据准备

对于content数据,需要转为短句列表。在识别实体时,一方面实体一定不会包含强分隔符,所以业务上可分;另一方面,服务在批量处理时是通过GPU并行计算的,那么限定每个向量的长度是必须的,这是技术上的要求。

将句子按强分隔符分割

def make_sentences(some_dict = None):doc_id = some_dict['doc_id']sentences = some_dict['sentences']res_list = []for i, v in enumerate(sentences):tem_dict = {}tem_dict['doc_id'] = doc_idtem_dict['s_ord'] = i+1tem_dict['sentence'] = ensure_period(v)res_list.append(tem_dict)return res_listcontent_s = cols2s(df, cols=['mid','content'], cols_key_mapping=['doc_id', 'content'])
ds = DocumentSplit(input_data_listofdict = content_s.to_list())the_data1 = pd.DataFrame([x.dict() for x in ds.input_data_listofdict])
the_data1['sentences'] = the_data1['content'].apply(split_sentences_with_punctuation)_s = cols2s(the_data1, cols = ['doc_id', 'sentences'], cols_key_mapping=['doc_id', 'sentences'])
_s1 = _s.apply(make_sentences)
the_data2 = pd.DataFrame( flatten_list(_s1.to_list() ))
part2_df = the_data2.copy()

数据合并

ucs编号:通过将接口服务再封装为对象操作

article_df = pd.concat([part1_df,part2_df], ignore_index=True)
from typing import List, Optional
from pydantic import BaseModelimport requests as req 
class UCS(BaseModel):gfgo_lite_server: str = 'http://172.17.0.1:24090/'def get_brick_name(self, some_id = None):some_dict = {}some_dict['rec_id'] = some_idurl = self.gfgo_lite_server + 'get_brick_name/'res = req.post(url, json = some_dict).json()return res def get_brick_name_s(self, some_id_list = None):some_dict = {}some_dict['rec_id_list'] = some_id_listurl = self.gfgo_lite_server + 'get_brick_name_s/'res = req.post(url, json = some_dict).json()return res ucs = UCS()
article_df['pid'] = list(range(len(article_df)))
pid_list2 = slice_list_by_batch2(list(article_df['pid']),10000)import tqdm
res_list = []
for some_pid_list in tqdm.tqdm(pid_list2):block_name_list = ucs.get_brick_name_s(some_pid_list)res_list.append(block_name_list)
article_df['brick'] = flatten_list(res_list)doc_id	sentence	s_ord	pid	brick
0	00007bfd99a62722a2ebc0bedef3c398	河南济源示范区:依托企业招才引智博聚兴产。	0	0	0.0.0.0
1	000193b97b50083acb76de6128094916	Omicron有何新变化?将如何影响市场?	0	1	0.0.0.0

分块存储并处理(打标)

brick_list = sorted(list(article_df['brick'].unique()))
!mkdir left
!mkdir right

worker.py

import sys# brick
arg1 = sys.argv[1]print('arg1', arg1)port_list = [10000,10001,10002]import random 
from Basefuncs import * 
the_port = random.choice(port_list)the_brick = arg1
the_data = from_pickle(the_brick, './left/')the_data['sentence_clean'] = the_data['sentence'].apply(lambda x: x[:198])
batch_list1 = cols2s(the_data, cols=['pid', 'sentence_clean'], cols_key_mapping= ['rec_id', 'data'])
batch_list2 = slice_list_by_batch2(batch_list1.to_list(), 500)import requests as reqresp_df_list = []
for some_batch in batch_list2:the_url = 'http://172.17.0.1:%s/parse_ent/' % the_portpara_dict = {}para_dict['task_for'] = 'test.test.ent'para_dict['data_listofdict'] = some_batchresp = req.post(the_url,json = para_dict).json()resp_df = pd.DataFrame(resp['data'])resp_df_list.append(resp_df)import pandas as pd 
mdf = pd.concat(resp_df_list, ignore_index=True)mdf['pid'] = mdf['rec_id']
mdf2 = pd.merge(the_data, mdf[['pid', 'ORG']], how='left', on ='pid')
to_pickle(mdf2, the_brick, './right/')

player.py

import sys# brick
arg1 = sys.argv[1]print('arg1', arg1)the_mod_num = int(arg1)from Basefuncs import * left_file = list_file_names_without_extension('./left/')
right_file = list_file_names_without_extension('./right/')gap_files = list(left_file - right_file)
gap_files1 = [x for x in gap_files if  int(x[-1]) % 3 == the_mod_num]import os 
for some_brick in gap_files1:os.system('python3 worker.py %s' % some_brick)

执行player,对3个服务均匀发起请求

python3 player.py 0 &
python3 player.py 1 &
python3 player.py 2 &

收集结果并存库

left_file = list_file_names_without_extension('./left/')
right_file = list_file_names_without_extension('./right/')
gap_files = list(left_file - right_file)
如果gap_files为空列表,那么表示处理完毕

读取所有文件合并

right_file_list = right_file
right_df_list = []
for some_right in right_file_list:tem_df = from_pickle(some_right, './right/')right_df_list.append(tem_df)
right_df = pd.concat(right_df_list, ignore_index=True)
right_sel = (right_df['ORG'] != ',') &(right_df['ORG'].notnull())
right_df1 = right_df[right_sel]

建表

# 获取全部数据
host = 'xxx'
port = 19000
database = 'xxx'
user = 'xxx'
password = 'xxx'
name = 'xxx'
chc = CHClient(host = host, port = port , database = database, user = user, password = password, name = name )
the_sql = 'show tables'
chc._exe_sql(the_sql)# chc.del_table('train_ner_news_title_content_org_20240529')
create_table_sql = '''
CREATE TABLE train_ner_news_title_content_org_20240529
(doc_id String,s_ord Int,pid Int,brick String,sentence_clean String,ORG String
)
ENGINE = MergeTree
partition by (brick)
PRIMARY KEY (pid)
'''
chc._exe_sql(create_table_sql)for slice_tuple in slice_list_by_batch1(0, len(right_df1), 100000):print(slice_tuple)_tem_df = right_df1.iloc[slice_tuple[0]:slice_tuple[1]]chc.insert_df2table(table_name = 'train_ner_news_title_content_org_20240529' , some_df = _tem_df[['doc_id','s_ord', 'pid','brick','sentence_clean', 'ORG']], pid_name = 'pid', cols =['doc_id','s_ord', 'pid','brick','sentence_clean', 'ORG'])

到这里算是完成了规范化的一部分,太长了,还得继续开新的文章写。

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

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

相关文章

设计模式(七)结构型模式---组合模式

文章目录 组合模式简介结构UML图具体实现UML图代码实现 组合模式简介 组合模式&#xff08;Composite Pattern&#xff09;又叫整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构来表示“整体-部分”的层次关系。实际使用点&#xff1a;HashMap中…

Day04 左侧菜单导航实现

一.点击左侧菜单导航到对应的View页面 1.首先在MyToDo项目中,创建出左侧菜单所有的View(视图)及对应的ViewModel(视图逻辑处理类) ViewViewModel首页IndexViewIndexViewModel待办事项ToDoViewToDoViewModel忘备录MemoViewMemoViewModel设置SettingsViewSettingsViewModel

html+CSS+js部分基础运用11

一、改变新闻网页中的字号 1、设计如图1-1所示的界面&#xff0c;要求当网络访问者选择字号中的【大、中、小】时能实现页面字号大小变化&#xff0c;选择“中”时&#xff0c;页面效果如图1所示。 图1 单击前初始状态页面 图2 单击“中”链接后页面 2、div中内容如下&#x…

十大排序 —— 归并排序

十大排序 —— 归并排序 归并排序分治(排序)合归并排序的性能一些小总结 我们今天继续来学习排序算法 —— 归并排序: 归并排序 归并排序&#xff08;Merge Sort&#xff09;是一种高效的、稳定的排序算法&#xff0c;它采用分治法&#xff08;Divide and Conquer&#xff09…

杂项——STM32ZET6要注意的一些问题——高级定时器问题和PB3,PB4引脚问题

ZET6可能会用到定时器&#xff0c;高级定时器要输出PWM要加上这样一行代码&#xff0c;否则无法正常输出PWM波 TIM_CtrlPWMOutputs(TIM8, ENABLE); // 主输出使能&#xff0c;当使用的是通用定时器时&#xff0c;这句不需要 ZET6中PB3,PB4引脚默认功能是JTDO和NJTRST,如果想将…

六一和侄子拼lego颗粒二维画

一、从泥巴到高科技&#xff1a;儿时玩具的变迁 在我童年的记忆里&#xff0c;最快乐的时光往往与简单的玩具和泥巴有关。在那个没有智能手机和电子游戏的年代&#xff0c;泥巴是我们的乐园&#xff0c;而玩具则是我们的伴侣。 小时候&#xff0c;泥巴是我们的创造力的源泉。…

Go跨平台编译

1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:

Kubernetes资源对象分类

目录 一、工作负载资源方面 二、Service资源 三、配置和存储资源 四、身份认证资源 五、鉴权资源 六、策略资源 七、集群资源 八、扩展资源 一、工作负载资源方面 Pod 是在主机上运行的容器的集合。 PodTemplate 描述一种模板&#xff0c;用来为预定义的 Pod 生成副本…

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别&#xff0c;及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…

Git操作笔记

学git已经好多次了。但是还是会忘记很多的东西&#xff0c;一些常用的操作命令和遇到的bug以后在这边记录汇总下 一.github图片展示 图片挂载&#xff0c;我是创建了一个库专门存图片&#xff0c;然后在github的md中用专用命令展示图片&#xff0c;这样你的md就不会全是文字那…

短信负载均衡

基本流程 String loadBalancersName loadBalancers.get(loadBalancerType); SendLoadBalancer sendLoadBalancer registerBeanHandler.getBean(loadBalancersName, SendLoadBalancer.class); String channelLabel sendLoadBalancer.chooseChannel(smsTemplateVOs,mobiles);…

MyEclipse 新手使用教程

MyEclipse 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Eclipse 平台&#xff0c;专为 Java 开发设计&#xff0c;特别适合企业级应用开发。它集成了各种开发工具和插件&#xff0c;支持多种编程语言和框架&#xff0c;包括 Java EE、Spring、Hi…

【Redis延迟队列】redis中的阻塞队列和延迟队列

阻塞队列&#xff08;RBlockingQueue&#xff09; 作用和特点&#xff1a; 实时性&#xff1a;阻塞队列用于实时处理消息。生产者将消息放入队列&#xff0c;消费者可以立即从队列中取出并处理消息。阻塞特性&#xff1a;如果队列为空&#xff0c;消费者在尝试获取消息时会被…

【C语言】文件操作(中卷)

前言 在文件操作&#xff08;上卷&#xff09;中&#xff0c;讲到的主要都是正式文件操作开始之前的前置知识&#xff0c;而这一卷中&#xff0c;我们将开始正式地操作文件。 在上卷中我们已经说到&#xff0c;stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

C语言编程实现年增长率的计算:深入探讨与实际应用

C语言编程实现年增长率的计算&#xff1a;深入探讨与实际应用 在数据分析和商业领域中&#xff0c;年增长率是一个至关重要的指标&#xff0c;它能够帮助我们了解某个指标在一定时间内的变化趋势。在C语言编程中&#xff0c;我们同样可以通过编写相应的程序来计算年增长率。本…

TimeDao-一篇文章了解清楚Subspace项目

1 项目简介 什么是Subspace网络&#xff1f; Subspace是为下一波加密创建者构建的第四代区块链。旨在实现web3规模扩容。 Subspace允许开发者以互联网规模运行 Web3 应用。它提供了一个简单的接口&#xff0c;用于快速部署按需求自动扩展的多链去中心化应用。Subspace由一个…

【C++】6-8 你好,自定义类型的输入输出

6-8 你好&#xff0c;自定义类型的输入输出 分数 15 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序&#xff0c;使程序正确运行&#xff1a; Student类为Person类的派生类 裁判测试程序样例&#xff1a; #include <iostream> #include <string> us…

微积分归纳总结:中值定理(大全包括函数、微分、积分)

微积分归纳总结&#xff1a;中值定理 关于连续函数的中值定理 函数连续则有一下中值定理 名称内容证明有界与最值闭区间的连续函数在该区间上有界并一定有最大值和最小值同济的高数书上证明从略零点定理若函数 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#…

Python实例:Excel表格内容行列转置

原文链接&#xff1a;http://www.juzicode.com/python-example-excel-col-row-transpose 今天的例子实现对Excel表格的行列值完成转置。 原始表格为:A | B | C 1 | 2 | 3 * | ( | ) 经过转置后变为&#xff1a;A | 1 | *B | 2 | (C | 3 | )方法1&#xff0c;用xlrd读取excel文…