GraphRAG 文本分割优化

2024-08-31 20:36
文章标签 优化 分割 文本 graphrag

本文主要是介绍GraphRAG 文本分割优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GraphRAG 文本分割优化

开始调整对微软的 GraphRAG 进行优化,这次优化有以下几点,

  • ‘�’ 乱码问题
  • 句子在中间被截断的问题
# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License"""A module containing run and split_text_on_tokens methods definition."""from collections.abc import Iterable
from typing import Anyimport tiktoken
from datashaper import ProgressTickerimport graphrag.config.defaults as defs
from graphrag.index.text_splitting import Tokenizer
from graphrag.index.verbs.text.chunk.typing import TextChunkdef trim_sentence(sentence):# 定义固定的分隔符列表delimiters = [',', '、', '。', '!', '?', ';', ':', '.']# 查找第一个非分隔符的字符位置start_index = 0for i, char in enumerate(sentence):if char in delimiters:start_index = i + 1break# 查找最后一个非分隔符的字符位置end_index = len(sentence)for i in range(len(sentence) - 1, -1, -1):if sentence[i] in delimiters:end_index = i + 1break# 返回修剪后的句子return sentence[start_index:end_index]def run(input: list[str], args: dict[str, Any], tick: ProgressTicker
) -> Iterable[TextChunk]:"""Chunks text into multiple parts. A pipeline verb."""tokens_per_chunk = args.get("chunk_size", defs.CHUNK_SIZE)chunk_overlap = args.get("chunk_overlap", defs.CHUNK_OVERLAP)encoding_name = args.get("encoding_name", defs.ENCODING_MODEL)enc = tiktoken.get_encoding(encoding_name)def encode(text: str) -> list[int]:if not isinstance(text, str):text = f"{text}"return enc.encode(text)def decode(tokens: list[int]) -> str:return enc.decode(tokens)return split_text_on_tokens(input,Tokenizer(chunk_overlap=chunk_overlap,tokens_per_chunk=tokens_per_chunk,encode=encode,decode=decode,),tick,)# Adapted from - https://github.com/langchain-ai/langchain/blob/77b359edf5df0d37ef0d539f678cf64f5557cb54/libs/langchain/langchain/text_splitter.py#L471
# So we could have better control over the chunking process
def split_text_on_tokens(texts: list[str], enc: Tokenizer, tick: ProgressTicker
) -> list[TextChunk]:"""Split incoming text and return chunks."""result = []mapped_ids = []for source_doc_idx, text in enumerate(texts):encoded = enc.encode(text)# print(f"{text=} {encoded=}")# encoded = tiktoken.get_encoding("utf8").encode(text)tick(1)mapped_ids.append((source_doc_idx, encoded))input_ids: list[tuple[int, int]] = [(source_doc_idx, id) for source_doc_idx, ids in mapped_ids for id in ids]start_idx = 0cur_idx = min(start_idx + enc.tokens_per_chunk, len(input_ids))chunk_ids = input_ids[start_idx:cur_idx]while start_idx < len(input_ids):chunk_text = enc.decode([id for _, id in chunk_ids])chunk_text = chunk_text.strip("�")chunk_text = trim_sentence(chunk_text)enc.encode(chunk_text)doc_indices = list({doc_idx for doc_idx, _ in chunk_ids})result.append(TextChunk(text_chunk=chunk_text,source_doc_indices=doc_indices,# n_tokens=len(chunk_ids),n_tokens=len(enc.encode(chunk_text)),))start_idx += enc.tokens_per_chunk - enc.chunk_overlapcur_idx = min(start_idx + enc.tokens_per_chunk, len(input_ids))chunk_ids = input_ids[start_idx:cur_idx]return result

这篇关于GraphRAG 文本分割优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124928

相关文章

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出