SemHash: implementación rápida de la deduplicación semántica de textos para mejorar la eficacia de la limpieza de datos

Introducción general

SemHash es una herramienta ligera y flexible para desduplicar conjuntos de datos por similitud semántica. Combina la rápida generación de incrustaciones de Model2Vec con la eficaz búsqueda de similitudes ANN (Approximate Nearest Neighbour) de Vicinity.SemHash admite tanto la desduplicación de conjuntos de datos individuales (por ejemplo, limpiando el conjunto de entrenamiento) como la desduplicación de conjuntos de datos múltiples (por ejemplo, asegurándose de que no haya solapamiento entre los conjuntos de prueba y entrenamiento). Es adecuado tanto para conjuntos de datos sencillos, como listas de texto, como para conjuntos de datos más complejos, como conjuntos de datos de control de calidad con varias columnas. Además, incluye la posibilidad de comprobar los resultados de la desduplicación, lo que facilita la comprensión y optimización del proceso de limpieza de datos.

 

Lista de funciones

  • Generación rápida de incrustaciones: Genera incrustaciones utilizando Model2Vec para una incrustación rápida y precisa.
  • Búsqueda eficiente de similitudes: Búsqueda eficiente de similitudes ANN con vecindad.
  • Desduplicación de un único conjunto de datos: limpieza de un único conjunto de datos para eliminar los datos duplicados.
  • Desduplicación de múltiples conjuntos de datos: Asegúrese de que no hay solapamiento entre múltiples conjuntos de datos para evitar la fuga de datos.
  • Desduplicación de conjuntos de datos de varias columnas: permite desduplicar conjuntos de datos complejos, como los de control de calidad.
  • Comprobación del resultado de la deduplicación: proporciona una función de comprobación detallada del resultado de la deduplicación, que ayuda a optimizar el proceso de limpieza de datos.

 

Utilizar la ayuda

Proceso de instalación

  1. Abra un terminal o una herramienta de línea de comandos.
  2. Introduzca el siguiente comando para instalar SemHash:
   pip install semhash

Utilización

Desduplicación de un solo conjunto de datos

  1. Carga el conjunto de datos:
   from datasets import load_dataset
from semhash import SemHash
texts = load_dataset("ag_news", split="train")["text"]
  1. Inicializa la instancia SemHash:
   semhash = SemHash.from_records(records=texts)
  1. Ponderar el conjunto de datos:
   deduplicated_texts = semhash.self_deduplicate().deduplicated

Desduplicación de múltiples conjuntos de datos

  1. Carga dos conjuntos de datos:
   train_texts = load_dataset("ag_news", split="train")["text"]
test_texts = load_dataset("ag_news", split="test")["text"]
  1. Inicializa la instancia SemHash:
   semhash = SemHash.from_records(records=train_texts)
  1. Ponderar el conjunto de datos de prueba:
   deduplicated_test_texts = semhash.deduplicate(records=test_texts, threshold=0.9).deduplicated

Desduplicación de conjuntos de datos de varias columnas

  1. Cargar un conjunto de datos de varias columnas:
   dataset = load_dataset("squad_v2", split="train")
records = [dict(row) for row in dataset]
  1. Inicializa la instancia SemHash:
   semhash = SemHash.from_records(records=records, columns=["question", "context"])
  1. Ponderar el conjunto de datos:
   deduplicated_records = semhash.self_deduplicate().deduplicated

Comprobación de los resultados de la desponderación

  1. Ver el texto desduplicado:
   result = semhash.self_deduplicate(records=texts, threshold=0.99)
for duplicate in result.duplicates:
print("RECORD:")
print(duplicate.record)
if duplicate.exact:
print("Exact match!")
else:
print("DUPLICATES:")
for corpus_duplicate in duplicate.duplicates:
print(corpus_duplicate)
print("-" * 25)

Con estos pasos, podrá empezar a utilizar rápidamente SemHash para la desduplicación semántica de conjuntos de datos y mejorar la eficacia de la limpieza de datos.

 

Descripción detallada de semhash

Nos complace anunciar el lanzamiento de semhash, nuestra herramienta de desduplicación semántica y versatilidad de conjuntos de datos (otras funciones próximamente).

breve

Un área de interés reciente, sobre todo en el entrenamiento de grandes modelos lingüísticos (LLM), es que, si bien es bueno tener muchos datos, tener una pequeña cantidad de ellos no lo es tanto.alta calidadLos datos serían mejores. Un buen ejemplo de ello puede encontrarse en el entrada en el blog de fineweb encontrado en , los autores empezaron con un conjunto de datos de volcado de rastreo de uso general muy grande y realizaron muchas comprobaciones de calidad en ese conjunto de datos, incluida la desduplicación y una serie de comprobaciones de calidad.

