5channel データサービス

形式と配信

標準の納品形式は JSONL または Apache Parquet です。板および期間でパーティション分割して提供します。レコードには安定した識別子を付与しており、スナップショットと差分納品を確実に結合・重複排除できます。

配信方法は、プロジェクトの要件に応じて、暗号化されたオブジェクトストレージからのダウンロード、定期スナップショット、差分フィード、または専用エンドポイントのいずれかを構成します。パーティション方式・更新頻度・フィルタ条件も案件ごとに設定します。

投稿レコードスキーマ

{
  "post_id": "5ch:news4vip:1712345678:0042",
  "thread_id": "5ch:news4vip:1712345678",
  "board_id": "news4vip",
  "board_name_ja": "ニュー速VIP",
  "board_category_ja": "雑談系",
  "post_index": 42,
  "posted_at": "2024-04-05T21:14:38+09:00",
  "posted_at_precision": "second",
  "name_field": "以下、5ちゃんねるからVIPがお送りします",
  "poster_id": "aB3xY9Zk0",
  "body_text": "そういうのはこっちのスレでやってくれ\n>>38 が言ってたやつな",
  "body_normalized": "そういうのはこっちのスレでやってくれ >>38 が言ってたやつな",
  "reply_to": [38],
  "quoted_spans": [
    { "target_post_index": 38, "raw": ">>38" }
  ],
  "char_count": 34,
  "contains_ascii_art": false,
  "redaction_profile": "standard",
  "redactions_applied": 0,
  "source_snapshot_id": "snap-2026-08-01",
  "record_version": 1
}
FieldType説明
post_idstring投稿の永続識別子
thread_idstring親スレッドの識別子
board_idstring板の識別子
board_name_jastring板の表示名
board_category_jastring板のカテゴリ
post_indexintスレッド内の連番(1始まり)
posted_atstring (RFC 3339)投稿日時(JST、タイムゾーン明示)
posted_at_precisionenum元データの時刻精度(時代により異なる)
name_fieldstring投稿時の名前欄
poster_idstring | null元データに存在する場合の投稿者ID
body_textstring投稿本文(原形、改行保持)
body_normalizedstringNFKC正規化・空白整形済みの本文
reply_toint[]解決済みのレス先(post_index)
quoted_spansobject[]引用アンカーの原文と解決結果
char_countint本文の文字数
contains_ascii_artboolアスキーアート判定フラグ(ヒューリスティック)
redaction_profileenum秘匿処理プロファイル
redactions_appliedint本レコードに適用された秘匿処理の件数
source_snapshot_idstring書き出し元スナップショットID
record_versionintレコードのスキーマバージョン

スレッドレコードスキーマ

{
  "thread_id": "5ch:news4vip:1712345678",
  "board_id": "news4vip",
  "title": "日本語の口語表現について語るスレ",
  "title_normalized": "日本語の口語表現について語るスレ",
  "created_at": "2024-04-05T20:47:58+09:00",
  "last_post_at": "2024-04-06T03:22:11+09:00",
  "post_count": 412,
  "unique_poster_id_count": 87,
  "status": "archived",
  "reply_edges": [[42, 38], [43, 42], [44, 38]],
  "source_snapshot_id": "snap-2026-08-01",
  "record_version": 1
}

reply_edges は [from_post_index, to_post_index] の明示的エッジリストです。スクレイプされたテキストではなく構造を納品していることの最も明確な証拠です。

FieldType説明
thread_idstringスレッドの識別子
board_idstring板の識別子
titlestringスレッドタイトル
title_normalizedstringNFKC正規化済みタイトル
created_atstring (RFC 3339)スレッド作成日時
last_post_atstring (RFC 3339)最終投稿日時
post_countintスレッド内の投稿数
unique_poster_id_countintユニーク投稿者ID数
statusenumスレッド状態
reply_edgesint[][]レス関係のエッジリスト
source_snapshot_idstring書き出し元スナップショットID
record_versionintスキーマバージョン

エンコーディングと正規化

  • 出力は UTF-8 です。旧来のソースエンコーディングは、文書化された対応表に基づき解析時に変換します。変換に失敗したケースは、黙って破棄せず記録します。
  • body_text は原形を保持します(全角文字・顔文字・意図的な表記揺れを含む)。
  • body_normalized は NFKC 正規化・空白整形を適用した並行フィールドです。両方を納品し、利用側が選択できます。
  • レスアンカー(>>N、>>N および過去の表記揺れ)は構造化フィールドに解析します。原文は body_text に保持されます。
  • タイムスタンプは JST オフセットを明示した RFC 3339 形式です。元データの精度が秒未満の粒度に満たない場合は、精度を偽らず posted_at_precision に記録します。
  • 識別子はスナップショット間で安定です。post_id は納品をまたいで変化しません。

スナップショットと差分納品

スナップショットとは、指定範囲(板・期間・フィルタ条件)の特定時点の書き出しです。source_snapshot_id により識別し、全ファイル・レコード件数・SHA-256 チェックサムを記載したマニフェストを添付します。

差分とは、2つのスナップショット間で追加・変更・撤回されたレコードの集合を、型付き変更レコードとして表現したものです。全件再取得なしに下流のデータストアを更新できます。

ソース側で発生した削除・訂正のイベントについては、契約に定めた範囲で差分フィードを通じて伝播させることが可能です。一度きりのクロールでは実現できない選択肢です。

# JSONL
import json
with open("5ch_posts_news4vip_2024-04.jsonl", encoding="utf-8") as f:
    posts = [json.loads(line) for line in f]

# Parquet
import pyarrow.parquet as pq
table = pq.read_table("5ch_posts/board_id=news4vip/year=2024/month=04/")
df = table.to_pandas()

# Reconstruct a thread with its reply graph
thread = [p for p in posts if p["thread_id"] == "5ch:news4vip:1712345678"]
thread.sort(key=lambda p: p["post_index"])
edges = [(p["post_index"], t) for p in thread for t in p["reply_to"]]

配信オプション

暗号化オブジェクトストレージ
マニフェストとチェックサムを伴う暗号化シャードへの署名付きURL — 提供可能
定期スナップショット
指定範囲の定期的な全件書き出し — 提供可能
差分フィード
スナップショット間の型付き変更レコード — ご相談
専用アクセスエンドポイント
契約範囲に限定したプログラマティックアクセス — 案件ごと
プライベートリポジトリ納品
顧客管理のプライベートリポジトリへの納品 — ご相談

データサンプルをご請求ください。

適格な組織の方には、代表的な技術サンプル、スキーマ仕様書、データセット概要をご提供します。

サンプルを請求する