SAVRN
Search Contact SAVRN

soc-ratchakitcha · Dataset Card

soc-ratchakitcha: Dataset Card

Written by Open Law Data Thailand, published under cc-by-4.0, revision 260b52d0a06a, read 2026-09-25. Shown as written; SAVRN's own facts about this dataset are on its page.

Royal Gazette Thailand (Ratchakitcha) Dataset

ชุดข้อมูลราชกิจจานุเบกษา (แบบ Machine Readable)

โครงการ Open Law Data Thailand ร่วมกับคณะกรรมาธิการการพาณิชย์และการอุตสาหกรรม วุฒิสภา ได้รับความอนุเคราะห์ข้อมูลจาก สำนักเลขาธิการคณะรัฐมนตรี (สลค.) เพื่อเผยแพร่ข้อมูลกฎหมายไทยสู่สาธารณะในรูปแบบที่ประมวลผลได้ด้วยคอมพิวเตอร์ (Machine Readable) เพื่อส่งเสริมนวัตกรรม Legal Tech และ AI ของประเทศไทย

Dataset Description

ชุดข้อมูลนี้รวบรวมรายการประกาศในราชกิจจานุเบกษา ประกอบด้วยชื่อเรื่อง เล่ม ตอน วันที่ประกาศ และลิงก์ไปยังต้นฉบับ PDF เหมาะสำหรับการทำ RAG (Retrieval-Augmented Generation), การสืบค้นกฎหมาย, และการวิเคราะห์ข้อมูลภาครัฐ

  • Source: สำนักเลขาธิการคณะรัฐมนตรี (The Secretariat of the Cabinet)
  • Official Collaboration Reference: หนังสือด่วนที่สุด ที่ นร ๐๕๐๓/๑๘๗๓๙ (29 ก.ค. 2568)
  • Homepage: Open Law Data Thailand

ย้ายโฟลเดอร์ (2026-09-13): ชั้นข้อความของ OpenLawData อยู่ที่ ocr/openlawdata-ocr/ (ตั้งชื่อคู่กับ taxonomy/openlawdata-taxonomy/) · path เดิม ocr/openlawdata/ ถูกลบออกแล้วเมื่อ 2026-09-14 — โค้ดที่ยังชี้ path เดิมต้องเปลี่ยนเป็น ocr/openlawdata-ocr/ (ไฟล์รายเดือนชื่อเดิมทุกไฟล์ และมี <year>/index.ndjson บอกตำแหน่งไบต์ของแต่ละฉบับเพิ่มมาให้)

Usage Instruction

ท่านสามารถเลือกดาวน์โหลดข้อมูลได้หลายรูปแบบผ่าน Library datasets ของ Hugging Face โดยระบุชื่อ name ในพารามิเตอร์ (Config)

1. สำหรับงาน AI / NLP (แนะนำ)

หากต้องการข้อความ (Text) เพื่อนำไปเทรนโมเดล หรือทำ Search Engine ท่านสามารถเลือกโหลดข้อมูลแยกเป็น "รายทศวรรษ" (Decade Subsets) ได้ ซึ่งจะได้ทั้งไฟล์ OCR และ Metadata ควบคู่กัน

ตัวอย่างการ Download สำหรับปี 2024

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "meta/2024/*" --local-dir "downloads"
hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "ocr/*/2024/*" --local-dir "downloads"

ตัวอย่างการ Download สำหรับ 2020s (2020-2029)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "meta/202?/*" --local-dir "downloads"
hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "ocr/*/202?/*" --local-dir "downloads"

1.1 โหลดด้วย datasets (สะดวกที่สุด)

ชุดข้อมูลแบ่งเป็น 3 config — เลือกได้ตามงาน ไม่ต้องดาวน์โหลดทั้ง repo

from datasets import load_dataset

R = "open-law-data-thailand/soc-ratchakitcha"

ds = load_dataset(R, "meta", split="train") # metadata อย่างเดียว (ค่าเริ่มต้น, เบาสุด)
ds = load_dataset(R, "openlawdata", split="train") # ข้อความเต็ม + metadata แยกวิเคราะห์ 2005-2026
ds = load_dataset(R, "iapp", split="train") # OCR รายหน้า 2011-2025

