SemHash: быстрая реализация семантической дедупликации текста для повышения эффективности очистки данных
Общее введение
SemHash - это легкий и гибкий инструмент для дедупликации наборов данных по семантическому сходству. Он сочетает в себе быструю генерацию вкраплений Model2Vec и эффективный поиск сходства ANN (Approximate Nearest Neighbour) в Vicinity.SemHash поддерживает как дедупликацию одного набора данных (например, очистка обучающего набора), так и дедупликацию нескольких наборов данных (например, обеспечение отсутствия перекрытия между тестовым и обучающим наборами). Он подходит как для простых наборов данных, таких как текстовые списки, так и для более сложных наборов данных, таких как многоколоночные наборы QA. Кроме того, в программе предусмотрена возможность проверки результатов дедупликации, что облегчает понимание и оптимизацию процесса очистки данных.
Список функций
- Быстрая генерация вкраплений: генерируйте вкрапления с помощью Model2Vec для быстрого и точного встраивания.
- Эффективный поиск сходства: эффективный поиск сходства ANN с окрестностями.
- Дедупликация одного набора данных: очистка одного набора данных для удаления дублирующихся данных.
- Дедупликация нескольких наборов данных: убедитесь в отсутствии дублирования между несколькими наборами данных, чтобы предотвратить утечку данных.
- Дедупликация наборов данных с несколькими столбцами: поддерживает дедупликацию сложных наборов данных, таких как наборы данных QA.
- Проверка результатов дедупликации: обеспечивает функцию детальной проверки результатов дедупликации, что помогает оптимизировать процесс очистки данных.
Использование помощи
Процесс установки
- Откройте терминал или инструмент командной строки.
- Введите следующую команду для установки SemHash:
pip install semhash
Использование
Дедупликация одного набора данных
- Загрузите набор данных:
from datasets import load_dataset
from semhash import SemHash
texts = load_dataset("ag_news", split="train")["text"]
- Инициализируйте экземпляр SemHash:
semhash = SemHash.from_records(records=texts)
- Уменьшите вес набора данных:
deduplicated_texts = semhash.self_deduplicate().deduplicated
Дедупликация нескольких наборов данных
- Загрузите два набора данных:
train_texts = load_dataset("ag_news", split="train")["text"]
test_texts = load_dataset("ag_news", split="test")["text"]
- Инициализируйте экземпляр SemHash:
semhash = SemHash.from_records(records=train_texts)
- Уменьшите вес тестового набора данных:
deduplicated_test_texts = semhash.deduplicate(records=test_texts, threshold=0.9).deduplicated
Дедупликация многоколоночных наборов данных
- Загрузите набор данных с несколькими столбцами:
dataset = load_dataset("squad_v2", split="train")
records = [dict(row) for row in dataset]
- Инициализируйте экземпляр SemHash:
semhash = SemHash.from_records(records=records, columns=["question", "context"])
- Уменьшите вес набора данных:
deduplicated_records = semhash.self_deduplicate().deduplicated
Проверка результатов де-взвешивания
- Просмотрите продублированный текст:
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)
Выполнив эти шаги, вы сможете быстро приступить к работе с SemHash для семантического дедублирования наборов данных и повысить эффективность очистки данных.
Подробное описание semhash
Мы очень рады объявить о выпуске semhash, нашего инструмента для семантического дедублирования и универсальности наборов данных (другие функции скоро появятся).
краткое содержание
В последнее время, особенно в области обучения больших языковых моделей (LLM), интерес вызывает тот факт, что, хотя хорошо иметь много данных, небольшой объемвысокое качествоДанные будут лучше. Хороший пример этого можно найти в Запись в блоге fineweb найденный в , авторы начали с очень большого набора данных дампа краулера общего назначения и провели множество проверок качества этого набора данных, включая дедупликацию и серию проверок качества.
В компании Minish мы заинтересованы в раскрытии новых возможностей путем создания очень быстрых моделей. Как вы, возможно, знаете, мы создаем лучшие в мире и самые маленькие быстрые модели. potion-base-8m. Одной из сфер наших интересов является 近似去重
: Мы хотим удалить из корпуса семантически очень похожие документы. Предыдущие алгоритмы дедупликации текста, такие как minhash или simhash, оперируют грамматиками символов или слов в виде n-кортежей и, таким образом, могут находить сходства только между последовательностями глифически похожих символов, игнорируя семантические сходства.
Хотя де-дупликация кажется чем-то, что может принести пользу только при обучении больших языковых моделей, она также очень полезна для проверки дублирования в небольших наборах данных: даже близкое совпадение обучающего и тестового наборов может привести к переоценке производительности, а наличие близких дубликатов в обучающем наборе может привести к напрасной трате вычислительных ресурсов, переоценке важности признаков и потенциально другим проблемам.
Кроме того, методы дедупликации могут быть использованы для получения обзора больших наборов данных: используйте semhash
Проверка на наличие близких дубликатов занимает всего (милли)секунды и позволяет увидеть, какие элементы в вашем наборе данных похожи друг на друга. Если они имеют смысл: отлично! Если дубликатов нет ...... - тоже отлично! Все лучше, чем обучение на неверных данных.
Как использовать деэмфазис?
Вот несколько интересных примеров использования, которые помогут вам понять, когда имеет смысл проводить дедупликацию:
категоризация
Как уже говорилось выше, важно, чтобы информация между обучающим и тестовым наборами не пересекалась. Наличие дублирования обычно означает, что вы переоцениваете производительность, поскольку модели больше не нужно обобщать, чтобы показать хорошие результаты. Однако удаление дубликатов из обучающего набора также может быть очень полезным. Наличие большого количества дубликатов одной и той же записи в обучающем наборе может привести к тому, что модель будет переоценивать важность характеристик этой записи, и в любом случае это может привести к напрасной трате вычислительных ресурсов и переоценке пригодности модели.
Система RAG
RAG Дублирование элементов в системе кажется редким явлением, если не учитывать, что большинство систем RAG построено на основе блоков: если точные дубликаты документов могут быть редкостью, то дублирование блоков между или внутри документов встречается гораздо чаще. Наличие дубликатов в базе знаний увеличивает затраты на хранение, повышает риск поиска неактуальных блоков и заставляет вас реализовывать стратегию диверсификации раньше, чем это необходимо.
Интерпретация вашего корпуса
Бег с низким порогом semhash
Это позволит вам быстро увидеть, какие документы похожи, а какие нет. Это даст вам представление о том, на чем следует сосредоточиться, чего не хватает в ваших данных и как ваши документы связаны друг с другом.
Как это работает?
semhash
Суть модели заключается в том, чтобы принимать на вход набор строк или словарей. Сначала вы инициализируете модель набором эталонных документов, а затем используете этот набор для дедупликации входящего набора. Все входящие документы, похожие на документы из эталонного набора, удаляются и хранятся отдельно от их близких дубликатов в эталонном наборе.
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
Во время установки все документы сначала кодируются кодировщиком. По умолчанию используется кодировщик potion-base-8mОдин модель2век Модели. Эти документы хранятся в файле, предоставленном поиск поддержка окрестности в хранилище векторов. Затем для набора входящих документов мы сначала кодируем их с помощью указанного кодировщика, а затем извлекаем ближайших соседей из хранилища векторов. Каждый входящий документ, у которого ближайший сосед имеет сходство выше порогового значения, удаляется.
Благодаря высокой скорости работы всех этих компонентов дедупликация даже очень больших наборов данных занимает всего несколько минут. Например, дедупликация всего Набор данных Squad-2.0 Дедупликация набора данных, содержащего 130 000 образцов, занимает всего 7 секунд. Это включает векторизацию, подгонку индекса и собственно дедупликацию. На меньшие наборы данных уходит в разы меньше времени, и даже на наборы данных, содержащие миллионы документов, уходит всего несколько минут. Всесторонний сравнительный анализ см. Наш бенчмаркинг.
интерпретируемость
semhash
также можно использовать для исследования вашего набора данных. Это можно сделать с помощью функции self_deduplicate
Вы можете не акцентировать внимание на самом обучающем наборе, и мы будем использовать его в качестве отправной точки:
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)
Давайте подробнее рассмотрим, что вы можете сделать с помощью result
Что делать. Во-первых, вы можете просто получить все дедуплицированные записи:
result.deduplicated
Это точно такие же записи, которые вы вводите, что позволяет использовать их в других конвейерах ML. semhash
.semhash
Не изменяет данные, а просто уменьшает их размер.
Вы можете легко увидеть процент дублирующихся записей:
result.duplicate_ratio
или точные дубликаты записей:
result.exact_duplicate_ratio
Вы также можете увидеть, какие элементы помечены как дубликаты, иобоснование. Каждый дубликат документа хранится вместе с примером в его индексе, из-за которого он был помечен как дубликат. Точные дубликаты помечаются как точные дубликаты. Следующий пример кода демонстрирует базовое использование.
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)
Для удобства использования мы также предоставляем вспомогательную функцию, которая отображает набор дублирующихся элементовнаименееПохожие записи для дедупликации:
result.get_least_similar_from_duplicates(1)
Если эта запись по-прежнему считается дубликатом для своих дубликатов, значит, ваша стратегия дубликатов имеет смысл! Если нет, у вас есть возможность сбросить порог для набора результатов. При этом вы создадите новый порог, который будет удалять дубликаты. Это показано ниже:
print(result.duplicate_ratio)
result.rethreshold(0.95)
print(result.duplicate_ratio)
Таким образом, обобщенная стратегия может заключаться в том, чтобы начать с относительно низкого порога до тех пор, пока result.get_least_similar_from_duplicates
Полученные результаты начинают приобретать смысл. Однако в наших экспериментах порог 0,9 (который используется по умолчанию) работал хорошо, но обязательно проверьте свой конкретный случай использования.
многоколоночные данные
semhash
Также поддерживаются наборы данных с несколькими колонками, что позволяет исключить дублирование наборов данных, содержащих текст в нескольких колонках. Например, в наборе данных Q&A нужно не только исключить дублирование похожих вопросов или похожих контекстов, но и засчитать в качестве дубликатов только те элементы, в которых оба поля достаточно похожи.
Решить эту проблему непросто, но semhash
Он также может решить эту проблему.
Следующий фрагмент кода демонстрирует, как это работает:
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)
При этом вычисляется сходство и возвращаются только те записи, в которых оба поля похожи.
© заявление об авторских правах
Авторское право на статью Круг обмена ИИ Пожалуйста, не воспроизводите без разрешения.
Похожие статьи
Нет комментариев...