# 機械学習のためのトレーニングデータをウェブから収集する方法

モデルは簡単な部分です。オープンウェブからクリーンで重複のない、法的に健全で更新可能なトレーニングセットを調達することが、実際にプロジェクトが停滞するところです。ここでは、収集パイプラインを端から端まで紹介します。

モデルのトレーニングはしばしば簡単な部分です。機械学習プロジェクトが停滞するステップは上流にあります：オープンウェブからクリーンで重複のない、法的に健全で更新可能なトレーニングセットを組み立てることです。生のページを取得するのは安価です — クローラーがそれを行います — しかし、それらを使える行に変換するのが本当の作業であり、このガイドがカバーするのはそれです：ソーシング、構造化テキストへのクリーニング、重複排除、サンプリング、ライセンス、モデルが古くならないようにする更新パイプライン。

## スクレイパーではなくシグナルから始める

収集コードを書く前に、モデルが学ぶ必要があるものと、そのシグナルを持つソースを正確に定義します。データは3つの形状で提供され、それぞれ異なる収集コストがあります：構造化（テーブル、製品フィード — 解析が容易）、半構造化（JSON、CSV、XMLエンドポイント — サイトが公開する最もクリーンなもの）、非構造化（記事テキスト、レビュー、フォーラムスレッド）。非構造化コンテンツは全データの80-90%を占め、そのうち約0.5%しか使用されないと言われています。これは、よく構築されたウェブデータセットが埋めるギャップです。何を求めているのかを決めてからスケールを開始します。

## 生のHTMLではなくクリーンなテキストにクロールする