meta เป็น config เริ่มต้นเพราะเบาที่สุด ทำให้ตัวอย่างข้อมูลบนหน้าเว็บโหลดได้เร็ว — ถ้าต้องการตัวข้อความให้เลือก openlawdata

ชุดข้อมูลมีขนาดใหญ่ (~9.6 GB สำหรับ openlawdata) หากไม่ต้องการโหลดทั้งหมดลงเครื่อง ให้ใช้ streaming=True

ds = load_dataset("open-law-data-thailand/soc-ratchakitcha", "openlawdata",
                  split="train", streaming=True)
for row in ds.take(5):
    print(row["publish_date"], row["doc_type"], row["title"])

หรือถ้าต้องการเลือกเฉพาะบางปี ให้ดาวน์โหลดเป็นไฟล์ตามหัวข้อถัดไป

2. สำหรับการวิเคราะห์ข้อมูล

หากต้องการวิเคราะห์สถิติ เช่น จำนวนกฎหมายในแต่ละปี หรือค้นหาชื่อเรื่อง โดยไม่ต้องการเนื้อหา Text

โหลดเฉพาะ Metadata ทั้งหมด (--include "meta/*/*"; meta/year/year-month-files)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "meta/*/*" --local-dir "downloads"

โหลดเฉพาะ OCR ทั้งหมด (--include "ocr/*/*/*"; ocr/engine/year/year-month-files)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "ocr/*/*/*" --local-dir "downloads"

โหลดเฉพาะ engine เดียว (ดูหัวข้อ OCR Engines ประกอบ)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "ocr/openlawdata-ocr/*/*" --local-dir "downloads"
hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "ocr/iapp/*/*" --local-dir "downloads"

3. สำหรับการดึงไฟล์ต้นฉบับ (PDF)

ชุดข้อมูลนี้จัดเก็บไฟล์ PDF แบบ Hot/Cold Storage เพื่อประสิทธิภาพ:

pdf: ไฟล์ PDF รายฉบับ เฉพาะ 3 เดือนล่าสุด (Hot Data) (--include "pdf/*/*/*", pdf/year/year-month/files)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "pdf/*/*/*" --local-dir "downloads"

zip: ไฟล์ PDF ย้อนหลังตั้งแต่ปี 1884 ที่ถูกบีบอัดเป็น ZIP รายเดือน (Cold Data) (--include "zip/*/*", pdf/year/year-month-files)

hf download open-law-data-thailand/soc-ratchakitcha --repo-type dataset --include "zip/*/*" --local-dir "downloads"

OCR Engines (ocr/<engine>/<year>/<year-month>.jsonl)

ชุดข้อมูลนี้มีข้อความจากหลาย engine เก็บแยกโฟลเดอร์กัน ทุก engine ใช้รูปแบบเดียวกันคือ 1 บรรทัด = 1 เอกสาร และเชื่อมกับไฟล์อื่นด้วยฟิลด์ pdf_file — เลือกใช้ตามความเหมาะสม หรือนำมาเทียบกันได้

Engine ช่วงปีที่มี ลักษณะ
iapp 2011–2025 ข้อความจาก OCR ล้วน แยกรายหน้า (markdown_output) ไม่มี metadata
openlawdata 2005–2026 ข้อความทั้งฉบับ + metadata ที่แยกวิเคราะห์แล้ว (ประเภท ผู้ลงนาม เล่ม ตอน วันที่) พร้อมสัญญาณคุณภาพ

openlawdata สกัดข้อความจากชั้นข้อความ (text layer) ของ PDF โดยตรงเมื่อทำได้ ซึ่งได้ผลตรงตาม ต้นฉบับ (lossless) และใช้ OCR เฉพาะหน้าที่เป็นภาพสแกน จึงครอบคลุมช่วงปีที่ iapp ยังไม่มี

ความครอบคลุมของ openlawdata (รุ่นปัจจุบัน): ปี 2005–2026 — เอกสารทุกฉบับในช่วงนี้ ประมวลผลครบแล้ว 100% โดยกว่า 99% อ่านได้จากชั้นข้อความของ PDF โดยตรง

เอกสารก่อนปี 2005 ส่วนใหญ่เป็นภาพสแกนที่ต้องใช้ OCR ซึ่งกำลังทยอยดำเนินการ และจะเพิ่มเข้ามา ในรุ่นถัดไป (ช่วงปี 2011–2025 สามารถใช้ engine iapp ควบคู่กันได้)