En Minish, nos interesa abrir nuevas posibilidades construyendo modelos muy rápidos. Como ya sabrá, creamos los mejores y más pequeños modelos rápidos del mundo poción-base-8m. Una de nuestras áreas de interés es 近似去重El objetivo es eliminar del corpus documentos muy similares desde el punto de vista semántico. Los algoritmos anteriores de eliminación de duplicados de texto, como minhash o simhash, funcionan con gramáticas de n-tuplas de caracteres o palabras, por lo que solo pueden encontrar similitudes entre secuencias de caracteres glíficamente similares, ignorando las similitudes semánticas.

Aunque la desduplicación parece algo que sólo puede beneficiar al entrenamiento de grandes modelos lingüísticos, también es realmente útil para comprobar solapamientos en conjuntos de datos pequeños: incluso un solapamiento estrecho entre los conjuntos de entrenamiento y prueba puede llevar a sobreestimar el rendimiento, y la presencia de duplicados cercanos en el conjunto de entrenamiento puede llevar a desperdiciar recursos computacionales, sobreestimar la importancia de las características y, potencialmente, a otros problemas.

Además, se pueden utilizar técnicas de desduplicación para obtener una visión general de conjuntos de datos más grandes: utilice la función semhash La comprobación de casi duplicados sólo lleva (mili)segundos y le permite ver qué elementos de su conjunto de datos son similares. Si tienen sentido: ¡genial! Si no hay duplicados ...... ¡también es genial! Todo es mejor que entrenar con datos incorrectos.

¿Cómo se utiliza la de-énfasis?

He aquí algunos casos de uso interesantes para que se haga una idea de cuándo tiene sentido realizar una desduplicación:

categorización

Como ya se ha mencionado, es importante que no haya solapamiento de información entre los conjuntos de entrenamiento y de prueba. La presencia de solapamiento suele significar que se está sobreestimando el rendimiento porque el modelo ya no necesita generalizar para funcionar bien. Sin embargo, eliminar duplicados del conjunto de entrenamiento también puede ser muy útil. Tener un gran número de duplicados del mismo registro en el conjunto de entrenamiento puede hacer que el modelo sobrestime la importancia de las características de ese registro y, en cualquier caso, puede provocar un desperdicio de recursos informáticos y una sobrestimación del ajuste del modelo.

Sistema RAG

RAG Los elementos duplicados en un sistema suenan raros hasta que se tiene en cuenta que la mayoría de los sistemas RAG se construyen utilizando bloques: mientras que tener duplicados exactos de documentos puede ser raro, tener bloques duplicados entre o dentro de documentos es mucho más común. Tener bloques duplicados en su base de conocimientos aumenta los costes de almacenamiento, incrementa el riesgo de recuperar bloques irrelevantes y le obliga a aplicar una estrategia de diversificación antes de lo necesario.

Interpretar su corpus

Al funcionar con un umbral bajo semhashEsto le permite ver rápidamente qué documentos son similares a otros y cuáles no. Esto le da una buena idea de en qué centrarse, qué falta en sus datos y cómo se relacionan sus documentos entre sí.

¿Cómo funciona?

semhash El núcleo del modelo consiste en tomar como entrada una colección de cadenas o diccionarios. Primero se inicializa el modelo con un conjunto de documentos de referencia y luego se utiliza este conjunto para desduplicar el conjunto entrante. Los documentos entrantes que sean similares a los del conjunto de referencia se eliminan y se almacenan por separado de sus casi duplicados en el conjunto de referencia.

from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("ag_news")
train = dataset["train"]
test = dataset["test"]
# 这会在您的训练集上创建一个索引。所有记录都完整存储。
semhash = SemHash.from_records(records=train, columns=["text"])
# 这会参考 `train` 对您的文本进行去重。任何在 train 中出现的项目都会
# 从 test 中删除。
result = semhash.deduplicate(test, threshold=0.9)
# 没有重复的集合
result.deduplicated
# 重复项
result.duplicates

Durante la adaptación, todos los documentos son codificados primero por un codificador. El codificador por defecto es poción-base-8mUn modelo2vec Modelos. A continuación, estos documentos se almacenan en el fichero proporcionado por el usearch de apoyo alrededores en el almacén de vectores. A continuación, para el conjunto de documentos entrantes, primero los codificamos utilizando el codificador especificado y luego recuperamos los vecinos más cercanos del almacén de vectores. Cada documento entrante que tenga un vecino más cercano con una similitud superior a un umbral se elimina.

