Allgemeine Einführung
SemHash ist ein leichtgewichtiges und flexibles Werkzeug zur Deduplizierung von Datensätzen durch semantische Ähnlichkeit. Es kombiniert die schnelle Einbettungsgenerierung von Model2Vec mit der effizienten ANN-(Approximate Nearest Neighbour)-Ähnlichkeitssuche von Vicinity.SemHash unterstützt sowohl die Deduplizierung einzelner Datensätze (z. B. Bereinigung der Trainingsmenge) als auch die Deduplizierung mehrerer Datensätze (z. B. Sicherstellung, dass es keine Überschneidungen zwischen Test- und Trainingsmenge gibt). Es eignet sich sowohl für einfache Datensätze, wie z. B. Textlisten, als auch für komplexere Datensätze, wie z. B. mehrspaltige QA-Datensätze. Darüber hinaus bietet es die Möglichkeit, die Ergebnisse der Deduplizierung zu überprüfen, was es Ihnen erleichtert, den Datenbereinigungsprozess zu verstehen und zu optimieren.
Funktionsliste
- Schnelle Einbettungsgenerierung: Generieren Sie Einbettungen mit Model2Vec für eine schnelle und genaue Einbettung.
- Effiziente Ähnlichkeitssuche: Effiziente ANN-Ähnlichkeitssuche mit Vicinity.
- Einzeldatensatz-Deduplizierung: Bereinigung eines einzelnen Datensatzes, um doppelte Daten zu entfernen.
- Deduplizierung mehrerer Datensätze: Stellen Sie sicher, dass es keine Überschneidungen zwischen mehreren Datensätzen gibt, um Datenverluste zu vermeiden.
- Deduplizierung von mehrspaltigen Datensätzen: unterstützt die Deduplizierung komplexer Datensätze, wie z. B. QA-Datensätze.
- Überprüfung des Deduplizierungsergebnisses: Bietet eine detaillierte Prüffunktion des Deduplizierungsergebnisses, die zur Optimierung des Datenbereinigungsprozesses beiträgt.
Hilfe verwenden
Ablauf der Installation
- Öffnen Sie ein Terminal oder ein Befehlszeilentool.
- Geben Sie den folgenden Befehl ein, um SemHash zu installieren:
pip install semhash
Verwendung
Einzeldatensatz-Deduplizierung
- Laden Sie den Datensatz:
from datasets import load_dataset
from semhash import SemHash
Texte = load_dataset("ag_news", split="train")["text"]
- Initialisieren Sie die SemHash-Instanz:
semhash = SemHash.from_records(records=texts)
- Gewichtung des Datensatzes aufheben:
deduplizierte_texte = semhash.self_deduplicate().deduplicated
Entdopplung mehrerer Datensätze
- Laden Sie zwei Datensätze:
train_texts = load_dataset("ag_news", split="train")["text"]
test_texte = load_dataset("ag_news", split="test")["text"]
- Initialisieren Sie die SemHash-Instanz:
semhash = SemHash.from_records(records=train_texts)
- Gewichtung des Testdatensatzes aufheben:
deduplizierte_test_texte = semhash.deduplicate(records=test_texte, threshold=0.9).deduplicated
Entdopplung von mehrspaltigen Datensätzen
- Laden eines mehrspaltigen Datensatzes:
dataset = load_dataset("squad_v2", split="train")
records = [dict(row) for row in dataset]
- Initialisieren Sie die SemHash-Instanz:
semhash = SemHash.from_records(records=records, columns=["Frage", "Kontext"])
- Gewichtung des Datensatzes aufheben:
deduplizierte_Datensätze = semhash.self_deduplicate().deduplicated
Überprüfung der Abwägungsergebnisse
- Zeigen Sie den de-duplizierten Text an:
result = semhash.self_deduplicate(records=texts, threshold=0.99)
for duplicate in result.duplicates:
print("RECORD:")
print(duplicate.records)
if duplicate.exact: print("Genaue Übereinstimmung!")
print("Genaue Übereinstimmung!")
print("Genaue Übereinstimmung!")
print("DUPLICATES:")
for korpus_duplicate in duplicate.duplicates: print(korpus_duplicate)
print(Korpus_Duplikat)
print("-" * 25)
Mit diesen Schritten können Sie schnell mit SemHash zur semantischen Deduplizierung von Datensätzen beginnen und die Effizienz der Datenbereinigung verbessern.
Ausführliche Beschreibung von semhash
Wir freuen uns sehr, die Veröffentlichung von semhash, unserem Tool für semantische Deduplizierung und Datensatzvielfalt, ankündigen zu können (weitere Funktionen folgen in Kürze).
kurz
Ein neuerer Bereich von Interesse, insbesondere beim Training von Large Language Models (LLMs), ist, dass es zwar schön ist, viele Daten zu haben, aber eine kleine Menge vonhohe QualitätDie Daten würden besser sein. Ein gutes Beispiel dafür findet sich in der fineweb blog post Die Autoren begannen mit einem sehr großen allgemeinen Crawler-Dump-Datensatz und führten zahlreiche Qualitätsprüfungen an diesem Datensatz durch, einschließlich Deduplizierung und eine Reihe von Qualitätsprüfungen.
Bei Minish sind wir daran interessiert, neue Möglichkeiten durch den Bau sehr schneller Modelle zu erschließen. Wie Sie vielleicht wissen, bauen wir die besten und kleinsten Schnellmodelle der Welt Zaubertrank-Basis-8m. Einer unserer Interessenbereiche ist ungefähre Gewichtsabnahme
Wir wollen semantisch sehr ähnliche Dokumente aus dem Korpus entfernen. Bisherige Algorithmen zur Text-Deduplizierung, wie z.B. minhash oder simhash, arbeiten mit Zeichen- oder Wort-N-Tupel-Grammatiken und können daher nur Ähnlichkeiten zwischen Sequenzen von glyphisch ähnlichen Zeichen finden, ohne semantische Ähnlichkeiten zu berücksichtigen.
Auch wenn Deduplizierung nach etwas klingt, das nur für das Training großer Sprachmodelle von Nutzen sein kann, ist sie auch für die Überprüfung von Überschneidungen in kleinen Datensätzen sehr nützlich: Selbst enge Überschneidungen zwischen Trainings- und Testdatensätzen können zu einer Überschätzung der Leistung führen, und das Vorhandensein von engen Duplikaten im Trainingssatz kann zu vergeudeten Rechenressourcen, einer Überschätzung der Bedeutung von Merkmalen und möglicherweise anderen Problemen führen.
Darüber hinaus können Sie sich mit Hilfe von Deduplizierungstechniken einen Überblick über größere Datenmengen verschaffen: Verwenden Sie die semhash
Die Prüfung auf Beinahe-Duplikate dauert nur (Milli-)Sekunden und ermöglicht es Ihnen zu sehen, welche Elemente in Ihrem Datensatz ähnlich aussehen. Wenn diese einen Sinn ergeben: großartig! Wenn es keine Duplikate gibt, ist ...... ebenfalls großartig! Alles ist besser, als mit falschen Daten zu trainieren.
Wie verwende ich De-Emphasis?
Die folgenden Anwendungsfälle sollen Ihnen eine Vorstellung davon vermitteln, wann eine Deduplizierung sinnvoll ist:
Kategorisierung
Wie bereits erwähnt, ist es wichtig, dass es keine Überschneidungen von Informationen zwischen den Trainings- und den Testsätzen gibt. Das Vorhandensein von Überschneidungen bedeutet in der Regel, dass die Leistung überschätzt wird, weil das Modell nicht mehr verallgemeinern muss, um gut abzuschneiden. Es kann jedoch auch sehr nützlich sein, Duplikate aus der Trainingsmenge zu entfernen. Eine große Anzahl von Duplikaten desselben Datensatzes in der Trainingsmenge kann dazu führen, dass das Modell die Bedeutung der Merkmale dieses Datensatzes überschätzt, was in jedem Fall zu einer Verschwendung von Rechenressourcen und einer Überschätzung der Modellanpassung führt.
RAG-System
RAG Doppelte Elemente in einem System scheinen selten zu sein, bis man bedenkt, dass die meisten RAG-Systeme mit Blöcken aufgebaut sind: Exakte Duplikate von Dokumenten sind zwar selten, aber doppelte Blöcke zwischen oder innerhalb von Dokumenten sind viel häufiger. Doppelte Blöcke in Ihrer Wissensdatenbank erhöhen die Speicherkosten, erhöhen das Risiko, irrelevante Blöcke abzurufen, und zwingen Sie, eine Diversifizierungsstrategie früher als nötig zu implementieren.
Interpretation Ihres Korpus
Durch die Verwendung einer niedrigen Schwelle semhash
Auf diese Weise können Sie schnell erkennen, welche Dokumente welchen Dokumenten ähnlich sind und welche nicht. So erhalten Sie eine gute Vorstellung davon, worauf Sie sich konzentrieren sollten, was in Ihren Daten fehlt und wie Ihre Dokumente zueinander in Beziehung stehen.
Wie funktioniert das?
semhash
Der Kern des Prozesses besteht darin, eine Sammlung von Zeichenketten oder Wörterbüchern als Eingabe zu verwenden. Sie initialisieren das Modell zunächst mit einem Satz von Referenzdokumenten und verwenden dann diesen Satz, um den eingehenden Satz zu de-duplizieren. Alle eingehenden Dokumente, die den Dokumenten in der Referenzmenge ähnlich sind, werden entfernt und getrennt von ihren Fast-Duplikaten in der Referenzmenge gespeichert.
from datasets import load_dataset
from semhash import SemHash
datensatz = load_datensatz("ag_news")
train = datensatz["train"]
test = datensatz["test"]
# Damit wird ein Index für Ihren Trainingssatz erstellt. Alle Datensätze werden in voller Länge gespeichert.
semhash = SemHash.from_records(records=train, columns=["text"])
# Dies verweist auf `train`, um die Gewichtung Ihres Textes zu verringern. Alle Elemente, die in train vorkommen, werden
# werden aus test entfernt.
Ergebnis = semhash.deduplicate(test, threshold=0.9)
# Satz ohne Duplikate
result.deduplicated
# Doppelte Elemente
result.duplicates
Bei der Anpassung werden alle Dokumente zunächst von einem Kodierer kodiert. Der Standard-Encoder ist Zaubertrank-Basis-8mEine model2vec Modelle. Diese Dokumente werden dann in der Datei gespeichert, die von der ussuche unterstützend Umgebung im Vektorspeicher. Dann werden die eingehenden Dokumente zunächst mit dem angegebenen Kodierer kodiert und dann die nächsten Nachbarn aus dem Vektorspeicher abgerufen. Jedes eingehende Dokument, das einen nächsten Nachbarn mit einer Ähnlichkeit über einem Schwellenwert hat, wird entfernt.
Da alle diese Komponenten so schnell sind, dauert die Deduplizierung selbst sehr großer Datensätze nur wenige Minuten. Zum Beispiel kann die Deduplizierung des gesamten Squad-2.0-Datensatz Die Deduplizierung des Datensatzes, der 130.000 Stichproben umfasst, dauert nur 7 Sekunden. Dies umfasst die Vektorisierung, die Anpassung des Index und die eigentliche Deduplizierung. Kleinere Datensätze benötigen nur einen Bruchteil der Zeit, und selbst Datensätze mit Millionen von Dokumenten benötigen nur wenige Minuten. Umfassende Benchmarking-Tests finden Sie unter Unser Benchmarking.
Interpretierbarkeit
semhash
kann auch zur Untersuchung Ihres Datensatzes verwendet werden. Dies geschieht durch die Verwendung der selbst_deduplizieren
Sie können das Trainingsset selbst vernachlässigen, und wir werden es als Ausgangspunkt verwenden:
from datasets import load_dataset
from semhash import SemHash
datensatz = load_datensatz("ag_news")
train = datensatz["train"]
test = datensatz["test"]
# Damit wird ein Index für Ihren Trainingssatz erstellt. Alle Datensätze werden in voller Länge gespeichert.
semhash = SemHash.from_records(records=train, columns=["text"])
Ergebnis = semhash.self_deduplicate(threshold=0.9)
Werfen wir einen genaueren Blick auf die Möglichkeiten, die Sie mit Ergebnis
Was zu tun ist. Zunächst können Sie einfach alle de-duplizierten Datensätze abrufen:
ergebnis.dedupliziert
Dies sind genau die gleichen Datensätze, die Sie eingegeben haben, so dass Sie sie in anderen ML-Pipelines verwenden können semhash
.semhash
Die Daten werden nicht verändert, sondern nur verkleinert.
Sie können den Prozentsatz der doppelten Datensätze leicht erkennen:
result.duplicate_ratio
oder exakte doppelte Einträge:
result.exact_duplicate_ratio
Sie können auch sehen, welche Objekte als Duplikate markiert sind, und dieBegründung. Jedes doppelte Dokument wird mit dem Beispiel in seinem Index gespeichert, das dazu geführt hat, dass es als doppeltes Objekt markiert wurde. Exakte Duplikate werden als exakte Duplikate gekennzeichnet. Das folgende Codebeispiel demonstriert die grundlegende Verwendung.
for duplicated_record in results.duplicates: print(duplicated_record.record)
print(duplizierter_datensatz.datensatz)
if duplicated_record.exact: print("Genaue Übereinstimmung")
print("Genaue Übereinstimmung")
weiter
for index_duplicate in duplicated_record.duplicates: print(index_duplicate)
print(index_duplikat)
print("-" * 25)
Zur Erleichterung der Benutzung bieten wir auch eine Hilfsfunktion an, die die Menge der doppelten Objekte anzeigtam wenigstenÄhnliche Deduplizierungssätze:
result.get_least_similar_from_duplicates(1)
Wenn dieser Datensatz für seine Duplikate immer noch als Dublette gilt, ist Ihre Dublettenstrategie sinnvoll! Wenn nicht, haben Sie die Möglichkeit, den Schwellenwert für die Ergebnismenge zurückzusetzen. Auf diese Weise erstellen Sie einen neuen Schwellenwert, der doppelte Einträge entfernt. Dies ist unten dargestellt:
print(result.duplicate_ratio)
result.rethreshold(0.95)
print(result.duplicate_ratio)
Eine allgemeine Strategie könnte also darin bestehen, mit einer relativ niedrigen Schwelle zu beginnen, bis die result.get_least_similar_from_duplicates
Die zurückgegebenen Ergebnisse ergeben langsam einen Sinn. Ein Schwellenwert von 0,9 (Standardeinstellung) hat sich in unseren Experimenten bewährt, aber prüfen Sie Ihren speziellen Anwendungsfall.
mehrspaltige Daten
semhash
Auch mehrspaltige Datensätze werden unterstützt, so dass Sie Datensätze, die Text in mehreren Spalten enthalten, von Duplikaten befreien können. In einem Q&A-Datensatz möchten Sie zum Beispiel nicht nur ähnliche Fragen oder ähnliche Kontexte entfernen, sondern auch nur die Elemente als Duplikate zählen, bei denen beide Felder ähnlich genug sind.
Dies ist ein schwer zu lösendes Problem, aber semhash
Sie kann auch dieses Problem lösen.
Der folgende Codeschnipsel zeigt, wie es funktioniert:
from datasets import load_dataset
from semhash import SemHash
datensatz = load_datensatz("rajpurkar/squad_v2")
train = dataset["train"]
# Damit wird ein Index für Ihren Trainingssatz erstellt. Alle Datensätze werden in voller Länge gespeichert.
semhash = SemHash.from_records(records=train, columns=["context", "question"])
Ergebnis = semhash.self_deduplicate(threshold=0.9)
Dabei wird die Ähnlichkeit berechnet und es werden nur Datensätze zurückgegeben, bei denen beide Felder ähnlich sind.