หมายเหตุ: เอกสารที่ยังสกัดข้อความไม่ได้ (หน้าเป็นภาพสแกน รอ OCR) จะไม่ปรากฏในไฟล์ openlawdata แต่ metadata ยังอยู่ใน meta/ ครบ ดังนั้นจำนวนบรรทัดต่อเดือนอาจน้อยกว่า meta/

Data Fields

meta/<year>/<year-month>.jsonl

พาร์ทิชันคือปีของรหัส ไม่ใช่ปีที่ประกาศ — ไฟล์ meta/<year>/<year-month>.jsonl และ taxonomy/.../<year>/<year-month>.jsonl จัดตามรหัสเอกสาร (pdf_file) ซึ่งคงที่และถูกอ้างอิงไปแล้ว เอกสารที่พบว่าวันที่ต้นทางผิดและแก้จากหัวกระดาษ (ดู publishDate_source) จึงยังอยู่ในไฟล์เดิม ให้ใช้ publishDate เป็นวันประกาศเสมอ ไม่ใช่ชื่อไฟล์ · เอกสารเก่าที่ต้นทางเพิ่งนำขึ้นเว็บจะมี added_date บอกวันที่ต้นทางให้มา และ repaired_fields บอกว่า pipeline แก้ field ใดบ้าง

Field Name Description (TH) Description (EN)
no ลำดับที่เอกสาร Document ID / Number
doctitle ชื่อเรื่องหรือหัวข้อของเอกสาร Title or topic of the document
bookNo เล่มของราชกิจจานุเบกษา Book number
section ตอนของราชกิจจานุเบกษา Section number
category ประเภท (เช่น ก, ข, ง) Category (e.g., A, B, D)
publishDate วันที่ประกาศในราชกิจจานุเบกษา Publication date
pageNo หมายเลขหน้า Page number
pdf_file ชื่อไฟล์ PDF ต้นฉบับ Filename of the source PDF
source_url ลิงก์ PDF ต้นฉบับบน ratchakitcha.soc.go.th (null เมื่อยืนยันลิงก์ไม่ได้) Source PDF URL at ratchakitcha.soc.go.th (null when it could not be verified)
publishDate_source ที่มาของ publishDate: source (ต้นทาง) · header (แก้จากวันที่ในหัวกระดาษ เมื่อวันที่ต้นทางขัดกับเล่ม) · source-contradicts-volume (ขัดกับเล่มแต่ไม่มีหัวกระดาษให้แก้) Where publishDate came from
is_test true = เป็น record ทดสอบระบบของต้นทางเอง ("ทดสอบระบบ"/"ทดลองระบบ") ควรกรองออก Source's own test record
id รหัสเอกสารของต้นทาง (มีตั้งแต่ปลาย 2024; null ในรุ่นเก่า) Source document id (null for legacy records)

หมายเหตุ publishDate ที่ต้นทางให้มาเป็น 1970-01-01 (ค่าแทนวันที่ว่าง) ถูกแปลงเป็น null; section ว่างในปีก่อน 1950 เป็นปกติ (ราชกิจจาฯ ยุคแรกยังไม่มี "ตอน" ให้ค้นด้วย เล่ม+หน้า แทน)

ocr/openlawdata-ocr/<year>/<year-month>.jsonl

ดัชนีตำแหน่งไบต์ — ocr/openlawdata-ocr/<year>/index.ndjson หนึ่งบรรทัดต่อเอกสาร {"doc_id", "file", "offset", "length"} (ไบต์ในไฟล์รายเดือน) ใช้ดึงเอกสารเดียวด้วย HTTP Range request ครั้งเดียวโดยไม่ต้องโหลดทั้งเดือน (นามสกุล .ndjson เพื่อไม่ให้ถูกนับเป็นส่วนของ config openlawdata)

