Last active
July 25, 2024 18:21
-
-
Save jadsongmatos/b78d145534472da54bfae18eb740ac98 to your computer and use it in GitHub Desktop.
Este código é um script Python que lê um texto de um arquivo, substitui pontos por vírgulas, e depois divide o texto em pedaços menores (chunks) de até 200 caracteres, garantindo que os tokens (unidades de texto) não sejam quebrados.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
import tiktoken | |
# Define o limite de caracteres para cada split | |
chunk_size = 200 | |
# Função para remover separadores de um texto | |
def remove_separators(text, separators): | |
pattern = '|'.join(map(re.escape, separators)) | |
return re.sub(pattern, '', text) | |
# Leia o conteúdo do arquivo input.txt | |
with open('cof.txt', 'r', encoding='utf-8') as file: | |
text = file.read() | |
# Substitui pontos por vírgulas no texto | |
text = text.replace('.', ',') | |
# Inicializa a codificação | |
enc = tiktoken.get_encoding("cl100k_base") | |
def length_function(text: str) -> int: | |
return len(text) # Conta o número de caracteres diretamente | |
# Customiza o separador e função de divisão | |
splitter = RecursiveCharacterTextSplitter( | |
separators=["\n\n", "\n", " ", ",", "."], | |
chunk_size=chunk_size, # Define o chunk size em termos de caracteres | |
chunk_overlap=0, | |
length_function=length_function, | |
) | |
# Função para dividir os tokens mantendo o limite de caracteres | |
def split_tokens_with_limit(tokens, limit): | |
splits = [] | |
current_split = [] | |
current_length = 0 | |
for token in tokens: | |
token_text = enc.decode([token]) | |
token_length = len(token_text) | |
# Se o token é maior que o limite, inicia um novo split | |
if token_length > limit: | |
if current_split: | |
splits.append(current_split) | |
current_split = [] | |
current_length = 0 | |
splits.append([token]) | |
elif current_length + token_length > limit: | |
splits.append(current_split) | |
current_split = [token] | |
current_length = token_length | |
else: | |
current_split.append(token) | |
current_length += token_length | |
if current_split: | |
splits.append(current_split) | |
return splits | |
# Codifica o texto original para obter os tokens | |
original_tokens = enc.encode(text) | |
# Divide os tokens mantendo o limite de caracteres | |
token_splits = split_tokens_with_limit(original_tokens, chunk_size) | |
# Reconstrói os splits em texto | |
splits = [enc.decode(split) for split in token_splits] | |
# Verifica se os tokens estão na mesma ordem | |
split_tokens = [] | |
for split in splits: | |
split_tokens.extend(enc.encode(split)) | |
# Verifica se os tokens estão na mesma ordem | |
if original_tokens == split_tokens: | |
print("A ordem dos tokens foi mantida.") | |
else: | |
print("A ordem dos tokens foi alterada.") | |
# Para visualização | |
print(len(original_tokens),"Original Tokens:", original_tokens) | |
print(len(split_tokens),"Split Tokens:", split_tokens) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment