SemHash: 시맨틱 텍스트 중복 제거를 빠르게 구현하여 데이터 정리 효율성 향상

최신 AI 리소스7개월 전 업데이트 AI 공유 서클
11.8K 00

일반 소개

SemHash는 의미적 유사성을 기준으로 데이터 세트의 중복을 제거하기 위한 가볍고 유연한 도구입니다. Model2Vec의 빠른 임베딩 생성과 Vicinity의 효율적인 ANN(근사 최인접 이웃) 유사도 검색을 결합한 SemHash는 단일 데이터 세트 중복 제거(예: 훈련 세트 정리)와 다중 데이터 세트 중복 제거(예: 테스트 세트와 훈련 세트 간에 중복이 없는지 확인)를 모두 지원합니다. 텍스트 목록과 같은 간단한 데이터 세트는 물론, 여러 열로 구성된 QA 데이터 세트와 같은 보다 복잡한 데이터 세트에도 적합합니다. 또한 중복 제거 결과를 확인할 수 있는 기능도 포함되어 있어 데이터 정리 프로세스를 더 쉽게 이해하고 최적화할 수 있습니다.

 

기능 목록

  • 빠른 임베딩 생성: 빠르고 정확한 임베딩을 위해 Model2Vec을 사용하여 임베딩을 생성합니다.
  • 효율적인 유사도 검색: 인접성을 이용한 효율적인 ANN 유사도 검색.
  • 단일 데이터 세트 중복 제거: 단일 데이터 세트를 정리하여 중복 데이터를 제거합니다.
  • 다중 데이터 세트 중복 제거: 데이터 유출을 방지하기 위해 여러 데이터 세트 간에 중복이 없는지 확인합니다.
  • 다중 열 데이터 세트 중복 제거: QA 데이터 세트와 같은 복잡한 데이터 세트의 중복 제거를 지원합니다.
  • 중복 제거 결과 확인: 중복 제거 결과의 상세 확인 기능을 제공하여 데이터 정리 프로세스를 최적화하는 데 도움을 줍니다.

 

도움말 사용

설치 프로세스

  1. 터미널 또는 명령줄 도구를 엽니다.
  2. 다음 명령을 입력하여 SemHash를 설치합니다:
   pip install semhash

사용법

단일 데이터 세트 중복 제거

  1. 데이터 집합을 로드합니다:
   from datasets import load_dataset
from semhash import SemHash
texts = load_dataset("ag_news", split="train")["text"]
  1. SemHash 인스턴스를 초기화합니다:
   semhash = SemHash.from_records(records=texts)
  1. 데이터 세트의 가중치를 해제합니다:
   deduplicated_texts = semhash.self_deduplicate().deduplicated

다중 데이터 세트 중복 제거

  1. 두 개의 데이터 집합을 로드합니다:
   train_texts = load_dataset("ag_news", split="train")["text"]
test_texts = load_dataset("ag_news", split="test")["text"]
  1. SemHash 인스턴스를 초기화합니다:
   semhash = SemHash.from_records(records=train_texts)
  1. 테스트 데이터 세트의 가중치를 낮춥니다:
   deduplicated_test_texts = semhash.deduplicate(records=test_texts, threshold=0.9).deduplicated

다중 열 데이터 집합 중복 제거

  1. 다중 열 데이터 집합을 로드합니다:
   dataset = load_dataset("squad_v2", split="train")
records = [dict(row) for row in dataset]
  1. SemHash 인스턴스를 초기화합니다:
   semhash = SemHash.from_records(records=records, columns=["question", "context"])
  1. 데이터 세트의 가중치를 해제합니다:
   deduplicated_records = semhash.self_deduplicate().deduplicated

가중치 해제 결과 확인

  1. 중복 제거된 텍스트를 확인합니다:
   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의 출시를 발표하게 되어 매우 기쁩니다(다른 기능들도 곧 출시될 예정입니다).

개요

특히 대규모 언어 모델(LLM) 학습에서 최근 관심을 갖는 분야는 많은 양의 데이터를 보유하는 것도 좋지만, 적은 양의고품질데이터가 더 좋을 것입니다. 이에 대한 좋은 예는 다음에서 찾을 수 있습니다. 파인웹 블로그 게시물 에 있는 매우 큰 범용 크롤러 덤프 데이터 집합으로 시작하여 해당 데이터 집합에 대해 중복 제거 및 일련의 품질 검사를 포함한 많은 품질 검사를 수행했습니다.

Minish는 초고속 모델을 구축하여 새로운 가능성을 열어가는 데 관심이 있습니다. 아시다시피, 미니쉬는 세계 최고이자 가장 작은 초고속 모델을 만듭니다. 포션-베이스-8M. 우리의 관심 분야 중 하나는 近似去重: 의미적으로 매우 유사한 문서를 말뭉치에서 제거하고자 합니다. 민해시나 심해시와 같은 기존의 텍스트 중복 제거 알고리즘은 문자 또는 단어 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

피팅하는 동안 모든 문서는 먼저 인코더로 인코딩됩니다. 기본 인코더는 포션-베이스-8M하나 model2vec 모델. 그런 다음 이러한 문서는 다음에서 제공하는 파일에 저장됩니다. usearch 지원 주변 를 벡터 저장소에 저장합니다. 그런 다음 들어오는 문서 집합에 대해 먼저 지정된 인코더를 사용하여 인코딩한 다음 벡터 저장소에서 가장 가까운 이웃을 검색합니다. 임계값 이상의 유사도를 가진 가장 가까운 이웃을 가진 각 수신 문서가 제거됩니다.

이러한 모든 구성 요소가 매우 빠르기 때문에 매우 큰 데이터 세트의 중복 제거도 몇 분 밖에 걸리지 않습니다. 예를 들어, 전체 데이터 세트의 중복 제거는 Squad 2.0 데이터 세트 13만 개의 샘플이 있는 데이터 세트의 중복 제거는 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)

이렇게 하면 유사도를 계산하여 두 필드가 모두 유사한 레코드만 반환합니다.

© 저작권 정책

관련 문서

댓글 없음

댓글에 참여하려면 로그인해야 합니다!
지금 로그인
없음
댓글 없음...