Field Name Description (TH) Description (EN)
pdf_file ชื่อไฟล์ PDF ต้นฉบับ (ใช้เชื่อมกับ meta/) Source PDF filename — the join key
doc_id รหัสเอกสาร Document id
text ข้อความเต็มทั้งฉบับ (รวมหัวกระดาษ เล่ม/ตอน/หน้า/วันที่) Full document text
n_pages / ocr_pages จำนวนหน้าทั้งหมด / จำนวนหน้าที่ต้องใช้ OCR Total pages / pages needing OCR
method วิธีที่ได้ข้อความมา: direct, font, redecode (สามอย่างนี้ lossless ไม่ผ่าน OCR), typhoon, tesseract How the text was obtained
is_valid / score ผลตรวจความสมบูรณ์ และคะแนน 0–1 Validation flag and score
doc_type ประเภทเอกสาร (ประกาศ, ระเบียบ, กฎกระทรวง ฯลฯ) Document type
issuer / issuing_authority ผู้ออก / หน่วยงาน Issuer / authority
title / subject ชื่อเรื่อง Title / subject
volume / volume_thai เล่ม (เลขอารบิก / เลขไทย) Volume
part / part_number / part_class / is_special ตอน, เลขตอน, ประเภทตอน (ก/ข/ง), เป็นฉบับพิเศษหรือไม่ Part, number, class, special flag
page เลขหน้าในราชกิจจานุเบกษา Page number in the gazette
publish_date / publish_date_thai วันที่ประกาศ (ISO / ไทย) Publication date
announcement_date / announcement_date_thai วันที่ลงนาม (ISO / ไทย) Signing date
signatories รายชื่อผู้ลงนาม [{name, position}] Signatories
reference_numbers เลขอ้างอิงที่พบในเอกสาร Reference numbers found in the text
doctitle ชื่อเรื่องทางการจากต้นทาง (join จาก meta/) — มีครบเกือบทุกฉบับ ต่างจาก title ที่แกะจากหน้ากระดาษและว่างราว 4% Official title from the source catalogue
meta_book_no เล่มที่ต้นทางระบุไว้สำหรับเอกสารนี้ — ถ้าต่างจาก volume เกิน 2 แปลว่าไฟล์ PDF ไม่ตรงกับรหัสเอกสาร (ดู ข้อจำกัด) Source-declared volume; a gap > 2 from volume means a mismatched PDF

นำเข้า BigQuery

ไฟล์ openlawdata เป็น newline-delimited JSON (NDJSON) แบบไม่บีบอัด จึงโหลดเข้า BigQuery ได้โดยตรงและโหลดแบบขนานได้เต็มที่ (ต่างจากไฟล์ .gz ที่ต้องแตกไฟล์แบบ single-thread)

# โหลดทั้งปี 2026 เข้าตารางเดียว (สร้าง schema อัตโนมัติ)
bq load --source_format=NEWLINE_DELIMITED_JSON --autodetect \
  my_dataset.ratchakitcha  'downloads/ocr/openlawdata-ocr/2026/*.jsonl'

โครงสร้างที่ได้: signatories เป็น RECORD REPEATED (name, position), reference_numbers เป็น STRING REPEATED, ฟิลด์วันที่เป็นสตริงรูปแบบ YYYY-MM-DD ทุกฟิลด์มีชนิดข้อมูลคงที่ทั้งชุด จึงไม่ทำให้ autodetect ล้มเหลว

ตัวอย่างคิวรี — เลือกเฉพาะเอกสารที่อ่านจากชั้นข้อความโดยตรง (แม่นที่สุด ไม่ผ่าน OCR)

SELECT publish_date, doc_type, issuer, title, text
FROM   my_dataset.ratchakitcha
WHERE  is_valid AND method IN ('direct','font','redecode')

วิธีเลือกข้อมูลให้ตรงกับงาน

method บอกว่าข้อความมาจากไหน — เป็นตัวกรองคุณภาพที่สำคัญที่สุด

method ที่มา ความแม่น
direct อ่านจากชั้นข้อความของ PDF ตรงๆ ตรงต้นฉบับ (lossless)
font ชั้นข้อความเพี้ยน แต่ถอดกลับได้จาก glyph ของฟอนต์ ตรงต้นฉบับ (lossless)
redecode ชั้นข้อความถูก encode ผิด ถอดกลับได้ ตรงต้นฉบับ (lossless)
typhoon OCR จากภาพ (Typhoon VLM) ~97% อาจมีอักขระเพี้ยน
tesseract OCR จากภาพ (Tesseract) ~94%
-- ชุดที่แม่นที่สุด: ไม่ผ่าน OCR เลย + ผ่าน validation
WHERE is_valid AND method IN ('direct','font','redecode')