生のHTMLをトレーニングパイプラインに投入することは、ナビゲーション、広告、クッキーバナー、スクリプトタグを投入することを意味します — データセットを劣化させるノイズです。耐久性のある方法は、クリーンで構造化されたテキストに直接クロールすることです。マークダウンを返す[Scraper API](https://quantumproxies.io/scraper-api)は、定型的な削除を行ってくれるので、何千ものページのクロールがタグのスープではなく読みやすいコンテンツとして着地します。

```python
import requests

def fetch_clean(url):
    r = requests.post(
        "https://api.quantumproxies.io/v1/scraper/extract",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        json={"url": url, "format": "markdown"},
        timeout=120,
    )
    return r.json()["payload"]["content"]  # boilerplate-stripped markdown

corpus = [fetch_clean(u) for u in seed_urls]
```

マークダウンは構造（見出し、リスト、テーブル）を保持しながらプレゼンテーション層を削除するため、[RAGパイプライン](https://quantumproxies.io/blog/fresh-web-data-rag-pipelines)やLLMトレーニングの入力として好まれます。大規模な収集実行が途中で全体の作業をブロックされないように、回転する住宅IPを通してクロールをルートします。

![機械学習パイプラインの収集部分、つまりオープンウェブからトレーニングセットまで：シグナルを定義し、クリーンなMarkdownにクロールし、コンテンツハッシュで重複を除去し、出所を記録しながらサンプリングとライセンス確認を行い、スケジュールに沿って更新する。カードには、モデリングを始める前の各ステップのルールを示している。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335190/blog/generated/qp-b9-057-diag1.png)
*MLパイプラインの収集部分: モデリングはその後に来て、これを正しく行うことに完全に依存します。*

## モデルを毒する前に重複排除する

ほぼ重複するドキュメントはウェブデータセットの静かな殺し屋です — 10のサイトにシンジケートされた同じ記事、定型的なフッター、再投稿されたコンテンツ。それらでトレーニングすると、繰り返されるものを過剰に重視します。各ドキュメントの正規化されたコンテンツをハッシュし、衝突を削除します。ほぼ重複するものについては、シングルまたはMinHashアプローチが正確なハッシュが見逃すものをキャッチします。

```python
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年のスクレイピングの合法性](https://quantumproxies.io/blog/is-web-scraping-legal-2026)に関する私たちのメモは、個人データとライセンスの境界をカバーしています（情報提供であり、法的助言ではありません）。

## グラウンドトゥルース: ウェブが提供しない部分

教師あり学習にはラベルが必要であり、オープンウェブはそれをほとんど提供しません。一部のデータセットは本質的にラベル付けされています（レビューに付随する評価、文中の次の単語など）、そのためそれらは大規模に収集するのが安価です。それ以外のすべてはグラウンドトゥルースステップが必要です: ドメインの専門家によるラベリング、またはマーケットプレイスを通じたクラウドソーシングです。クラウドソーシングする場合は、既知の回答タスクをシードし、それらを失敗した作業者を拒否することで品質を守ります — これはよく研究された失敗モードです。可能であれば、自然にラベル付けされたウェブデータを優先します。それは1週間で構築できるデータセットと、ラベリング予算が必要なデータセットの違いです。

## 更新する、なぜならデータは古くなる

収集は一度きりではありません。価格は変わり、ページは書き直され、新しいコンテンツが現れます — 凍結されたスナップショットでトレーニングされたモデルは、予測することを意図した世界から離れていきます。最初の日から更新を組み込みます: スケジュールに従って再クロールし、各ページのコンテンツハッシュを前回の実行と比較し、実際に変更されたものだけを再処理します。それにより、更新コストが実際の変更に比例し、すべてを再ダウンロードするのではなくなります。

```python
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用に構築されたウェブデータ](https://quantumproxies.io/web-data-for-llms)は、パイプラインを維持することなくクリーンで更新されたコンテンツを提供します。

![ウェブのトレーニングデータの背景にある数値：非構造化コンテンツは全データの80〜90%を占め、実際に使われるのはそのうち約0.5%にすぎないとされ、トレーニングとホールドアウトテストを70/30で分割するのが一般的な出発点だ。カードの結論：コーパスはほぼ無限で、価値はそのクリーニング、重複除去、更新にある。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335190/blog/generated/qp-b9-057-diag2.png)
*コーパスはほぼ無限です。良いパイプラインが追加する価値は、クリーニング、重複排除、更新にあります。*

[大規模にクリーンなマークダウンにウェブをクロールする](https://quantumproxies.io/scraper-api)

## よくある質問

### 機械学習のトレーニングデータはどこで入手しますか？

3つの主要なソース: 既存の公開データセット（Kaggle、Google Dataset Search、学術コーパス）、内部のファーストパーティデータ、クロールを通じてのオープンウェブ。ウェブは最大かつ最新のソースですが、最も多くの作業が必要です — クリーニング、重複排除、サンプリング、ライセンス。多くの現代のモデルにとって、関連するサイトのクロールからクリーンなマークダウンを得ることは、既存しないドメイン固有のデータセットへの最速の方法です。

### どれくらいのトレーニングデータが必要ですか？

タスクとモデルによりますが、正直な答えは: 小さく始めて、パフォーマンスがプラトーに達するまでスケールします。代表的なサンプルでトレーニングし、保持されたテストセットで精度を測定し（70/30の分割が一般的な出発点です）、その後、データを追加してメトリックが改善し続けるかどうかを確認します。通常、品質と代表性が生のボリュームよりも重要です。

### MLトレーニングのためにウェブデータをスクレイピングすることは合法ですか？

公開データを収集することは広く防御可能ですが、トレーニング用途はライセンスと、個人データが関与する場合はプライバシーの問題を引き起こします。ソースの条件でフィルタリングし、必要のない個人データを避け、各例の出所を保持し、適用される場合はrobots指令を尊重します。これは一般的な情報であり、法的助言ではありません — 商業的なデータセットを大規模に扱う場合は、法律の専門家に相談してください。

### トレーニングデータセットを新鮮に保つにはどうすればよいですか？

再クロールをスケジュールし、コンテンツハッシュを使用して変更を検出し、実際に移動したページだけを再処理します。データセットをバージョン管理し、どのスナップショットがどのモデルをトレーニングしたかを再現できるようにし、各行に取得日を保持します。インクリメンタルで変更検出された更新は、実際の変更に比例したコストを維持し、各サイクルでコーパス全体を再ダウンロードするのではなくなります。

モデルは注目を集めますが、データセットが結果を決定します。正しいシグナルをソースし、クリーンなマークダウンにクロールし、厳密に重複排除し、正直にサンプリングし、出所を保持し、最初から更新を組み込みます。収集パイプラインを正しく行えば、その後のすべてが簡単になります。特にファインチューニングに向かう場合、[ウェブからファインチューニングデータセットを構築する](https://quantumproxies.io/blog/build-fine-tuning-dataset-from-web)ガイドがここから続きます。

[モデルのための更新されたウェブデータを取得する](https://quantumproxies.io/web-data-for-llms)
