はじめに
SemHashは、意味的類似性によってデータセットの重複を排除するための軽量で柔軟なツールです。Model2Vecの高速な埋め込み生成とVicinityの効率的なANN(近似最近傍)類似検索を組み合わせています。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
複数データセットの重複排除
- 2つのデータセットをロードする:
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.records)
if duplicate.exact: print("完全一致!")
print("完全一致!")
print("完全一致!")
print("重複:")
for corpus_duplicate in duplicate.duplicates: print(corpus_duplicate)
print(corpus_duplicate)
print("-" * 25)
以上の手順で、データセットのセマンティック重複排除をSemHashで素早く開始し、データクリーニングの効率を向上させることができます。
semhashの詳細な説明
我々は、セマンティック重複排除とデータセット多様化ツールであるsemhashのリリースを発表できることを大変嬉しく思っている(他の機能は近日公開予定)。
簡単
最近、特に大規模言語モデル(LLM)のトレーニングに関心が集まっている。高品質データの方がいいだろう。その良い例が finewebブログ記事 で発見された、非常に大規模な汎用クローラーダンプデータセットからスタートし、そのデータセットに対して、重複排除や一連の品質チェックなど、多くの品質チェックを行った。
Minishでは、非常に速いモデルを作ることで新しい可能性を引き出すことに興味を持っています。ご存知のように、私たちは世界最高で最小の高速モデルを作っています ポーションベース8M.私たちの関心領域のひとつは 除重量の目安
意味的に非常に類似した文書をコーパスから除去したい。minhashやsimhashのような従来のテキスト重複除去アルゴリズムは、文字や単語のn-タプル文法で動作するため、意味的な類似性を無視して、グリフ的に類似した文字のシーケンス間の類似性を見つけることしかできない。
重複排除は、大規模な言語モデルのトレーニングにのみ有効なもののように聞こえるが、小規模なデータセットの重複をチェックする際にも非常に有効である。トレーニングセットとテストセットの重複が近いだけでも、性能の過大評価につながる可能性があり、トレーニングセットに重複が近いものが存在すると、計算リソースの浪費、特徴の重要性の過大評価、その他の問題につながる可能性がある。
さらに、重複排除のテクニックを使えば、より大きなデータセットの概要を知ることができる。 セミハッシュ
重複チェックにかかる時間はわずか(数ミリ)秒であり、データセットのどの項目が似ているかを確認することができる。もしこれが理にかなっていれば、素晴らしいことだ!重複がなければ......それもまた素晴らしい!不正確なデータでトレーニングするよりは、すべてが良い。
ディエンファシスの使い方は?
ここでは、重複排除を行うことがどのような場合に意味を持つかについて、いくつかのクールなユースケースを紹介する:
分類
上述したように、トレーニングセットとテストセットの間に情報の重複がないことが重要である。オーバーラップがあるということは、通常、モデルがうまく機能するために汎化する必要がなくなるため、性能を過大評価していることを意味します。しかし、トレーニングセットから重複を取り除くことも非常に有効です。トレーニングセットに同じレコードの重複が多数あると、モデルがそのレコードの特徴の重要性を過大評価する可能性があり、いずれにしても計算リソースの浪費とモデルの適合度の過大評価につながります。
RAGシステム
ラグ ほとんどのRAGシステムがブロックを使用して構築されていることを考慮するまでは、システム内のアイテムの重複は稀に聞こえます:ドキュメントの完全な重複は稀かもしれませんが、ドキュメント間またはドキュメント内に重複したブロックがあることははるかに一般的です。ナレッジベースに重複したブロックがあると、保管コストが増加し、無関係なブロックを検索するリスクが高まり、必要以上に早期に多様化戦略を実施せざるを得なくなります。
コーパスの解釈
低い閾値で走ることで セミハッシュ
これにより、どの文書がどの文書と似ていて、どの文書が似ていないかをすぐに確認することができる。これにより、何に焦点を当てるべきか、データに何が欠けているのか、文書同士がどのように関連しているのかを知ることができる。
どのように機能するのか?
セミハッシュ
このモデルの核心は、文字列や辞書の集合を入力として受け取ることである。まず参照文書の集合でモデルを初期化し、次にこの集合を使って入力される集合の重複を取り除く。参照集合の文書と類似している受信文書はすべて削除され、参照集合に含まれる重複に近い文書とは別に格納される。
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
# 重複した項目
結果.重複
フィッティングの際、すべてのドキュメントはまずエンコーダーによってエンコードされます。デフォルトのエンコーダーは ポーションベース8Mひとつ モデル2ベクトル モデル。これらのドキュメントは ユーザサーチ 支持的 付近 をベクトルストアに格納する。次に、受信文書集合に対して、まず指定されたエンコーダを用いて符号化し、次にベクトルストアから最近傍文書を取り出す。類似度が閾値以上の最近傍文書を持つ各入力文書は削除される。
これらのコンポーネントはすべて非常に高速であるため、非常に大きなデータセットでも重複排除にかかる時間はわずか数分である。例えば、全データセットの重複排除は Squad-2.0 データセット 130,000サンプルのデータセットの重複排除にかかる時間はわずか7秒である。これにはベクトル化、インデックスのフィッティング、実際の重複排除が含まれる。小規模なデータセットであればこの数分の一の時間で済み、数百万の文書を含むデータセットでも数分しかかからない。包括的なベンチマークについては ベンチマーク.
解釈可能性
セミハッシュ
を使ってデータセットを調査することもできる。これは 自己複製
トレーニングセットそのものを重要視する必要はない:
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)
で何ができるのか、もっと深く見てみよう。 結果
どうするか。まず、重複除外されたレコードをすべて取得します:
結果.重複排除
これらのレコードは、あなたが入力したレコードとまったく同じものなので、他のMLパイプラインで使用することができます。 セミハッシュ
.セミハッシュ
データを変更するのではなく、データのサイズを小さくするだけだ。
重複レコードの割合を簡単に見ることができます:
結果.重複率
または完全な重複エントリー:
結果.exact_duplicate_ratio
また、どのアイテムが重複としてマークされているか、そしてラショナル.各複製文書は、重複項目としてマークされる原因となったインデックス内の例と共に格納される。完全な重複は完全な重複としてマークされます。次のコード例は基本的な使い方を示しています。
for duplicated_record in results.duplicates: print(duplicated_record.record)
print(duplicated_record.record)
if duplicated_record.exact: print("完全一致")
print("完全一致")
続ける
for index_duplicate in duplicated_record.duplicates: print(index_duplicate)
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のしきい値(これはデフォルトである)は、我々の実験ではうまく機能したが、特定のユースケースを確認するようにしてください。
複数カラムデータ
セミハッシュ
複数列のデータセットもサポートされており、複数の列にテキストを含むデータセットの重複を排除することができます。例えば、Q&Aデータセットでは、似たような質問や似たようなコンテキストを重複排除したいだけでなく、両方のフィールドが十分に似ている項目だけを重複としてカウントしたい。
これは解決するのが難しい問題だが セミハッシュ
この問題にも対処できる。
次のコード・スニペットは、その動作を示している:
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)
これは類似度を計算し、両方のフィールドが類似しているレコードのみを返します。