ในช่วง 2005–2026 เอกสาร 99.1% อยู่ในกลุ่ม lossless และ 99.8% ผ่าน validation

ข้อจำกัดที่ควรทราบ

  • ใช้ meta/ เป็นหลักสำหรับ เล่ม/ตอน/หน้า/วันที่ — ข้อมูลใน meta/ มาจากระบบต้นทางของ ราชการโดยตรง ส่วนค่าเดียวกันใน openlawdata แยกวิเคราะห์มาจากตัวข้อความ จึงอาจคลาดเคลื่อนได้ ในเอกสารที่จัดหน้าผิดปกติ
  • หัวกระดาษบางฉบับวรรณยุกต์ตก (เช่น หนา แทน หน้า, เลม แทน เล่ม) พบราว 18% ของเอกสาร ที่สกัดแบบ direct ตั้งแต่ปี 2010 — เกิดจากตำแหน่งวรรณยุกต์ในชั้นข้อความของ PDF ไม่ใช่ OCR ผิด กระทบเฉพาะบรรทัดหัวกระดาษ ไม่กระทบเนื้อความ
  • เลขไทย/อารบิกปะปนกัน — ชั้นข้อความอาจให้ 45/2562 ขณะที่หน้าเอกสารจริงพิมพ์ ๔๕/๒๕๖๒
  • สระ/วรรณยุกต์สลับตำแหน่งในเอกสารคุณภาพต่ำ พบราว 0.3% ของเอกสาร (เช่น เกณฑก์ าร ที่ควรเป็น เกณฑ์การ) เกิดจากลำดับอักขระในชั้นข้อความของ PDF ต้นฉบับเอง เราเลือกไม่แก้อัตโนมัติ เพราะการเดารวมอักขระอาจทำให้ข้อความผิดเพี้ยนกว่าเดิม — เอกสารกลุ่มนี้ยังอ่านได้ แต่ถ้าต้องการ ความแม่นสูงสุดควรตรวจกับ PDF ต้นฉบับ
  • เอกสารตารางมีสัดส่วนอักษรไทยต่ำโดยธรรมชาติ (ตารางโควตา ผังเมือง ตารางทับศัพท์ภาษาต่างประเทศ) ไม่ใช่ข้อมูลเสีย
  • text รวมหัวกระดาษไว้ด้วย (บรรทัด หน้า .. เล่ม .. ราชกิจจานุเบกษา .. วันที่) หากต้องการเฉพาะเนื้อความ ให้ตัดบรรทัดแรกๆ ออกเอง
  • เอกสารที่ยังไม่มีข้อความจะไม่ปรากฏในไฟล์ จำนวนบรรทัดต่อเดือนจึงอาจน้อยกว่าใน meta/
  • มีเอกสาร 1 ฉบับ (ปี 1930) ที่ไฟล์ PDF ต้นทางเสียหายตั้งแต่ต้นทาง จึงไม่มีข้อความ

  • รหัสเอกสารกับไฟล์ PDF ถูกจัดให้ตรงกันแล้วทุกปี (แก้ 12–13 ก.ย. 2569) — รหัสเอกสารรุ่นเก่า (2014-006904) คือลำดับที่ในผลค้นหาของระบบต้นทาง ไม่ใช่เลขประจำเอกสาร การดึงย้อนหลังเมื่อ ก.ค.–ส.ค. 2568 ดึง PDF กับ meta/ จากลิสต์สองรอบที่ลำดับต่างกัน ทำให้รหัสเดียวถือ meta/ ของเอกสารหนึ่งแต่ PDF ของอีกเอกสาร · ปี 2002–2022 อ่าน เล่ม/ตอน/หน้า จากหัวกระดาษของทุกไฟล์แล้วย้ายไฟล์ไปยังรหัสที่ meta/ ระบุ (376,867 ฉบับใน 2005–2022; 2004 เลื่อน +1/+3 เกือบทั้งปี, 2003 เลื่อน +28) แล้ว build ข้อความและ zip ใหม่ · ปี 1884–2001 (ภาพสแกน ไม่มีข้อความให้อ่านหัวกระดาษ) เทียบขนาดไฟล์กับไฟล์ที่ต้นทางเสิร์ฟให้เอกสารนั้นวันนี้ แล้วดาวน์โหลดฉบับที่ถูกมาแทน (27 ปี แทนที่ 194,262 ฉบับ ในจำนวนนี้เป็นช่องที่ไม่มีไฟล์มาก่อน 2,260 ฉบับ) · meta/ ไม่เปลี่ยน (เป็นนิยามของรหัส) · ตรวจซ้ำหลังแก้: สุ่ม 200 รหัส/ปี ทุกปี 2005–2026 พิกัดในข้อความตรง meta/ 4,310/4,322 ที่เทียบได้ ผิดฉบับ 0 · ไฟล์ที่ย้ายออก/แทนที่ทุกฉบับมี journal ย้อนกลับได้ใน raw/_refile/<ปี>/ (ไม่เผยแพร่)

  • ชั้น ocr/iapp คัดแล้ว (14 ก.ย. 2569) — ข้อความ iapp ถูก OCR จากไฟล์ก่อนจัดรหัสใหม่ และมี record ว่างเปล่าหรือเป็น ข้อความ error ของบริการ OCR ปนอยู่ จึงคัดให้เหลือเฉพาะ record ที่ (1) มีข้อความจริง และ (2) ชื่อเรื่องหรือหัวกระดาษในข้อความ ยืนยันรหัสเอกสารได้ — เหลือ 165,983 จาก 416,922 record (ปี 2021 ไม่เหลือเลย จึงไม่มีโฟลเดอร์) ที่เหลือนี้ join กับ meta//ocr/openlawdata-ocr ด้วย pdf_file ได้ตามปกติ · record ที่ย้ายรหัสมีฟิลด์ data.rekeyed_from บอกรหัสเดิม
  • ปี ≤2001 มีเฉพาะ PDF (zip/) และ meta/ — เป็นภาพสแกน ข้อความกำลังทยอย OCR ด้วย Typhoon และจะเผยแพร่ใน ocr/openlawdata เมื่อครอบคลุมพอ · รหัสที่ meta/ ของต้นทางไม่ระบุ เล่ม/ตอน/หน้า (ราว 2,400 ฉบับ) ถูกเติมพิกัดจากต้นทางแล้วส่วนใหญ่ ที่เหลือยังไม่มีในชั้นข้อความ

  • เอกสารที่ไม่มีในชั้นข้อความ ให้ดูที่ taxonomy.has_text — ไม่ต้องเทียบ index.ndjson กับ meta/ เอง ชั้น taxonomy มีทุกฉบับที่ meta/ มี และฟิลด์ has_text บอกตรงๆ ว่าฉบับนั้นมีข้อความใน ocr/openlawdata-ocr หรือไม่ · เอกสารที่ has_text: false ไม่ได้หายไป — ป้ายหมวดหมู่ของมัน วิเคราะห์จากชื่อเรื่องใน meta/ อย่างเดียว ซึ่งเป็นหลักฐานที่น้อยกว่า

  • เหตุผลที่ไม่มีข้อความ มี 3 แบบ ไม่ใช่แบบเดียว (สำรวจครบทุกฉบับ 15 ก.ย. 2569): · 10,912 ฉบับ — กันไว้โดยเจตนา ไม่ใช่ build ตกหล่น ไฟล์ PDF อยู่ครบและสกัดข้อความได้ แต่พิสูจน์ไม่ได้ว่าไฟล์นั้นเป็นเอกสารของรหัสนี้จริง จึงไม่เผยแพร่ข้อความของมัน การเผยแพร่ข้อความที่อาจเป็นของเอกสารอื่นภายใต้รหัสหนึ่ง แย่กว่าการไม่มีข้อความ (ทดลอง build โดยไม่กันออกเมื่อ 15 ก.ย. 2569 → ด่านตรวจพบทันทีว่าปี 2003 มี 290 ฉบับที่หัวกระดาษ เป็นของรหัสอื่น เลื่อนกันเป็น block ละ 28 ตำแหน่ง จึงย้อนกลับทั้งหมด) · 7,263 ฉบับ — เป็นภาพสแกนจริง ไม่มีชั้นข้อความใน PDF (ส่วนใหญ่ปี 2002–2004) กำลังทยอย OCR ด้วย Typhoon และจะเข้าชั้นข้อความเมื่อทำถึง · 2,977 ฉบับ — ไม่มีไฟล์ PDF บนดิสก์ เป็นคนละปัญหา อยู่ระหว่างดึงไฟล์กลับมา
  • index.ndjson รับประกันตัวเองแล้ว — ตั้งแต่ 15 ก.ย. 2569 ตัว build จะตรวจและ exit non-zero ถ้าอย่างใดอย่างหนึ่งไม่จริง: รายการแรกของทุกเดือนเริ่มที่ไบต์ 0 · offset + length ของทุก record เท่ากับ offset ของรายการถัดไปพอดี · รายการสุดท้ายจบตรงขนาดไฟล์ · จำนวน entry เท่ากับจำนวน record แปลว่า "ไม่มีใน index" = "ไม่มีในไฟล์" เชื่อถือได้โดยไม่ต้องพิสูจน์เอง
  • source_url ของปี 2002 จะไม่ครบ และไม่ใช่ข้อบกพร่องฝั่งเรา — 5,844 ฉบับไม่มีลิงก์เพราะ ระบบค้นหาของต้นทางเองไม่มีเอกสารเหล่านั้นอยู่ในดัชนี (เช่น เล่ม 119 ตอน 79 ง คืนเฉพาะหน้า 1, 7, 9, 11, 14, 26, 28, 47 ขณะที่เอกสารจริงมีถึงหน้า 130 กว่า) · พิกัดของเราถูก ไม่ใช่ของเขา: หน้าที่พิมพ์บนเอกสารตรงกับ meta/ 298 จาก 300 ฉบับที่สุ่มตรวจ PDF ปี 2002 ที่เรามีถูกต้อง ขาดเพียงลิงก์กลับไปต้นทาง
  • id ของเอกสารก่อนปี 2024 เป็นค่าที่สร้างขึ้นใหม่ ไม่ใช่สตริงที่ต้นทางเคยออกให้ — ประกอบจาก publishDate + เลขเอกสารใน source_url เติมศูนย์ให้ครบ 8 หลัก ซึ่งเป็นสูตรเดียวกับที่ต้นทางใช้ ในปี 2024–2026 (ตรงกัน 82,481 จาก 82,481 ฉบับ ไม่มีข้อยกเว้น) · ทุกฉบับที่สร้างค่าใหม่มี id อยู่ใน repaired_fields · ฉบับที่ไม่มี source_url ยังคงเป็น null

