Introdução geral
O SemHash é uma ferramenta leve e flexível para eliminar a duplicação de conjuntos de dados por similaridade semântica. Ele combina a rápida geração de incorporação do Model2Vec com a eficiente pesquisa de similaridade ANN (Approximate Nearest Neighbour) do Vicinity.O SemHash é compatível com a desduplicação de um único conjunto de dados (por exemplo, limpar o conjunto de treinamento) e com a desduplicação de vários conjuntos de dados (por exemplo, garantir que não haja sobreposição entre os conjuntos de teste e de treinamento). Ele é adequado para conjuntos de dados simples, como listas de texto, bem como para conjuntos de dados mais complexos, como conjuntos de dados de controle de qualidade com várias colunas. Além disso, inclui a capacidade de verificar os resultados da desduplicação, facilitando a compreensão e a otimização do processo de limpeza de dados.
Lista de funções
- Geração rápida de incorporação: gere incorporação usando Model2Vec para incorporação rápida e precisa.
- Pesquisa eficiente de similaridade: Pesquisa eficiente de similaridade ANN com Vicinity.
- Desduplicação de um único conjunto de dados: limpe um único conjunto de dados para remover dados duplicados.
- Desduplicação de vários conjuntos de dados: garanta que não haja sobreposição entre vários conjuntos de dados para evitar o vazamento de dados.
- Desduplicação de conjuntos de dados com várias colunas: suporta a desduplicação de conjuntos de dados complexos, como o conjunto de dados de controle de qualidade.
- Verificação do resultado da desduplicação: fornece uma função de verificação detalhada do resultado da desduplicação, o que ajuda a otimizar o processo de limpeza de dados.
Usando a Ajuda
Processo de instalação
- Abra um terminal ou uma ferramenta de linha de comando.
- Digite o seguinte comando para instalar o SemHash:
pip install semhash
Uso
Desduplicação de um único conjunto de dados
- Carregar o conjunto de dados:
from datasets import load_dataset
from semhash import SemHash
texts = load_dataset("ag_news", split="train")["text"]
- Inicializa a instância do SemHash:
semhash = SemHash.from_records(records=texts)
- Reduzir a ponderação do conjunto de dados:
deduplicated_texts = semhash.self_deduplicate().deduplicated
Desduplicação de vários conjuntos de dados
- Carregue dois conjuntos de dados:
train_texts = load_dataset("ag_news", split="train")["text"]
test_texts = load_dataset("ag_news", split="test")["text"]
- Inicializa a instância do SemHash:
semhash = SemHash.from_records(records=train_texts)
- Reduzir a ponderação do conjunto de dados de teste:
deduplicated_test_texts = semhash.deduplicate(records=test_texts, threshold=0.9).deduplicated
Desduplicação de conjuntos de dados com várias colunas
- Carregar um conjunto de dados com várias colunas:
dataset = load_dataset("squad_v2", split="train")
registros = [dict(row) for row in dataset]
- Inicializa a instância do SemHash:
semhash = SemHash.from_records(records=records, columns=["question", "context"])
- Reduzir a ponderação do conjunto de dados:
deduplicated_records = semhash.self_deduplicate().deduplicated
Verificação dos resultados da redução da ponderação
- Visualizar o texto desduplicado:
result = semhash.self_deduplicate(records=texts, threshold=0.99)
for duplicate in result.duplicates:
print("RECORD:")
print(duplicate.records)
if duplicate.exact: print("Correspondência exata!")
print("Correspondência exata!")
print("Correspondência exata!")
print("DUPLICATAS:")
for corpus_duplicate in duplicate.duplicates: print(corpus_duplicate)
print(corpus_duplicate)
print("-" * 25)
Com essas etapas, você pode começar a usar rapidamente o SemHash para desduplicação semântica de conjuntos de dados e aumentar a eficiência da limpeza de dados.
Descrição detalhada do semhash
Estamos muito animados em anunciar o lançamento do semhash, nossa ferramenta de desduplicação semântica e versatilidade de conjuntos de dados (outros recursos serão lançados em breve).
breve
Uma área de interesse recente, especialmente no treinamento de modelos de linguagem grandes (LLMs), é que, embora seja bom ter muitos dados, ter uma pequena quantidade dealta qualidadeOs dados seriam melhores. Um bom exemplo disso pode ser encontrado no postagem no blog da fineweb encontrado em , os autores começaram com um conjunto de dados de despejo de rastreador de uso geral muito grande e realizaram muitas verificações de qualidade nesse conjunto de dados, incluindo a eliminação da duplicação e uma série de verificações de qualidade.
Na Minish, estamos interessados em desbloquear novas possibilidades por meio da criação de modelos muito rápidos. Como você deve saber, criamos os melhores e menores modelos rápidos do mundo potion-base-8m. Uma de nossas áreas de interesse é remoção aproximada de peso
Descrição: Queremos remover documentos semanticamente muito semelhantes do corpus. Algoritmos de desduplicação de texto anteriores, como o minhash ou o simhash, operam em gramáticas de n-tuplas de caracteres ou palavras e, portanto, só conseguem encontrar semelhanças entre sequências de caracteres glificamente semelhantes, ignorando as semelhanças semânticas.
Embora a desduplicação pareça ser algo que só pode beneficiar o treinamento de grandes modelos de linguagem, ela também é muito útil para verificar a sobreposição em pequenos conjuntos de dados: até mesmo uma sobreposição próxima entre os conjuntos de treinamento e teste pode levar a uma superestimação do desempenho, e a presença de duplicatas próximas no conjunto de treinamento pode levar ao desperdício de recursos computacionais, à superestimação da importância do recurso e, possivelmente, a outros problemas.
Além disso, as técnicas de eliminação de duplicação podem ser usadas para fornecer uma visão geral de conjuntos de dados maiores: use a função semhash
A verificação de duplicatas próximas leva apenas (mili)segundos e permite que você veja quais itens do seu conjunto de dados são semelhantes. Se isso fizer sentido: ótimo! Se não houver duplicatas, ...... também é ótimo! Tudo é melhor do que treinar com dados incorretos.
Como faço para usar a redução de ênfase?
Aqui estão alguns casos de uso interessantes para lhe dar uma ideia de quando faz sentido fazer a desduplicação:
categorização
Conforme mencionado acima, é importante que não haja sobreposição de informações entre os conjuntos de treinamento e de teste. A presença de sobreposição geralmente significa que você está superestimando o desempenho porque o modelo não precisa mais generalizar para ter um bom desempenho. Entretanto, a remoção de duplicatas do conjunto de treinamento também pode ser muito útil. Ter um grande número de duplicatas do mesmo registro no conjunto de treinamento pode fazer com que o modelo superestime a importância dos recursos desse registro e, de qualquer forma, pode levar ao desperdício de recursos computacionais e a uma superestimação do ajuste do modelo.
Sistema RAG
RAG Itens duplicados em um sistema parecem raros até que você considere que a maioria dos sistemas RAG é construída usando blocos: embora seja raro ter duplicatas exatas de documentos, ter blocos duplicados entre ou dentro de documentos é muito mais comum. Ter blocos duplicados em sua base de conhecimento aumenta os custos de armazenamento, aumenta o risco de recuperação de blocos irrelevantes e o força a implementar uma estratégia de diversificação antes do necessário.
Interpretação de seu corpus
Ao operar com um limite baixo semhash
Isso permite que você veja rapidamente quais documentos são semelhantes a quais documentos e quais documentos não são semelhantes. Isso lhe dá uma boa ideia do que focar, o que está faltando nos seus dados e como os documentos se relacionam entre si.
Como isso funciona?
semhash
A essência do processo é receber como entrada uma coleção de strings ou dicionários. Primeiro, você inicializa o modelo com um conjunto de documentos de referência e, em seguida, usa esse conjunto para desduplicar o conjunto de entrada. Todos os documentos recebidos que são semelhantes aos documentos do conjunto de referência são removidos e armazenados separadamente de suas duplicatas próximas no conjunto de referência.
from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("ag_news")
train = conjunto de dados["train"]
teste = conjunto de dados["teste"]
# Isso criará um índice em seu conjunto de treinamento. Todos os registros são armazenados por completo.
semhash = SemHash.from_records(records=train, columns=["text"])
# Isso fará referência ao `train` para reduzir a ponderação do texto. Todos os itens que aparecerem no treinamento serão
# serão removidos do teste.
result = semhash.deduplicate(test, threshold=0.9)
# Conjunto sem duplicatas
result.deduplicated
# Itens duplicados
result.duplicates
Durante o ajuste, todos os documentos são codificados primeiro por um codificador. O codificador padrão é potion-base-8mUm model2vec Modelos. Esses documentos são armazenados no arquivo fornecido pelo pesquisa de uso de apoio vizinhança no armazenamento de vetores. Em seguida, para o conjunto de documentos recebidos, primeiro os codificamos usando o codificador especificado e, depois, recuperamos os vizinhos mais próximos do armazenamento de vetores. Cada documento de entrada que tenha um vizinho mais próximo com similaridade acima de um limite é removido.
Como todos esses componentes são muito rápidos, a desduplicação até mesmo de conjuntos de dados muito grandes leva apenas alguns minutos. Por exemplo, a eliminação da duplicação de todo o Conjunto de dados Squad-2.0 A eliminação da duplicação do conjunto de dados, que tem 130.000 amostras, leva apenas 7 segundos. Isso inclui a vetorização, o ajuste do índice e a eliminação real da duplicação. Conjuntos de dados menores levam uma fração do tempo, e até mesmo conjuntos de dados com milhões de documentos levam apenas alguns minutos. Para um benchmarking abrangente, consulte Nosso benchmarking.
interpretabilidade
semhash
também pode ser usado para investigar seu conjunto de dados. Isso é feito com o uso da função auto-deduplicado
Você pode reduzir a ênfase no próprio conjunto de treinamento, e usaremos isso como ponto de partida:
from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("ag_news")
train = conjunto de dados["train"]
teste = conjunto de dados["teste"]
# Isso criará um índice em seu conjunto de treinamento. Todos os registros são armazenados por completo.
semhash = SemHash.from_records(records=train, columns=["text"])
result = semhash.self_deduplicate(threshold=0.9)
Vamos dar uma olhada mais profunda no que você pode fazer com resultado
O que fazer. Primeiro, você pode simplesmente obter todos os registros sem duplicação:
result.deduplicated
Esses são exatamente os mesmos registros que você inseriu, permitindo que você os use em outros pipelines de ML semhash
.semhash
Não altera seus dados, apenas reduz o tamanho dos dados.
É possível ver facilmente a porcentagem de registros duplicados:
result.duplicate_ratio
ou entradas duplicadas exatas:
result.exact_duplicate_ratio
Você também pode ver quais itens estão marcados como duplicados e oracionalidade. Cada documento duplicado é armazenado com o exemplo em seu índice que o levou a ser marcado como um item duplicado. As duplicatas exatas são marcadas como duplicatas exatas. O exemplo de código a seguir demonstra o uso básico.
for duplicated_record in results.duplicates: print(duplicated_record.record)
print(registro_duplicado.registro)
if duplicated_record.exact: print("Correspondência exata")
print("Correspondência exata")
continuar
for index_duplicate in duplicated_record.duplicates: print(index_duplicate)
print(index_duplicate)
print("-" * 25)
Para facilitar o uso, também fornecemos uma função auxiliar que exibe seu conjunto de itens duplicadosmenosRegistros de desduplicação semelhantes:
result.get_least_similar_from_duplicates(1)
Se esse registro ainda for considerado um item duplicado para suas duplicatas, então sua estratégia de duplicatas faz sentido! Caso contrário, você tem a opção de redefinir o limite do conjunto de resultados. Ao fazer isso, você criará um novo limite que removerá os registros duplicados. Isso é mostrado abaixo:
print(result.duplicate_ratio)
result.rethreshold(0.95)
print(result.duplicate_ratio)
Assim, uma estratégia generalizada pode ser começar com um limite relativamente baixo até que o result.get_least_similar_from_duplicates
Os resultados retornados começam a fazer sentido. No entanto, um limite de 0,9 (que é o padrão) funcionou bem em nossos experimentos, mas não deixe de verificar seu caso de uso específico.
dados com várias colunas
semhash
Conjuntos de dados com várias colunas também são suportados, permitindo que você elimine a duplicação de conjuntos de dados que contêm texto em várias colunas. Por exemplo, em um conjunto de dados de perguntas e respostas, você não apenas deseja eliminar a duplicação de perguntas ou contextos semelhantes, mas também deseja contar como duplicados apenas os itens em que ambos os campos são suficientemente semelhantes.
Esse é um problema difícil de resolver, mas semhash
Ele também pode lidar com esse problema.
O trecho de código a seguir demonstra como isso funciona:
from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("rajpurkar/squad_v2")
train = dataset["train"]
# Isso criará um índice em seu conjunto de treinamento. Todos os registros são armazenados por completo.
semhash = SemHash.from_records(records=train, columns=["context", "question"])
result = semhash.self_deduplicate(threshold=0.9)
Isso calcula a similaridade e retorna apenas os registros em que os dois campos são semelhantes.