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

大模型(LLMs)RAG 版面分析------文本分块面

一、为什么需要对文本分块?

使用大型语言模型(LLM)时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。

考虑以下场景:你面临一个几百页的文档,其中充满了文字,你希望对其进行摘录和问答式处理。在这个流程中,最初的一步是提取文档的嵌入向量,但这样做会带来几个问题:

  • 信息丢失的风险:试图一次性提取整个文档的嵌入向量,虽然可以捕捉到整体的上下文,但也可能会忽略掉许多针对特定主题的重要信息,这可能会导致生成的信息不够精确或者有所缺失。

  • 分块大小的限制:在使用如OpenAI这样的模型时,分块大小是一个关键的限制因素。例如,GPT-4模型有一个32K的窗口大小限制。尽管这个限制在大多数情况下不是问题,但从一开始就考虑到分块大小是很重要的。

因此,恰当地实施文本分块不仅能够提升文本的整体品质和可读性,还能够预防由于信息丢失或不当分块引起的问题。这就是为何在处理长篇文档时,采用文本分块而非直接处理整个文档至关重要的原因。

二、能不能介绍一下常见的文本分块方法?

一般的文本分块方法

如果不借助任何包,直接按限制长度切分方案:

text = "我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发的。我的目标是通过回答用户提出的问题来帮助他们解决问题。由于我是一个计算机程序,所以我没有实际的存在,只能通过互联网来与用户交
流 。 " chunks = []
chunk_size = 128 
for i in range(0, len(text), chunk_size):chunk = text[i:i + chunk_size]chunks.append(chunk) chunks
>>> ['我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发的。我的目标是通过回答用户提出的问题来帮助他们解决问题。由于我是一个计算机程序,所以我没有实际的存在,只能通过互联网','来与用户交流。'
]

正则拆分的文本分块方法

  • 动机:【一般的文本分块方法】能够按长度进行分割,但是对于一些长度偏长的句子,容易从中间切开;

  • 方法:在中文文本分块的场景中,正则表达式可以用来识别中文标点符号,从而将文本拆分成单独的句子。这种方法依赖于中文句号、“问号”、"感叹号"等标点符号作为句子结束的标志。

  • 特点:虽然这种基于模式匹配的方法可能不如基于复杂语法和语义分析的方法精确,但它在大多数情况下足以满足基本的句子分割需求,并且实现起来更为简单直接。

import redef split_sentences(text):# 使用正则表达式匹配中文句子结束的标点符号sentence_delimiters = re.compile(u'[。?!;]|\n')sentences = sentence_delimiters.split(text)# 过滤掉空字符串sentences = [s.strip() for s in sentences if s.strip()]return sentencestext ="文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词   短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。" sentences = split_sentences(text)
print(sentences)>>>
#output ['文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更  小、更易于处理的片段', '这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其  他语义单位', '这样做有助于更高效地从文本中提取关键信息'
]

在上面例子中,我们并没有采用任何特定的方式来分割句子。另外,还有许多其他的文本分块技术 可以使用,例如词汇化(tokenizing)、词性标注(POS tagging)等。

使用正则表达式匹配中文句子结束的标点符号

sentence_delimiters = re.compile(u’[。?!;]|\n’)

sentences = sentence_delimiters.split(text)

过滤掉空字符串

sentences = [s.strip() for s in sentences if s.strip()]

return sentences

text = “文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。”
sentences = split_sentences(text)

print(sentences)

#output [

‘文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段’,

‘这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位’,

‘这样做有助于更高效地从文本中提取关键信息’

]

在上面例子中,我们并没有采用任何特定的方式来分割句子。另外,还有许多其他的文本分块技术可以使用,例如词汇化(tokenizing)、词性标注(POS tagging)等。

Spacy Text Splitter 方法

  • 介绍:Spacy是一个用于执行自然语言处理(NLP)各种任务的库。它具有文本拆分器功能,能够在进行文本分割的同时,保留分割结果的上下文信息。