การจัดทำข้อมูล

สกัดข้อความแบบ 3 ชั้น โดยพยายามอ่านจากชั้นข้อความของ PDF ก่อนเสมอ และใช้ OCR เฉพาะหน้าที่เป็น ภาพสแกนจริงๆ ทุกฉบับผ่านการตรวจสอบอัตโนมัติ (ความครบของฟิลด์ วันที่ถอดได้ สัดส่วนอักษรไทย การปนเปื้อนของอักขระเสีย) แล้วบันทึกผลไว้ในฟิลด์ is_valid และ score

ก่อนเผยแพร่ทุกครั้ง ไฟล์ทั้งชุดจะถูกตรวจซ้ำว่า: ทุกบรรทัดเป็น JSON ที่ถูกต้อง, ไม่มี path ภายในหลุดออกมา, ไม่มีร่องรอยการสกัดผิดพลาดหลงเหลือ, pdf_file ไม่ซ้ำ และทุกฟิลด์มีชนิดข้อมูล คงที่ทั้งชุด (เพื่อให้ bq load --autodetect ทำงานได้)

ชั้นหมวดหมู่ / taxonomy (taxonomy/openlawdata-taxonomy/<year>/<year-month>.jsonl)

ป้ายกำกับเชิงโครงสร้างของทุกเอกสารในชั้น openlawdata (faceted taxonomy: ต้นไม้หัวข้อ + 2 vocabulary แบน — ไม่เรียก ontology เพราะยังไม่มี entity/relation) — 1 บรรทัด = 1 เอกสาร เชื่อมกับ ocr/openlawdata และ meta/ ด้วย pdf_file เหมือนชั้นอื่น ตั้งใจแยกโฟลเดอร์ เพราะ rule จะปรับเรื่อยๆ โดยไม่ต้องเผยแพร่ข้อความใหม่ทุกครั้ง (ดู sieve_version) · taxonomy/ เป็นโฟลเดอร์รวมสำหรับชุดหมวดหมู่จากหลายผู้จัดทำ ชุดนี้คือ openlawdata-taxonomy

