機械学習のためのトレーニングデータをウェブから収集する方法
モデルは簡単な部分です。オープンウェブからクリーンで重複のない、法的に健全で更新可能なトレーニングセットを調達することが、実際にプロジェクトが停滞するところです。ここでは、収集パイプラインを端から端まで紹介します。
モデルのトレーニングはしばしば簡単な部分です。機械学習プロジェクトが停滞するステップは上流にあります:オープンウェブからクリーンで重複のない、法的に健全で更新可能なトレーニングセットを組み立てることです。生のページを取得するのは安価です — クローラーがそれを行います — しかし、それらを使える行に変換するのが本当の作業であり、このガイドがカバーするのはそれです:ソーシング、構造化テキストへのクリーニング、重複排除、サンプリング、ライセンス、モデルが古くならないようにする更新パイプライン。
スクレイパーではなくシグナルから始める
収集コードを書く前に、モデルが学ぶ必要があるものと、そのシグナルを持つソースを正確に定義します。データは3つの形状で提供され、それぞれ異なる収集コストがあります:構造化(テーブル、製品フィード — 解析が容易)、半構造化(JSON、CSV、XMLエンドポイント — サイトが公開する最もクリーンなもの)、非構造化(記事テキスト、レビュー、フォーラムスレッド)。非構造化コンテンツは全データの80-90%を占め、そのうち約0.5%しか使用されないと言われています。これは、よく構築されたウェブデータセットが埋めるギャップです。何を求めているのかを決めてからスケールを開始します。
生のHTMLではなくクリーンなテキストにクロールする
生のHTMLをトレーニングパイプラインに投入することは、ナビゲーション、広告、クッキーバナー、スクリプトタグを投入することを意味します — データセットを劣化させるノイズです。耐久性のある方法は、クリーンで構造化されたテキストに直接クロールすることです。マークダウンを返すScraper APIは、定型的な削除を行ってくれるので、何千ものページのクロールがタグのスープではなく読みやすいコンテンツとして着地します。
import requests
def fetch_clean(url):
r = requests.get(
"https://api.quantumproxies.io/scrape",
params={"url": url, "format": "markdown"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=60,
)
return r.json()["content"] # boilerplate-stripped markdown
corpus = [fetch_clean(u) for u in seed_urls]
マークダウンは構造(見出し、リスト、テーブル)を保持しながらプレゼンテーション層を削除するため、RAGパイプラインやLLMトレーニングの入力として好まれます。大規模な収集実行が途中で全体の作業をブロックされないように、回転する住宅IPを通してクロールをルートします。

モデルを毒する前に重複排除する
ほぼ重複するドキュメントはウェブデータセットの静かな殺し屋です — 10のサイトにシンジケートされた同じ記事、定型的なフッター、再投稿されたコンテンツ。それらでトレーニングすると、繰り返されるものを過剰に重視します。各ドキュメントの正規化されたコンテンツをハッシュし、衝突を削除します。ほぼ重複するものについては、シングルまたはMinHashアプローチが正確なハッシュが見逃すものをキャッチします。
import hashlib
def content_hash(text):
norm = " ".join(text.lower().split()) # normalise whitespace/case
return hashlib.sha256(norm.encode()).hexdigest()
seen, unique = set(), []
for doc in corpus:
h = content_hash(doc)
if h not in seen:
seen.add(h)
unique.append(doc)
print(f"kept {len(unique)} of {len(corpus)} after dedup")
ここで計算するコンテンツハッシュは二重の役割を果たします — 次のクロールでの変更を検出する方法でもあるので、それを保持します。
意図的にサンプリングし、正直にライセンスする
データが多いことが自動的に良いデータを意味するわけではありません。代表的なサンプルは偏った山を上回ります — クロールの90%が1つのサイトまたは1つの言語である場合、モデルはその偏りを学習します。ソースとクラス全体で層別サンプリングを行い、実際にモデル化したい分布を反映するようにセットを作成します。ライセンスについて: ウェブデータは自動的にトレーニングに無料で使用できるわけではありません。ソースの条件でフィルタリングし、適用される場合はrobots指令を尊重し、各行にソースURLと取得日を保持して、各例がどこから来たのかを証明できるようにします。2026年のスクレイピングの合法性に関する私たちのメモは、個人データとライセンスの境界をカバーしています(情報提供であり、法的助言ではありません)。
グラウンドトゥルース: ウェブが提供しない部分
教師あり学習にはラベルが必要であり、オープンウェブはそれをほとんど提供しません。一部のデータセットは本質的にラベル付けされています(レビューに付随する評価、文中の次の単語など)、そのためそれらは大規模に収集するのが安価です。それ以外のすべてはグラウンドトゥルースステップが必要です: ドメインの専門家によるラベリング、またはマーケットプレイスを通じたクラウドソーシングです。クラウドソーシングする場合は、既知の回答タスクをシードし、それらを失敗した作業者を拒否することで品質を守ります — これはよく研究された失敗モードです。可能であれば、自然にラベル付けされたウェブデータを優先します。それは1週間で構築できるデータセットと、ラベリング予算が必要なデータセットの違いです。
更新する、なぜならデータは古くなる
収集は一度きりではありません。価格は変わり、ページは書き直され、新しいコンテンツが現れます — 凍結されたスナップショットでトレーニングされたモデルは、予測することを意図した世界から離れていきます。最初の日から更新を組み込みます: スケジュールに従って再クロールし、各ページのコンテンツハッシュを前回の実行と比較し、実際に変更されたものだけを再処理します。それにより、更新コストが実際の変更に比例し、すべてを再ダウンロードするのではなくなります。
def refresh(url, last_hash):
text = fetch_clean(url)
h = content_hash(text)
if h == last_hash:
return None # unchanged, skip re-processing
return {"url": url, "text": text, "hash": h, "fetched": now()}
急速に変化するドメインや、クロールを自分で実行するよりも管理されたフィードを消費したい場合、LLM用に構築されたウェブデータは、パイプラインを維持することなくクリーンで更新されたコンテンツを提供します。

よくある質問
機械学習のトレーニングデータはどこで入手しますか?
3つの主要なソース: 既存の公開データセット(Kaggle、Google Dataset Search、学術コーパス)、内部のファーストパーティデータ、クロールを通じてのオープンウェブ。ウェブは最大かつ最新のソースですが、最も多くの作業が必要です — クリーニング、重複排除、サンプリング、ライセンス。多くの現代のモデルにとって、関連するサイトのクロールからクリーンなマークダウンを得ることは、既存しないドメイン固有のデータセットへの最速の方法です。
どれくらいのトレーニングデータが必要ですか?
タスクとモデルによりますが、正直な答えは: 小さく始めて、パフォーマンスがプラトーに達するまでスケールします。代表的なサンプルでトレーニングし、保持されたテストセットで精度を測定し(70/30の分割が一般的な出発点です)、その後、データを追加してメトリックが改善し続けるかどうかを確認します。通常、品質と代表性が生のボリュームよりも重要です。
MLトレーニングのためにウェブデータをスクレイピングすることは合法ですか?
公開データを収集することは広く防御可能ですが、トレーニング用途はライセンスと、個人データが関与する場合はプライバシーの問題を引き起こします。ソースの条件でフィルタリングし、必要のない個人データを避け、各例の出所を保持し、適用される場合はrobots指令を尊重します。これは一般的な情報であり、法的助言ではありません — 商業的なデータセットを大規模に扱う場合は、法律の専門家に相談してください。
トレーニングデータセットを新鮮に保つにはどうすればよいですか?
再クロールをスケジュールし、コンテンツハッシュを使用して変更を検出し、実際に移動したページだけを再処理します。データセットをバージョン管理し、どのスナップショットがどのモデルをトレーニングしたかを再現できるようにし、各行に取得日を保持します。インクリメンタルで変更検出された更新は、実際の変更に比例したコストを維持し、各サイクルでコーパス全体を再ダウンロードするのではなくなります。
モデルは注目を集めますが、データセットが結果を決定します。正しいシグナルをソースし、クリーンなマークダウンにクロールし、厳密に重複排除し、正直にサンプリングし、出所を保持し、最初から更新を組み込みます。収集パイプラインを正しく行えば、その後のすべてが簡単になります。特にファインチューニングに向かう場合、ウェブからファインチューニングデータセットを構築するガイドがここから続きます。