import spacy 
input_text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。"  nlp = spacy.load( "zh_core_web_sm" ) doc = nlp(input_text) 
for s in doc.sents: print (s)
>>> ['文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更  小、更易于处理的片段。',"这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其  他语义单位。","这样做有助于更高效地从文本中提取关键信息。"
]

基于 langchain 的 CharacterTextSplitter 方法

使用CharacterTextSplitter,一般的设置参数为:chunk_size、chunk_overlap、separator和strip_whitespace。

from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size = 35, chunk_overlap=0, separator='', strip_whitespace=False) text_splitter.create_documents([text])
>>> [Document(page_content='我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学'),Document(page_content='KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发'),Document(page_content='的。我的目标是通过回答用户提出的问题来帮助他们解决问题。  由于我是一个计'),Document(page_content='算机程序,所以我没有实际的存在,只能通过互联网来与用户交 流。')
]

基于 langchain 的 递归字符切分 方法

使用RecursiveCharacterTextSplitter,一般的设置参数为:chunk_size、chunk_overlap。

#input text
input_text = "文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。"  from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size = 100 , #设置所需的文本大小chunk_overlap = 20 ) chunks = text_splitter.create_documents([input_text]) print (chunks)>>> [Document(page_content='文本分块是自然语言处理(NLP)中的一项关键技术,其作用是   将较长的文本切割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,   例如将文本拆分为名词短语、动词短语或其他语义单位。这样做有助'), Document(page_content='短语、动词短语或其他语义单位。这样做有助于更高效地从文本  中提取关键信息。')]

与CharacterTextSplitter不同,RecursiveCharacterTextSplitter不需要设置分隔符,默认的几个分隔符如下:

"\n\n" - 两个换行符,一般认为是段落分隔符"\n" - 换行符
" " - 空格
"" - 字符

拆分器首先查找两个换行符(段落分隔符)。一旦段落被分割,它就会查看块的大小,如果块太大,那么它会被下一个分隔符分割。如果块仍然太大,那么它将移动到下一个块上,以此类推。

HTML 文本拆分 方法

  • 介绍:HTML文本拆分器是一种结构感知的文本分块工具。它能够在HTML元素级别上进行文本拆分,并且会为每个分块添加与之相关的标题元数据。

  • 特点:对HTML结构的敏感性,能够精准地处理和分析HTML文档中的内容。