Como todos estos componentes son tan rápidos, la desduplicación incluso de conjuntos de datos muy grandes sólo lleva unos minutos. Por ejemplo, la de-duplicación de todo el Conjunto de datos Squad-2.0 La desduplicación del conjunto de datos, que tiene 130.000 muestras, sólo lleva 7 segundos. Esto incluye la vectorización, el ajuste del índice y la desduplicación propiamente dicha. Los conjuntos de datos más pequeños tardan una fracción del tiempo, e incluso los conjuntos de datos que contienen millones de documentos tardan sólo unos minutos. Para una evaluación comparativa completa, consulte Nuestra evaluación comparativa.

interpretabilidad

semhash también puede utilizarse para investigar el conjunto de datos. Para ello, utilice la función self_deduplicatePuedes restar importancia al propio conjunto de entrenamiento, y lo utilizaremos como punto de partida:

from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("ag_news")
train = dataset["train"]
test = dataset["test"]
# 这会在您的训练集上创建一个索引。所有记录都完整存储。
semhash = SemHash.from_records(records=train, columns=["text"])
result = semhash.self_deduplicate(threshold=0.9)

Veamos con más detalle lo que puede hacer con result Qué hacer. En primer lugar, puede obtener todos los registros deduplicados:

result.deduplicated

Se trata exactamente de los mismos registros que usted introdujo, lo que le permite utilizarlos en otras canalizaciones de ML semhash.semhash No cambia tus datos, sólo reduce su tamaño.

Podrá ver fácilmente el porcentaje de registros duplicados:

result.duplicate_ratio

o entradas duplicadas exactas:

result.exact_duplicate_ratio

También puede ver qué elementos están marcados como duplicados, y elrazonamiento. Cada documento duplicado se almacena con el ejemplo en su índice que provocó que se marcara como elemento duplicado. Los duplicados exactos se marcan como duplicados exactos. El siguiente ejemplo de código demuestra el uso básico.

for duplicated_record in results.duplicates:
print(duplicated_record.record)
if duplicated_record.exact:
print("Exact match")
continue
for index_duplicate in duplicated_record.duplicates:
print(index_duplicate)
print("-" * 25)

Para facilitar su uso, también proporcionamos una función de ayuda que muestra su conjunto de elementos duplicadosmenosRegistros de desduplicación similares:

result.get_least_similar_from_duplicates(1)

Si este registro se sigue considerando un elemento duplicado para sus duplicados, ¡entonces su estrategia de duplicados tiene sentido! Si no es así, puede optar por restablecer el umbral para el conjunto de resultados. Al hacerlo, creará un nuevo umbral que eliminará las entradas duplicadas. Esto se muestra a continuación:

print(result.duplicate_ratio)
result.rethreshold(0.95)
print(result.duplicate_ratio)

Así pues, una estrategia generalizada podría consistir en empezar con un umbral relativamente bajo hasta que el result.get_least_similar_from_duplicates Los resultados devueltos empiezan a tener sentido. Sin embargo, un umbral de 0,9 (que es el predeterminado) funcionó bien en nuestros experimentos, pero asegúrese de comprobar su caso de uso específico.

datos multicolumna

semhash También admite conjuntos de datos de varias columnas, lo que le permite eliminar duplicados de conjuntos de datos que contienen texto en varias columnas. Por ejemplo, en un conjunto de datos de preguntas y respuestas, no sólo querrá eliminar los duplicados de preguntas similares o contextos similares, sino que también querrá contar como duplicados sólo aquellos elementos en los que ambos campos sean lo suficientemente similares.

Se trata de un problema difícil de resolver, pero semhash También puede ocuparse de esta cuestión.

El siguiente fragmento de código muestra cómo funciona:

from datasets import load_dataset
from semhash import SemHash
dataset = load_dataset("rajpurkar/squad_v2")
train = dataset["train"]
# 这会在您的训练集上创建一个索引。所有记录都完整存储。
semhash = SemHash.from_records(records=train, columns=["context", "question"])
result = semhash.self_deduplicate(threshold=0.9)

Calcula la similitud y sólo devuelve los registros en los que ambos campos son similares.

© declaración de copyright

Artículos relacionados

Sin comentarios

Debe iniciar sesión para participar en los comentarios.
Acceder ahora
ninguno
Sin comentarios...