สามแกนที่เป็นอิสระต่อกัน — เอกสารหนึ่งฉบับเป็นได้ทั้ง "แต่งตั้ง" และ "การต่างประเทศ" พร้อมกัน:

แกน field ค่า ความหมาย
เรื่องอะไร topic 76 หมวด มีลำดับชั้น (taxonomy.json) เช่น pollution_air ⊂ pollution ⊂ environment
ทำอะไร action 10 แบบ rulemaking appointment registration court_order decoration …
ใครออก govlevel 8 ระดับ central local provincial judiciary parliament …

ฟิลด์อื่น: agency / agency_type / province — ชื่อผู้ออกที่ normalize แล้ว (ตัวสะกดแปรผันของหน่วยงาน เดียวกันยุบเป็นชื่อเดียว ชื่อที่ถูกตัดกลางบรรทัดในหัวเอกสารถูกเติมเป็นชื่อเต็ม แยกจังหวัดออกจากชื่อหน่วยงานตามรายชื่อ 77 จังหวัด) เหมาะใช้เป็น facet/index; issuing_authority ดิบตามหน้ากระดาษยังอยู่ในชั้น ocr · labels = ป้ายทุกอัน (ทั้งสามแกน รวมหมวดแม่ที่ roll up มา) แต่ละอันมี weight, matched_by (หลักฐาน: auth title head dtype partclass) และ corroborated · extracted = ข้อมูลสกัดเฉพาะหมวด (คดีล้มละลาย: stage case_number case_book court debtor_type = juristic/natural และ debtor_name เฉพาะนิติบุคคล — ชั้นนี้ไม่เก็บชื่อบุคคลธรรมดา)

