Skip to content

Instantly share code, notes, and snippets.

@jadsongmatos
Last active July 25, 2024 18:21
Show Gist options
  • Save jadsongmatos/b78d145534472da54bfae18eb740ac98 to your computer and use it in GitHub Desktop.
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.
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