大模型(LLMs)RAG 版面分析——文本分塊面

大模型(LLMs)RAG 版面分析——文本分塊面

  • 一、為什么需要對文本分塊?

  • 二、能不能介紹一下常見的文本分塊方法?

  • 2.1 一般的文本分塊方法

  • 2.2 正則拆分的文本分塊方法

  • 2.3 Spacy Text Splitter 方法

  • 2.4 基于 langchain 的 CharacterTextSplitter 方法

  • 2.5 基于 langchain 的 遞歸字符切分 方法

  • 2.6 HTML 文本拆分 方法

  • 2.7 Mrrkdown 文本拆分 方法

  • 2.8 Python代碼拆分 方法

  • 2.9 LaTex 文本拆分 方法

  • 致謝 一、為什么需要對文本分塊? 使用大型語言模型(LLM)時,切勿忽略文本分塊的重要性,其對處理結果的好壞有重大影響。 考慮以下場景:你面臨一個幾百頁的文檔,其中充滿了文字,你希望對其進行摘錄和問答式處 理。在這個流程中,最初的一步是提取文檔的嵌入向量,但這樣做會帶來幾個問題:

  • 信息丟失的風險:試圖一次性提取整個文檔的嵌入向量,雖然可以捕捉到整體的上下文,但也 可能會忽略掉許多針對特定主題的重要信息,這可能會導致生成的信息不夠精確或者有所缺失。

  • 分塊大小的限制:在使用如OpenAI這樣的模型時,分塊大小是一個關鍵的限制因素。例如, GPT-4模型有一個32K的窗口大小限制。盡管這個限制在大多數情況下不是問題,但從一開始 就考慮到分塊大小是很重要的。

因此,恰當地實施文本分塊不僅能夠提升文本的整體品質和可讀性,還能夠預防由于信息丟失或不 當分塊引起的問題。這就是為何在處理長篇文檔時,采用文本分塊而非直接處理整個文檔至關重要 的原因。

二、能不能介紹一下常見的文本分塊方法?

  1. 一般的文本分塊方法 如果不借助任何包,直接按限制長度切分方案:

  2. 正則拆分的文本分塊方法

  • 動機:【一般的文本分塊方法】能夠按長度進行分割,但是對于一些長度偏長的句子,容易從 中間切開;

  • 方法:在中文文本分塊的場景中,正則表達式可以用來識別中文標點符號,從而將文本拆分成 單獨的句子。這種方法依賴于中文句號、“問號”、“感嘆號”等標點符號作為句子結束的標志。

  • 特點:雖然這種基于模式匹配的方法可能不如基于復雜語法和語義分析的方法精確,但它在大 多數情況下足以滿足基本的句子分割需求,并且實現起來更為簡單直接。 import re def 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 sentences text ="文本分塊是自然語言處理(NLP)中的一項關鍵技術,其作用是將較長的文本切割成更小、更易于處理的片段。這種分割通常是基于單詞的詞性和語法結構,例如將文本拆分為名詞 短語、動詞短語或其他語義單位。這樣做有助于更高效地從文本中提取關鍵信息。" sentences = split_sentences(text) print(sentences) >>> #output [ '文本分塊是自然語言處理(NLP)中的一項關鍵技術,其作用是將較長的文本切割成更 小、更易于處理的片段', '這種分割通常是基于單詞的詞性和語法結構,例如將文本拆分為名詞短語、動詞短語或其 他語義單位', '這樣做有助于更高效地從文本中提取關鍵信息' ] 在上面例子中,我們并沒有采用任何特定的方式來分割句子。另外,還有許多其他的文本分塊技術 可以使用,例如詞匯化(tokenizing)、詞性標注(POS tagging)等。

  1. Spacy Text Splitter 方法

  • import spacy input_text = "文本分塊是自然語言處理(NLP)中的一項關鍵技術,其作用是將較長的文本切割成更小、更易于處理的片段。這種分割通常是基于單詞的詞性和語法結構,例如將文本拆分為名詞短語、動詞短語或其他語義單位。這樣做有助于更高效地從文本中提取關鍵信息。" nlp = spacy.load( "zh_core_web_sm" ) doc = nlp(input_text) for s in doc.sents: print (s) >>> [ '文本分塊是自然語言處理(NLP)中的一項關鍵技術,其作用是將較長的文本切割成更 小、更易于處理的片段。', "這種分割通常是基于單詞的詞性和語法結構,例如將文本拆分為名詞短語、動詞短語或其 他語義單位。", "這樣做有助于更高效地從文本中提取關鍵信息。" ] 介紹:Spacy是一個用于執行自然語言處理(NLP)各種任務的庫。它具有文本拆分器功能, 能夠在進行文本分割的同時,保留分割結果的上下文信息。

  1. 基于 langchain 的 CharacterTextSplitter 方法 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='算機程序,所以我沒有實際的存在,只能通過互聯網來與用戶交 流。') ] 使用CharacterTextSplitter,一般的設置參數為:chunk_size、 chunk_overlap、separator和strip_whitespace。

  2. 基于 langchain 的 遞歸字符切分 方法 #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='短語、動詞短語或其他語義單位。這樣做有助于更高效地從文本 中提取關鍵信息。')] 使用RecursiveCharacterTextSplitter,一般的設置參數為:chunk_size、 chunk_overlap。 與CharacterTextSplitter不同,RecursiveCharacterTextSplitter不需要設置分隔符,默認的幾個分隔 符如下: "\n\n" - 兩個換行符,一般認為是段落分隔符"\n" - 換行符 " " - 空格 "" - 字符 拆分器首先查找兩個換行符(段落分隔符)。一旦段落被分割,它就會查看塊的大小,如果塊太 大,那么它會被下一個分隔符分割。如果塊仍然太大,那么它將移動到下一個塊上,以此類推。

  3. HTML 文本拆分 方法

  • 介紹:HTML文本拆分器是一種結構感知的文本分塊工具。它能夠在HTML元素級別上進行文本 拆分,并且會為每個分塊添加與之相關的標題元數據。

  • 特點:對HTML結構的敏感性,能夠精準地處理和分析HTML文檔中的內容。 <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標題。

  1. Mrrkdown 文本拆分 方法

  • 介紹:Markdown文本拆分是一種根據Markdown的語法規則(例如標題、Bash代碼塊、圖片和 列表)進行文本分塊的方法。

  • 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'}) ] 特點:具有對結構的敏感性,能夠基于Markdown文檔的結構特點進行有效的文本分割。 MarkdownHeaderTextSplitter 能夠根據設定的 headers_to_split_on 參數,將 Markdown 文本進行拆分。這一功能使得用戶可以便捷地根據指定的標題將 Markdown 文件分割成不同部分,從而提高編輯和管理的效率。

  1. Python代碼拆分 方法 python_text = """ class Person: def init (self, name, age): self.name = name self.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)') ]

  2. LaTex 文本拆分 方法

LaTex文本拆分工具是一種專用于代碼分塊的工具。它通過解析LaTex命令來創建各個塊,這些塊按照邏輯組織,如章節和小節等。這種方式能夠產生更加準確且與上下文相關的分塊結果,從而有 效地提升LaTex文檔的組織和處理效率。

#input Latex string

latex_text = """documentclass{article}begin{document}maketitlesection{Introduction} 大型語言模型 (LLM) 是一種機器學習模型,可以在大量文本數據上進行訓練,以生成類似人類的語言。近年來,法學碩士在各種自然語言處理任務中取得了重大進展,包括語言翻譯、文本生成和情感分析。subsection{法學碩士的歷史}最早的法學碩士是在 20 世紀 80 年代開發的和 20 世紀 90 年代,但它們受到可處理的數據量和當時可用的計算能力的限制。然而,在過去的十年中,硬件和軟件的進步使得在海量數據集上訓練法學碩士成為可能,從而導致subsection{LLM 的應用}LLM 在工業界有許多應用,包括聊天機器人、內容創建和虛擬助理。它們還可以在學術界用于語言學、心理學和計算語言學的研究。end{document}"""

from langchain.text_splitter import LatexTextSplitter

Latex_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{Introd uction}大型語言模型 (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 等)結合使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81745.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解構區塊鏈身份認證:從ID到零知識證明的實戰指南

引言 在數字經濟高速發展的今天&#xff0c;數字身份已成為個人與數字世界交互的核心憑證。傳統中心化身份系統存在數據孤島、隱私泄露、單點故障等痛點&#xff0c;而區塊鏈技術憑借??去中心化、不可篡改、可追溯??的特性&#xff0c;為數字身份驗證提供了革命性解決方案…

c#數據結構 線性表篇 非常用線性集合總結

本人能力有限,使用了一些Ai的結論,如有不足還請斧正 目錄 1.HashSet <> Dictionary 2.SortedSet <>提供升序方法的List 3.ArrayList<>List 4.BitArray <> Bit[] array 5.StringCollection <>List 6.StringDictionary<>Dictionary 1…

爬蟲管理平臺-最新版本發布

TaskPyro 是什么&#xff1f; TaskPyro 是一個輕量級的 Python 任務調度平臺&#xff0c;專注于提供簡單易用的任務管理和爬蟲調度解決方案。它能夠幫助您輕松管理和調度 Python 任務&#xff0c;特別適合需要定時執行的爬蟲任務和數據處理任務。 官方文檔&#xff1a;https:/…

過采樣處理

一、數據讀取與初步觀察 首先&#xff0c;使用pandas庫讀取信用卡交易數據集&#xff1a; data pd.read_csv(r"./creditcard.csv") print(data.head())通過head()方法查看數據集的前幾行&#xff0c;初步了解數據的結構和內容。該數據集包含交易時間、交易金額、多…

潮乎盲盒商城系統全開源多級分銷推廣海報獎品兌換試玩概率OSS云存儲多端源碼

一、源碼描述 這是一套潮乎盲盒商城源碼&#xff0c;仿小叮當盲盒商城&#xff0c;后端Laravel框架前端uniappvue&#xff0c;前后端數據庫分離&#xff0c;支持四端同步數據&#xff08;H5小程序等&#xff09;&#xff0c;測試環境: php7.4&#xff0c;mysql5.6&#xff0c;…

c++環境和vscode常用的一些有用插件

環境 WSL需要安裝cmake 編譯器g14 應該是包含了所有std:c23把好像包含部分c26 vscode 需要插件cmake vscode clangd 方便提示吧 File Watch 插件目的在保存.h/.cpp文件時候自動執行vscode 的cmake吧 error lens 方便每次顯示錯誤和警告的提示懶得每次點擊去看錯誤 Edit Sugge…

Spring 轉發 form-data 文件上傳請求時中文文件名亂碼

Spring 轉發 form-data 文件上傳請求時中文文件名亂碼 復現問題找原因解決問題參考 復現問題 后端有兩個接口&#xff1a; /upload 是文件上傳的接口。 /forward 是轉發文件上傳請求的接口。 RequestMapping RestController public class FileUploadController {/*** 直接調…

MySQL 8.4.4 安全升級指南:從漏洞修復到版本升級全流程解析

目錄 二、升級前關鍵注意事項 1. 數據安全與備份 2. 版本兼容性與路徑規劃 三、分步升級操作流程 1. 環境預檢與準備 2. 安裝包部署 3. 強制升級組件 4. 驗證與啟動 一、背景與必要性 近期安全掃描發現生產環境的 MySQL 數據庫存在多個高危漏洞(CVE 詳情參見Oracle 官…

vulkanscenegraph顯示傾斜模型(6.4)-多線程下的記錄與提交

前言 上章深入分析了幀循環中呈現階段的具體實現。本章將分析多線程下的記錄與提交&#xff0c;進一步剖析vsg幀循環過程中的同步機制&#xff0c;并揭露信號量(VkSemaphore)和圍欄(VkFence)以及vsg::FrameBlock與vsg::Barrier在其中的作用。 目錄 1 信號量(VkSemaphore)、柵欄…

Python爬蟲實戰:獲取扇貝單詞數據并分析,為用戶高效學習單詞做參考

一、引言 隨著互聯網的迅猛發展,在線學習資源日益豐富多樣。扇貝單詞作為一款備受歡迎的在線英語學習平臺,積累了海量的單詞學習數據。借助 Python 強大的爬蟲技術獲取這些數據,并運用數據分析和機器學習方法進行深度挖掘,能夠為用戶量身定制更個性化、更高效的單詞學習方…

【Vagrant+VirtualBox創建自動化虛擬環境】Ansible-Playbook

Vagrant 后續Ansible實戰&#xff1a;【Ansible自動化運維實戰&#xff1a;從Playbook到負載均衡指南】-CSDN博客 Vagrant是一個基于Ruby的工具&#xff0c;用于創建和部署虛擬化開發環境。它使用Oracle的開源VirtualBox虛擬化系統&#xff0c;使用 Chef創建自動化虛擬環境 Do…

Codigger Desktop:重新定義數字工作與生活方式

Codigger Desktop是一款革命性的智能桌面操作系統&#xff0c;專為現代數字生活和工作場景打造。它不僅成為開發者的強大生產力工具&#xff0c;更是普通用戶日常數字生活的得力助手&#xff0c;完美實現了專業性與易用性的平衡。 Multimedia Desktop全能數字生活平臺 重新定…

Servlet+tomcat

serverlet 定義&#xff1a;是一個接口&#xff0c;定義了java類被瀏覽器&#xff08;tomcat識別&#xff09;的規則 所以我們需要自定義一個類&#xff0c;實現severlet接口復寫方法 通過配置類實現路徑和servlet的對應關系 執行原理 當用戶在瀏覽器輸入路徑&#xff0c;會…

什么是 DDoS 攻擊?高防 IP 如何有效防護?2025全面解析與方案推薦

一、DDoS 攻擊&#xff1a;互聯網時代的 “數字核武器” 1. DDoS 攻擊的本質與原理 ** 分布式拒絕服務攻擊&#xff08;DDoS&#xff09;** 通過操控海量僵尸設備&#xff0c;向目標服務器發送洪水般請求&#xff0c;耗盡帶寬、連接或計算資源&#xff0c;導致合法用戶無法訪…

Circular Plot系列(一): 環形熱圖繪制

針對近期多個粉絲咨詢環形圖的繪制&#xff0c;我意識到&#xff0c;我們似乎沒有真正介紹過circle圖&#xff0c;但這一類圖確是非常常用的圖&#xff0c;所以這里詳細學習一下circle的繪制&#xff0c;使用的是circlize包&#xff0c;功能很完善&#xff1a;安裝包, #https:/…

【數據挖掘】時間序列預測-時間序列預測策略

時間序列預測策略 &#xff08;1&#xff09;單步預測與多步預測&#xff08;2&#xff09;直接多步預測&#xff08;3&#xff09;遞歸多步預測&#xff08;4&#xff09;直接遞歸的混合預測&#xff08;5&#xff09;多輸入多輸出預測 &#xff08;1&#xff09;單步預測與多…

【LLM】deepseek R1之GRPO訓練筆記(持續更新)

note 相關框架對比&#xff1a; 需微調模型且資源有限 → Unsloth&#xff1b;本地隱私優先的小規模推理 → Ollama&#xff1b;復雜邏輯或多模態任務 → SGLang&#xff1b;高并發生產環境 → vLLM 微調SFT和GRPO是確實能學到新知識的四種格式&#xff08;messages、sharegpt…

【數據結構】--- 單鏈表的增刪查改

前言&#xff1a; 經過了幾個月的漫長歲月&#xff0c;回頭時年邁的小編發現&#xff0c;數據結構的內容還沒有寫博客&#xff0c;于是小編趕緊停下手頭的活動&#xff0c;補上博客以洗清身上的罪孽 目錄 前言 概念&#xff1a; 單鏈表的結構 我們設定一個哨兵位頭節點給鏈…

【JAVA】數據類型與變量:深入理解棧內存分配(4)

核心知識點詳細解釋 Java 的基本數據類型和引用數據類型 基本數據類型 Java 有 8 種基本數據類型&#xff0c;它們可以分為 4 類&#xff1a; 整數類型&#xff1a;byte&#xff08;1 字節&#xff09;、short&#xff08;2 字節&#xff09;、int&#xff08;4 字節&#…

ReentrantLock實現公平鎖和非公平鎖

在 Java 里&#xff0c;公平鎖和非公平鎖是多線程編程中用于同步的兩種鎖機制&#xff0c;它們的主要差異在于獲取鎖的順序規則。下面是對二者的詳細介紹&#xff1a; 公平鎖 公平鎖遵循 “先來先服務” 原則&#xff0c;也就是線程獲取鎖的順序和請求鎖的順序一致。先請求鎖…