ป้ายที่เชื่อได้ — topic_corroborated / action_corroborated / govlevel_corroborated บอกว่าป้ายหลัก ยืนอยู่บนหลักฐานเชิงโครงสร้าง (ผู้ออก ประเภทเอกสาร ตอนของราชกิจจา) หรือสองฟิลด์อิสระ อ่านตรวจด้วยคน 450 ฉบับ: สุ่มทั่วคลัง ป้ายที่ยืนยันถูก 100% [98.6–100] และมีป้ายยืนยัน 95.5% ของเอกสาร · หมวดที่ประชาชน ค้นบ่อย 15 หมวด 97.9% · ป้ายที่ corroborated: false แม่นราว 61% — เก็บไว้เพื่อ recall ให้กรองเอง

-- BigQuery: กฎ/ระเบียบเรื่องขยะที่ท้องถิ่นออกใน 5 ปี พร้อมข้อความ
SELECT o.pdf_file, o.agency, o.province, t.title, t.publish_date
FROM taxonomy o JOIN ocr t USING (pdf_file)
WHERE o.topic_corroborated AND o.topic = 'pollution_waste'
  AND o.govlevel = 'local' AND t.publish_date >= '2021-01-01'

taxonomy.json = รายการ slug → ชื่อไทย/หมวดแม่/แกน ใช้ roll up ได้เอง · เป็น rule-based ล้วน (ไม่มี ML) ไม่มีข้อมูลส่วนบุคคลในชั้นนี้ · ยังไม่มีปี 2000–2001 (ชั้น ocr ของปีนั้นรอ OCR ภาพสแกน)

Legal & License

ข้อมูลนี้ได้รับการสนับสนุนจาก สำนักเลขาธิการคณะรัฐมนตรี ตามหนังสือตอบข้อหารือ "ด่วนที่สุด ที่ นร ๐๕๐๓/๑๘๗๓๙" ลงวันที่ 29 กรกฎาคม 2568 เพื่อประโยชน์สาธารณะและการพัฒนาเทคโนโลยีปัญญาประดิษฐ์ (AI)

Disclaimer: ข้อมูลนี้จัดทำขึ้นเพื่อความสะดวกในการเข้าถึงและวิเคราะห์ข้อมูลเท่านั้น การอ้างอิงทางกฎหมายอย่างเป็นทางการควรตรวจสอบกับต้นฉบับ PDF จากเว็บไซต์ ratchakitcha.soc.go.th โดยตรง

Contact

  • Project: Open Law Data Thailand
  • Website: https://www.openlawdatathailand.org/