#input html stringhtml_string = """ 
<!DOCTYPE html> 
<html> 
<body> <div> <h1>Mobot</h1> <p>一些关于Mobot的介绍文字。</p> <div> <h2>Mobot主要部分</h2> <p>有关Mobot的一些介绍文本。</p> <h3>Mobot第1小节</h3> <p>有关Mobot第一个子主题的一些文本。</p> <h3>Mobot第2小节</h3> <p>关于Mobot的第二个子主题的一些文字。</p> </div> <div> <h2>Mobot</h2> <p>关于Mobot的一些文字</p> </ div> <br> <p>关于Mobot的一些结论性文字</p> </div> 
</body> 
</html> """headers_to_split_on = [ ( "h1" , "Header 1" ), ( "h2" , "标题 2" ), ( "h3" , "标题 3" ), 
] from langchain.text_splitter import HTMLHeaderTextSplitter 
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on) html_header_splits = html_splitter.split_text(html_string) print(html_header_split)>>> [Document(page_content='Mobot'), Document(page_content='一些关于Mobot的介绍文字。\nMobot主要部分 Mobot第1小节Mobot第2小节', metadata={'Header 1': 'Mobot'}), Document(page_content='有关Mobot的一些介绍文本。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分'}), Document(page_content='有关Mobot第一个子主题的一些文本。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分', '标题 3': 'Mobot第1小节'}), Document(page_content='关于Mobot的第二个子主题的一些文字。', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot主要部分', '标题 3': 'Mobot第2小节'}), Document(page_content='Mobot div>', metadata={'Header 1': 'Mobot'}), Document(page_content='关于Mobot的一些文字 \n关于Mobot的一些结论性文字', metadata={'Header 1': 'Mobot', '标题 2': 'Mobot'})
]

仅提取在header_to_split_on参数中指定的HTML标题。

Mrrkdown 文本拆分 方法

  • 介绍:Markdown文本拆分是一种根据Markdown的语法规则(例如标题、Bash代码块、图片和列表)进行文本分块的方法。

  • 特点:具有对结构的敏感性,能够基于Markdown文档的结构特点进行有效的文本分割。

markdown_text = '# Mobot\n\n ## Stone\n\n这是python \n这是\n\n ## markdown\n\n 这是中文文本拆分'from langchain.text_splitter import MarkdownHeaderTextSplitter headers_to_split_on = [("#", "Header 1"),("##", "Header 2"),("###", "Header 3"),
]markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on) md_header_splits = markdown_splitter.split_text(markdown_text) print(md_header_splits)>>> [Document(page_content='这是python\n这是', metadata={'Header 1': 'Mobot', 'Header 2': 'Stone'}), Document(page_content='这是中文文本拆分', metadata={'Header 1': 'Mobot', 'Header 2': 'markdown'})
]

MarkdownHeaderTextSplitter 能够根据设定的 headers_to_split_on 参数,将 Markdown 文本进行拆分。这一功能使得用户可以便捷地根据指定的标题将 Markdown 文件分割成不同部分,从而提高编辑和管理的效率。

Python代码拆分 方法

python_text = """ class Person:def init (self, name, age):self.name = nameself.age = age
p1 = Person("John", 36) for i in range(10):print (i)"""from langchain.text_splitter import PythonCodeTextSplitter python_splitter = PythonCodeTextSplitter(chunk_size=100, chunk_overlap=0)python_splitter.create_documents([python_text])
>>> [Document(page_content='class Person:\n def init (self, name, age):\n self.name = name\n self.age = age'),Document(page_content='p1 = Person("John", 36)\n\nfor i in range(10):\n print (i)')
]

LaTex 文本拆分 方法

LaTex文本拆分工具是一种专用于代码分块的工具。它通过解析LaTex命令来创建各个块,这些块按照逻辑组织,如章节和小节等。这种方式能够产生更加准确且与上下文相关的分块结果,从而有效地提升LaTex文档的组织和处理效率。

#input Latex stringlatex_text = """documentclass{article}begin{document}maketitlesection{Introduction}
大型语言模型 (LLM)
是一种机器学习模型,可以在大量文本数据上进行训练,以生成类似人类的语言。近年来,法学硕士在各种自然语言处理任务中取得了重大进展,包括语言翻译、文本生成和情感分析。subsection{法学硕士的历史}最早的法学硕士是在
20 世纪 80 年代开发的和 20 世纪 90
年代,但它们受到可处理的数据量和当时可用的计算能力的限制。然而,在过去的十年中,硬件和软件的进步使得在海量数据集上训练法学硕士成为可能,从而导致subsection{LLM
的应用}LLM
在工业界有许多应用,包括聊天机器人、内容创建和虚拟助理。它们还可以在学术界用于语言学、心理学和计算语言学的研究。end{document}"""from langchain.text_splitter import LatexTextSplitterLatex_splitter = LatexTextSplitter(chunk_size= 100 , chunk_overlap= 0 )latex_splits = Latex_splitter.create_documents([latex_text]) print (latex_splits)>>> [Document(page_content='documentclass{article}begin{document}maketitlesection{Introduction}大型语言模型 (LLM)'),Document(page_content='是一种机器学习模型,可以在大量文本数据上进行训练,以生成类似人类的语言。近年来,法学硕士在各种自然语言处理任务中取得了重大进展,包括语言翻译、文本生成和情感分析。subsection{法学硕士的历史'),Document(page_content='}最早的法学硕士是在'),Document(page_content='20 世纪 80 年代开发的和 20 世纪 90'),Document(page_content='年代,但它们受到可处理的数据量和当时可用的计算能力的限制。然而,在过去的十年中,硬件和软件的进步使得在海量数据集上训练法学硕士成为可能,从而导致subsection{LLM 的应用}LLM'),Document(page_content='在工业界有许多应用,包括聊天机器人、内容创建和虚拟助理。它们还可以在学术界用于语言学、心理学和计算语言学的研究。end{document}')]

在上述示例中,我们注意到代码分割时的重叠部分设置为0。这是因为在处理代码分割过程中,任何重叠的代码都可能完全改变其原有含义。因此,为了保持代码的原始意图和准确性,避免产生误解或错误,设置重叠部分为0是必要的。

当你决定使用哪种分块器处理数据时,重要的一步是提取数据嵌入并将其存储在向量数据库(Vector DB)中。上面的例子中使用文本分块器结合 LanceDB 来存储数据块及其对应的嵌入。LanceDB 是一个无需配置、开源且无服务器的向量数据库,其数据持久化在硬盘驱动器上,允许用户在不超出预算的情况下实现扩展。此外,LanceDB 与 Python 数据生态系统兼容,因此你可以将其与现有的数据工具(如 pandas、pyarrow 等)结合使用。

总结

本文详细介绍了大模型(LLMs)在RAG(Retrieval-Augmented Generation)应用中的文本分块技术。文章首先阐述了为什么需要对文本进行分块,强调了信息丢失和分块大小限制的问题。接着,文章介绍了多种常见的文本分块方法,包括一般的文本分块方法、正则拆分的文本分块方法、Spacy Text Splitter方法、基于langchain的CharacterTextSplitter和递归字符切分方法、HTML文本拆分方法、Markdown文本拆分方法、Python代码拆分方法和LaTex文本拆分方法。每种方法都有其特定的应用场景和优势,文章通过示例代码展示了如何实现这些方法。最后,文章强调了在处理长篇文档时,采用适当的文本分块技术的重要性,并介绍了如何将分块后的数据存储在向量数据库中。

相关文章:

大模型(LLMs)RAG 版面分析------文本分块面

一、为什么需要对文本分块&#xff1f; 使用大型语言模型&#xff08;LLM&#xff09;时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。 考虑以下场景&#xff1a;你面临一个几百页的文档&#xff0c;其中充满了文字&#xff0c;你希望对其…...

Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台

作为 Web3 游戏领域的领军者&#xff0c;Big Time Studios 不仅创造了热门游戏《Big Time》&#xff0c;还开发了 Open Loot 平台&#xff0c;至今交易量已超过 5 亿美元。如今&#xff0c;Open Loot 平台的活跃用户可以获得 $OL 代币&#xff0c;这是该平台推出的首个实用型代…...

Linux—ln(link files)命令使用方法(How to create links on Linux)

Linux—ln&#xff08;link files&#xff09;命令使用方法 在 Linux 系统中工作时&#xff0c;需要在不同的目录中使用相同的文件时&#xff0c;不必在每个目录下都复制一份文件&#xff0c;这样不仅浪费磁盘空间&#xff0c;还会导致文件管理上的混乱。 ln(link files) 便是…...

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

解决Oracle DECODE函数字符串截断问题的深度剖析20241113

解决Oracle DECODE函数字符串截断问题的深度剖析 在使用Oracle数据库进行开发时&#xff0c;开发者可能会遇到一些令人困惑的问题。其中&#xff0c;在使用DECODE函数时&#xff0c;返回的字符串被截断就是一个典型的案例。本文将以学生管理系统为背景&#xff0c;深入探讨这个…...

开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)

一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...

PHP框架 单一入口和多入口以及优缺点

在PHP框架中&#xff0c;单一入口和多入口是两种不同的应用架构设计方式&#xff0c;以下是关于这两者及其优缺点的详细解释&#xff1a; 一、单一入口 定义&#xff1a; 单一入口&#xff08;Single Entry Point&#xff09;指的是应用程序通过一个统一的文件&#xff08;通…...

PhpSpreadsheet导出图片

PhpSpreadsheet导出图片 //导出public function pdf($ids){$jzInfo $this->model->where(id,$ids)->find();try {//巡检人员$staff_ids \app\admin\model\inspection\Plan::where(id,$jzInfo[plan_id])->value(staff_id);$staff_names \app\admin\model\inspect…...

AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!

1、原则解释 当与 ChatGPT 交流时&#xff0c;提供具体和详细的信息非常重要。 这样做可以帮助 ChatGPT 更准确地理解你的需求和上下文&#xff0c;从而生成更相关和有用的回答 明确的信息可以包括具体的问题背景、相关领域的说明、你所期望的答案类型等。 2、如何实践 明…...

web应用安全和信息泄露预防

文章目录 1&#xff1a;spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2&#xff1a;服务端口的合理使用3&#xff1a;弱口令&#xff08;密码&#xff09;管理4&#xff1a;服务端攻击4.1、短信业务&#xff0c;文件上传等资源型接口1、…...

《人工智能深度学习的基本路线图》

《人工智能深度学习的基本路线图》 基础准备阶段 数学基础&#xff1a; 线性代数&#xff1a;深度学习中大量涉及矩阵运算、向量空间等概念&#xff0c;线性代数是理解和处理这些的基础。例如&#xff0c;神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…...

基于Java Springboot宠物猫售卖管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…...

力扣-Hot100-链表其三【算法学习day.36】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

iOS逆向入门:使用theos注入第三方依赖库

背景 theos是一个跨平台的软件开发框架&#xff0c;常用于管理&#xff0c;开发和部署iOS项目&#xff0c;同时也是开发iOS越狱插件的主要工具。和MonkeyDev不同的是&#xff0c;它不依赖于xcode&#xff0c;可以在多个操作系统上运行。一个完整的iOS越狱开发流程包括&#xf…...

JavaScript 原型

JavaScript 的原型&#xff08;Prototype&#xff09;是其面向对象编程模型的核心概念之一&#xff0c;它决定了对象如何继承属性和方法。通过理解 JavaScript 的原型&#xff0c;你可以更好地理解对象之间的关系以及如何扩展对象功能。 核心概念 [[Prototype]]&#xff08;内部…...

力扣 LeetCode 20. 有效的括号(Day5:栈与队列)

解题思路&#xff1a; 使用栈 只有三种情况 1. ( [ { } ] ( ( 左括号多了 -> 最后栈中经过抵消会剩下括号 2. [ { ( ] } ] 括号不匹配 -> return false 3. [ { } ] ( ) ) ) 右括号多了 -> 未遍历完时&#xff0c;栈提前为空&#xff0c;…...

git使用及上线流程(仅为我工作中常用)

推荐软件或者直接终端 ⚠️注意&#xff1a;在确保远程和本地分支都可使用的情况下 git常见使用命令 ls---查看所有目录 pwd---本机密码 cd 目录名---进入目录 Touch ---创建文本文件 git status---查看状态 git branch---查看分支 git pull---拉取远程最新代码 git checkou…...

React Native 全栈开发实战班 - 打包发布之热更新

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节已经详细介绍了打包与发布的流程&#xff0c;包括 Android 和 iOS 平台的配置、打包步骤、签名配置以及发布到应…...

2024年11月16日 星期六 重新整理Go技术

今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…...

力扣第 55 题 跳跃游戏

力扣第 55 题 跳跃游戏&#xff08;Jump Game&#xff09;。题目要求判断一个非负整数数组中&#xff0c;是否能够从第一个位置跳跃到最后一个位置。每个元素表示从当前位置最多可以跳跃的步数。 解题思路 我们可以用 贪心算法 来解决这个问题。贪心的核心思想是始终维护当前…...

Golang | Leetcode Golang题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …...

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…...

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…...

移动零

移动零 1、题目描述2、解答思路 1、题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 2、解答思路 已知数组后端若干元素为0&…...

C#编写的日志记录组件 - 开源研究系列文章

以前编写过一个日志记录组件的博文&#xff0c;这次发布一个修改过的完善版本。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 实现&#xff1b; 2) 使用&#xff1b; 后面的参数为级别设置&#xff0c;只有大于这个级别的才进行日志记录&#xff0c;限制了日志记录的…...

猎板PCB罗杰斯板材的应用案例

以下是几个猎板 PCB 与罗杰斯板材结合的具体案例&#xff1a; 案例一&#xff1a;5G 通信基站天线 PCB 在 5G 通信基站的天线系统中&#xff0c;对高频信号的传输和处理要求极高。猎板 PCB 采用罗杰斯板材&#xff0c;凭借其稳定的低介电常数&#xff08;如 RO4003C 板材&…...

使用esp32c3开发板通过wifi连网络web服务器

实验基本拓扑就是&#xff1a; esp32c3开发板通过Wifi模块连上局域网&#xff0c;局域网一台服务器通过FastAPI提供8000端口的web服务&#xff0c;在esp32c3开发板中烧录micropython固件&#xff0c;在python交互模式下&#xff0c;连上Wifi模块&#xff0c;并使用socket模块获…...

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…...

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…...

工厂模式-简单工厂模式

1、简单工厂模式 在工厂类的静态方法中,根据要创建产品的type类型,通过if else来返回对应的对象 1.1定义产品抽象接口Product /*** @desc 产品抽象接口**/ public interface Product {void use(); } 1.2 定义具体的产品A和B /*** @desc 产品A**/ public class ProductA i…...

成都一日游必去景点推荐/seo外包公司优化

MOV&#xff08;MOVe&#xff09; 传送指令PUSH 入栈指令POP 出栈指令XCHG&#xff08;eXCHanG&#xff09; 交换指令XLAT&#xff08;TRANSLATE&#xff09; 换码指令LEA &#xff08;Load Effective Address&#xff09; 有效地址送寄存器指令LDS&#xff08;L…...

一起作做业网站/天天seo伪原创工具

bitsCN.comLinux下均在控制台下操作。导入数据库&#xff1a;前提&#xff1a;数据库和数据表要存在(已经被创建)(1)将数据表 test_user.sql 导入到test 数据库的test_user 表中[roottest ~]# mysql -uroot -p test < /www/web/test/test_user.sql(2) 将数据库 test.sql 导入…...

wordpress自定义tags页/凡科建站怎么导出网页

室内LED显示屏安装&#xff0c;一般常用的方法都会选择边框、单元板、排线、电源、控制卡、处理器、控制电脑等材料来自己组装成LED显示屏&#xff0c;那么如何把一块块模组组装成一整块大的LED显示屏幕&#xff0c;并且正常使用呢&#xff1f;以下为您详解安装步骤1、制作主架…...

重庆ssc做号网站/做网络营销推广

使用brew安装mongodb 1、有了brew&#xff0c;我们安装mongodb就变得很简单了&#xff1a; brew install mongodb创建一个 为指定文件夹设置 数据库 指定端口&#xff08;本地调试&#xff09; mongod --dbpath/Users/zhouliwei/Desktop/nodedemo/blog2/db --port27018 转载于:…...

功能 wordpress.org/全国疫情最新消息今天实时

效果图.jpg (24.94 KB) 2008-4-4 21:46 1、打开PS 执行文件—新建—新建550X400像素空白文档 1.jpg (36.69 KB) 2008-4-4 21:46 2、输入所要制作的黑色文字&#xff08;字体最好选粗厚些的字体&#xff09;本教程字体汉仪方叠体简 2.jpg (24.95 KB) 2008-4-4 21:46 3、对文字层…...

网络建设公司的问答营销案例/旺道seo推广有用吗

免责声明&#xff1a;文章内容仅为个人技术思考&#xff0c;不作任何形式的技术推荐或商业推广。网络爬虫作为当下热门的技术手段之一&#xff0c;被越来越多的数据型用户视为重要的信息获取方法。本文将从预备知识、技术原理两方面以个人视角介绍该技术途径。1.重识网页1.1 HT…...