数ヶ月前、itch.ioはゲームのコレクションを作成し、プロフィールでそれらを共有する機能を獲得しました。今日、コレクションはわずかなアップグレードを取得しています。現在、すべてのコレクションには専用のブラウジングPAがあります…
Views: 0
数ヶ月前、itch.ioはゲームのコレクションを作成し、プロフィールでそれらを共有する機能を獲得しました。今日、コレクションはわずかなアップグレードを取得しています。現在、すべてのコレクションには専用のブラウジングPAがあります…
Views: 0
RAGの精度向上には、元データの品質改善が欠かせません。本記事では、画像PDFのようにそのままでは検索できないドキュメントに対して、検索可能なPDFへ変換する検証を行った内容を紹介します。
画像PDFは、単純にアップロードするだけではKendraやBedrock Knowledge Baseなどの検索エンジンに同期できません。
そのため、これまではAmazon Bedrockなどの基盤モデルを利用してOCRをかけ、テキストファイルに変換したうえで登録する、というプロセスを踏んでいました。
ただこの方法だと、以下のような課題があると感じるようになりました。
そこで今回は、次の2点を意識して検証を進めることにしました。
①「画像PDF」→「検索可能なPDF」に蘇らせる(テキスト情報を埋め込む)
② より高精度なOCRエンジンを使用する
前提条件
RAGの仕組みの構築は、Amazon BedrockのKnowledge Base(以下KBと記載)を使用し、
ベクトルDBには、Pineconeを採用しました。
※ 検証を通して気づいたのですが、PineconeのServerless indexを用いれば、かなり費用を抑えられると思いました。(私はAWS Marketplace 経由で利用していたので Standardプラン)
検証を行う中で、まあまあ使っていましたが、0.003ドルくらいにしか費用がかさまなかったです。従量課金なのがメリットですね。
今回は、OCRを実現するアプローチとして2つの策を考え、検証してみました。
検証に共通して、適当な画像をスキャンし、PDFにしたものをS3に配置し、データソースとして指定します。(test-input.pdf
と名付けます)
当然、このPDFは、検索ができる状況ではありません。
試しに、Amazon BedrockのKnowledge Baseを作成し、S3に配置したtest-input.pdf
と同期してみると、以下のように同期に失敗する旨のエラーが表示されています。
今回の検証で使用した全体のpythonスクリプトを以下に添付します。
GitHubにも公開したので、自己責任の上ご利用ください。
各手順の部分で、かいつまんで説明します。
なお、処理の全体像の図を記事最下部(処理イメージ)の項に記載しましたので、気になる方は参考になれば幸いです。
import os
import sys
from pathlib import Path
from typing import List
import fitz
from google.cloud import documentai_v1 as documentai
from google.cloud.documentai_toolbox import document
from ocrmypdf import exceptions, hocrtransform, ocr
# サービスアカウントキーのパスを環境変数に設定
# NOTE 事前にスクリプトを実行するファイルと同じ階層に配置
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "XXXXXXX.json"
# プロジェクトID・ロケーション・プロセッサIDを設定
project_id = "your-project-id"
location = "us" #またはeu(プロセッサを作成したリージョン)
processor_id = "your-processor-id" #(作成したプロセッサID)
def process_pdf_by_ocrmypdf(input_pdf: str, output_pdf: str) -> None:
"""
OCRmyPDFを使ってPDFに透明テキストレイヤーを付与する
Args:
input_pdf (str): 入力PDFファイルパス
output_pdf (str): 出力PDFファイルパス
"""
try:
ocr(
input_file=input_pdf,
output_file=output_pdf,
language="jpn",
deskew=True,
clean=True,
progress_bar=True,
)
print(f"[INFO] OCRが正常に完了: {output_pdf}")
except exceptions.ExitStatusException as e:
print(f"[ERROR] OCRmyPDFエラー: {e}")
def split_pdf_page_by_page(input_path: str) -> List[str]:
"""
PDFファイルを1ページずつ分割し、個別ファイルとして保存する
Args:
input_path (str): 入力PDFファイルパス
Returns:
List[str]: 分割後の各ページPDFファイルパスリスト
"""
pdf = fitz.open(input_path)
chunk_files = []
base_name = os.path.splitext(input_path)[0]
for i in range(len(pdf)):
chunk_path = f"{base_name}_page{i + 1}.pdf"
chunk_pdf = fitz.open()
chunk_pdf.insert_pdf(pdf, from_page=i, to_page=i)
chunk_pdf.save(chunk_path)
chunk_pdf.close()
chunk_files.append(chunk_path)
pdf.close()
return chunk_files
def convert_hocr_to_pdf(
hocr_path: str, background_pdf_path: str, output_pdf_path: str, dpi: int = 300
) -> None:
"""
hOCRファイルから透明テキストレイヤーを作成し、背景PDFと合成する
Args:
hocr_path (str): hOCRファイルパス
background_pdf_path (str): 背景PDFファイルパス
output_pdf_path (str): 出力PDFファイルパス
dpi (int, optional): 解像度(デフォルト300)
"""
ocr_only_pdf_path = str(Path(output_pdf_path).with_suffix(".ocr_only.pdf"))
transformer = hocrtransform.HocrTransform(hocr_filename=Path(hocr_path), dpi=dpi)
transformer.to_pdf(out_filename=Path(ocr_only_pdf_path))
print(f"[INFO] 透明テキストPDF生成完了: {ocr_only_pdf_path}")
merge_background_and_ocr(background_pdf_path, ocr_only_pdf_path, output_pdf_path)
print(f"[INFO] 背景と透明テキストを合成完了: {output_pdf_path}")
Path(ocr_only_pdf_path).unlink(missing_ok=True)
def merge_background_and_ocr(
background_pdf_path: str, ocr_text_pdf_path: str, output_pdf_path: str
) -> None:
"""
背景PDFと透明テキストレイヤーPDFを合成する
Args:
background_pdf_path (str): 背景PDFパス
ocr_text_pdf_path (str): 透明テキストPDFパス
output_pdf_path (str): 出力PDFパス
"""
bg_doc = fitz.open(background_pdf_path)
ocr_doc = fitz.open(ocr_text_pdf_path)
for page_num in range(len(bg_doc)):
bg_page = bg_doc[page_num]
bg_page.show_pdf_page(bg_page.rect, ocr_doc, page_num)
bg_doc.save(output_pdf_path, garbage=4, deflate=True)
bg_doc.close()
ocr_doc.close()
def process_document_with_docai(file_path: str) -> documentai.Document:
"""
Document AIでPDFをOCR処理する
Args:
file_path (str): 入力PDFパス
Returns:
documentai.Document: OCR処理結果
"""
client = documentai.DocumentProcessorServiceClient()
name = f"projects/{project_id}/locations/{location}/processors/{processor_id}"
with open(file_path, "rb") as f:
content = f.read()
request = documentai.ProcessRequest(
name=name,
raw_document=documentai.RawDocument(
content=content, mime_type="application/pdf"
),
)
result = client.process_document(request=request)
return result.document
def save_docai_response_to_json(
document_obj: documentai.Document, output_path: str
) -> None:
"""
Document AIレスポンスをJSONファイルとして保存する
Args:
document_obj (Document): Documentオブジェクト
output_path (str): 出力JSONファイルパス
"""
json_obj = documentai.Document.to_json(document_obj)
with open(output_path, "w", encoding="utf-8") as f:
f.write(json_obj)
def convert_docai_response_to_hocr(
docai_document: documentai.Document, title: str, document_path: str
) -> str:
"""
Document AI JSONからhOCR形式に変換する
Args:
docai_document (Document): OCRドキュメント
title (str): hOCRファイルタイトル
document_path (str): Document AI JSONパス
Returns:
str: hOCRテキスト
"""
wrapped_doc = document.Document.from_document_path(document_path=document_path)
return wrapped_doc.export_hocr_str(title=title)
def merge_pdfs_with_pymupdf(pdf_files: List[str], output_path: str) -> None:
"""
複数PDFファイルを結合する
Args:
pdf_files (List[str]): PDFファイルリスト
output_path (str): 出力ファイルパス
"""
merger = fitz.open()
for pdf_file in pdf_files:
merger.insert_pdf(fitz.open(pdf_file))
merger.save(output_path)
merger.close()
def make_searchable_pdf(input_path: str, output_path: str, use_docai: bool = True) -> None:
"""
PDFをOCR処理して検索可能なPDFに変換する
Args:
input_path (str): 入力PDFパス
output_path (str): 出力PDFパス
use_docai (bool, optional): Document AIを使用するか(デフォルトTrue)
"""
print(f"[INFO] 分割処理中: {input_path}")
chunk_files = split_pdf_page_by_page(input_path)
processed_chunks = []
temp_files = []
for i, chunk_file in enumerate(chunk_files):
print(f"[INFO] ページ {i + 1}/{len(chunk_files)} 処理中...")
base = os.path.splitext(chunk_file)[0]
hocr_path = f"{base}.hocr.xml"
json_path = f"{base}.json"
output_chunk = f"{base}_processed.pdf"
try:
if use_docai:
docai_document = process_document_with_docai(chunk_file)
save_docai_response_to_json(docai_document, json_path)
hocr_content = convert_docai_response_to_hocr(
docai_document, f"Chunk {i + 1}", json_path
)
with open(hocr_path, "w", encoding="utf-8") as f:
f.write(hocr_content)
convert_hocr_to_pdf(hocr_path, chunk_file, output_chunk)
else:
process_pdf_by_ocrmypdf(chunk_file, output_chunk)
processed_chunks.append(output_chunk)
temp_files += [chunk_file]
if use_docai:
temp_files += [hocr_path, json_path]
except Exception as e:
print(f"[ERROR] ページ {i + 1} 処理失敗: {e}")
print("[INFO] 各ページを結合中...")
merge_pdfs_with_pymupdf(processed_chunks, output_path)
for path in temp_files + processed_chunks:
try:
os.remove(path)
except Exception as e:
print(f"[WARN] 一時ファイル削除失敗: {path} -> {e}")
print(f"[DONE] 完了: {output_path}")
# 実行部分
if __name__ == "__main__":
if len(sys.argv) 3:
print("使用方法: python script.py 入力PDF 出力PDF [use_docai]")
sys.exit(1)
input_pdf = sys.argv[1]
output_pdf = sys.argv[2]
use_docai = sys.argv[3].lower() == "true" if len(sys.argv) > 3 else True
if use_docai:
if not os.environ.get("GOOGLE_APPLICATION_CREDENTIALS"):
print("[WARN] 認証情報が設定されていません。")
make_searchable_pdf(input_pdf, output_pdf, use_docai)
OCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched or copy-pasted.(GitHubリポジトリ説明から引用)
OCRmyPDFは、
スキャンされたPDFファイルにテキストを埋め込むことができる役割を担っています。
オープンソースのOCRエンジンである、「Tesseract OCR」が内部的に使われています。
Tesseract OCRは、日本語を含めた多言語にも対応しています。
uvを使って検証を行いました。
検証時点でのバージョンはuv 0.6.12
です。
$ uv version
uv 0.6.12 (e4e03833f 2025-04-02)
uv init
で任意のプロジェクトを作成したのちに、下記を実行します。これでプログラムからocrmypdfライブラリを呼び出す準備が整いました。
OCR処理はocrmypdf.ocrが担っているので、これを使います。input_file
にはOCRをかけたいファイルのパスを、output_file
にはOCR結果の出力先のパスを指定します。
--language
オプションをつけることで、もとドキュメントの言語を指定することができます。(多くの場合はjpn
)を指定することになるかと思います。
from ocrmypdf import ocr
def process_pdf_by_ocrmypdf(input_pdf: str, output_pdf: str) -> None:
"""
OCRmyPDFを使ってPDFに透明テキストレイヤーを付与する
Args:
input_pdf (str): 入力PDFファイルのパス
output_pdf (str): 出力PDFファイルのパス
Returns:
None
"""
try:
ocr(
input_file=input_pdf,
output_file=output_pdf,
language="jpn",
deskew=True, # 傾きを補正するオプション
clean=True, # ノイズ除去をするオプション
progress_bar=True, # 処理状況をターミナルで確認可能にする
)
print(f"[INFO] OCRが正常に完了: {output_pdf}")
except ocrmypdf.exceptions.ExitStatusException as e:
print(f"[ERROR] OCR実行中にエラー: {e}")
progress_bar=True
をつけると、OCR処理の進捗状況をターミナル上で確認することができます。
出力結果は以下のようになります。
$ uv run convert_to_searchable_pdf_v2.py test-input.pdf test-output.pdf false
[INFO] 分割処理中: test-input.pdf
[INFO] チャンク 1/3 処理中...
Scanning contents ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
[tesseract] lots of diacritics - possibly poor OCR
OCR ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
PDF/A conversion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
Linearizing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 100/100 0:00:00
Recompressing JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
Deflating JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
JBIG2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
[INFO] OCRが正常に完了: test-input_page1_processed.pdf
[INFO] チャンク 2/3 処理中...
Scanning contents ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
OCR ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
PDF/A conversion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
Linearizing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 100/100 0:00:00
Recompressing JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
Deflating JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
JBIG2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
[INFO] OCRが正常に完了: test-input_page2_processed.pdf
[INFO] チャンク 3/3 処理中...
Scanning contents ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
OCR ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
PDF/A conversion ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
Linearizing ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 100/100 0:00:00
Recompressing JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
Deflating JPEGs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 1/1 0:00:00
JBIG2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0% 0/0 -:--:--
[INFO] OCRが正常に完了: test-input_page3_processed.pdf
[INFO] チャンク結合中...
[DONE] 完了: test-output.pdf
Google CloudのOCRサービスです。
料金体系は以下のようになっています。
Enterprise Document OCR プロセッサを使う場合では、1000ページごとに1.5$ということで、少量のデータであれば比較的安価にOCRをすることができます。
料金体系は以下のページに記載がありますので、詳細はこちらをご覧ください。
上記のようにGoogle Cloud コンソール上から簡単にテストすることができますが、
今回はGoogle Cloud SDK経由から呼び出すことを考えます。
利用に際しては
サービスアカウントの認証情報作成、プロセッサの作成など事前準備が必要となります。
こちらのチュートリアル(1-5)が参考になります。
Document AIには、Toolboxと呼ばれる、OCR結果を2次利用しやすい形式に変換するためのクライアントライブラリが用意されています。
def convert_docai_response_to_hocr(
docai_document: documentai.Document, title: str, document_path: str
) -> str:
"""
JSON(Document AIのレスポンスが入っている)をhOCR形式に変換する
Args:
docai_document (Document): OCRドキュメント
title (str): hOCRファイルタイトル
document_path (str): Document AI JSONパス
Returns:
str: hOCRテキスト
"""
wrapped_doc = document.Document.from_document_path(document_path=document_path)
return wrapped_doc.export_hocr_str(title=title)
その中に、Document AIによるOCR結果のレスポンス(JSON形式)をhocr形式に変換するツールがあったため、今回はこれを使用します。
変換された結果が以下です。(掲載しているのは一部です)bbox
という記述が多くありますが、これはOCRによって検出された物体(画像やテキストなど)の領域のことを指すようです。
つまり「どこに、何が書いてあるかを詳細にまとめたXML形式のファイル」と言えそうです。
xmlns="http://www.w3.org/1999/xhtml" xml:lang="unknown" lang="unknown">
Chunk 2
http-equiv="Content-Type" content="text/html;charset=utf-8" />
name="ocr-system" content="Document AI OCR" />
name="ocr-langs" content="unknown" />
name="ocr-scripts" content="unknown" />
name="ocr-number-of-pages" content="1" />
name="ocr-capabilities" content="ocrp_lang ocr_page ocr_carea ocr_par ocr_line ocrx_word" />
class='ocr_page' lang='unknown' title='bbox 0 0 1626 2459'> class='ocr_carea' id='block_1_0' title='bbox 400 54 797 61'> class='ocr_par' id='par_1_0_0' title='bbox 400 54 797 61'> class='ocr_line' id='line_1_0_0_0' title='bbox 400 54 797 61'>かわさきの上下水道 No.59 令和7年3月
class='ocrx_word' id='word_1_0_0_0_0' title='bbox 400 54 475 71'>かわさき class='ocrx_word' id='word_1_0_0_0_1' title='bbox 479 52 498 69'>の class='ocrx_word' id='word_1_0_0_0_2' title='bbox 498 51 580 68'>上下水道 class='ocrx_word' id='word_1_0_0_0_3' title='bbox 600 48 654 65'>No.59 class='ocrx_word' id='word_1_0_0_0_4' title='bbox 676 46 715 64'>令和 class='ocrx_word' id='word_1_0_0_0_5' title='bbox 720 45 732 63'>7 class='ocrx_word' id='word_1_0_0_0_6' title='bbox 738 44 757 61'>年 class='ocrx_word' id='word_1_0_0_0_7' title='bbox 763 44 774 62'>3 class='ocrx_word' id='word_1_0_0_0_8' title='bbox 781 43 798 61'>月
....中略
OCRmyPDFのライブラリで、hocr形式からPDFに変換を行うことのできるhocrtransform
メソッドがあるため、これを利用します。
def convert_hocr_to_pdf(hocr_path, background_pdf_path, output_pdf_path, dpi=300):
"""hOCRファイルから透明テキストレイヤーを作成するサンプルコード"""
ocr_only_pdf_path = str(Path(output_pdf_path).with_suffix(".ocr_only.pdf"))
transformer = hocrtransform.HocrTransform(hocr_filename=Path(hocr_path), dpi=dpi)
transformer.to_pdf(out_filename=Path(ocr_only_pdf_path))
print(f"[INFO] 透明テキストPDF生成完了: {ocr_only_pdf_path}")
変換結果は以下のようになりした。
コード内にも記載していますが、あくまでもここでは検出されたテキストがPDF内に埋め込まれるだけです。なので文字列検索には引っかかりますが、こちら側からは確認ができません。
この問題を手順3で解決します。
手順2で生じた問題を解決するため、元の画像PDFに、テキストを重ね合わせる処理を追加します。
def convert_hocr_to_pdf(hocr_path, background_pdf_path, output_pdf_path, dpi=300):
+ """hOCRファイルから透明テキストレイヤーを作成し、背景PDFと合成する"""
ocr_only_pdf_path = str(Path(output_pdf_path).with_suffix(".ocr_only.pdf"))
transformer = hocrtransform.HocrTransform(hocr_filename=Path(hocr_path), dpi=dpi)
transformer.to_pdf(out_filename=Path(ocr_only_pdf_path))
print(f"[INFO] 透明テキストPDF生成完了: {ocr_only_pdf_path}")
+ merge_background_and_ocr(background_pdf_path, ocr_only_pdf_path, output_pdf_path)
+ print(f"[INFO] 背景と透明テキストを合成完了: {output_pdf_path}")
新たに、merge_background_and_ocr
を作成します。
def merge_background_and_ocr(background_pdf_path, ocr_text_pdf_path, output_pdf_path):
"""背景PDFと透明テキストレイヤーPDFを合成"""
bg_doc = fitz.open(background_pdf_path)
ocr_doc = fitz.open(ocr_text_pdf_path)
for page_num in range(len(bg_doc)):
bg_page = bg_doc[page_num]
bg_page.show_pdf_page(bg_page.rect, ocr_doc, page_num)
bg_doc.save(output_pdf_path, garbage=4, deflate=True)
bg_doc.close()
ocr_doc.close()
今回はpymupdf
ライブラリのshow_pdf_page
メソッドを使用しました。
このメソッドはあるPDFの特定のページの内容を、別のPDFに描画できるメソッドで、
処理内では、画像PDFの上に、透明テキストが含まれるOCR済みのPDFを重ね合わせています。
# 補足
# bg.rect→配置場所(「どこに重ね合わせるか」)
# ocr_doc→OCR済みの、テキスト情報だけが存在するPDF(「何を重ね合わせるか」)
# page_num→重ね合わせる対象のページ数
bg_page.show_pdf_page(bg_page.rect, ocr_doc, page_num)
# saveメソッドについては以下を参照
# https://pymupdf.readthedocs.io/ja/latest/document.html#Document.save
## garbage=4にすることで不要なコンテンツを削除してくれる。
## deflate=Trueにすることでファイルを圧縮してくれる。
KBを使って、RAGをしてみます。
元々のPDFの2ページ目にあった、「工事をしないとどうなるの?」の項に関する質問をしてみます。
710kmと返してくれるのが期待値ですが、元ドキュメントの通り、710kmと返却してくれました。OCRの読み取り精度は悪くなさそうです。
また、x-amz-bedrock-kb-document-page-number
で、抽出元のページも相違なく取れてきています。
こちらについても、同様問題なく結果が取れてきそうでした。①とはそこまで差異がないですが、ソースチャンクを見る限り、こちらの方が文字をより正確に読み取ってくれているような気がしました。
ここまで読んでいただき、ありがとうございました。
今回は、画像PDFに対してOCRの処理を行い、検索可能なPDFに変換して、RAGのデータソースとして機能するかの検証を行いました。
比較的読み取りのしやすいドキュメントでテストを行ったのもありますが、問題なくデータの前処理を行うことができました。
冒頭の問題意識の項で記載した、ページ数の抽出の課題は、
ページごとにOCRをかける→PDFに書き戻す、というアプローチでクリアできそうな気がしました。
また、Document AIを使えば、どこをどう読み取っているのかの情報が、レスポンスからある程度把握できるので、こちらも便利な気がしました。
今後は、
表組みが多いPDF(帳票、レポート)
手書き文字が混在するPDF
フォントが特殊な文書
など、より難易度の高いケースでも本手法が使えるか検証していきたいと思います。
処理の全体像をmermaid記法で書いてみました。
Views: 0
教室の壁に掛かるお馴染みの周期表。
しかしその並び方を大胆に組み替えることで、時間計測の未来が拓けるかもしれません。
ドイツのマックスプランク核物理研究所(MPIK)で行われた研究によって、原子核中の陽子数ではなく残りの電子の数で元素を配置し直した全く新しい「周期表」が提案されました。
チームによれば、この方法で整理したところ、高電荷イオン(たくさんの電子を奪われて強い正電荷をもつ原子)の中に眠っていた700種類以上も「次世代の光格子時計の候補」が浮上したといいます。
従来の周期表からも多くの知見が得られたように、新たな周期表を作ると同時に大量の知識が一網打尽的に現れた訳です。
「新・周期表」は、これまでの周期表では見落とされていた原子の秘密を暴き出し、人類科学を新たな段階に高めてくれるのでしょうか?
研究内容の詳細は2025年4月16日に『arXiv』にて発表されました。
目次
高電荷イオンとは、原子から多くの電子を剥ぎ取って非常に高い正電荷を帯びたイオンのことです。
例えばウランのように電子を何十個も持つ重い原子でも、極端に電離して残った電子がわずか数個になれば、それは高電荷イオンです。
高電荷イオンでは最も外側の電子殻がごっそり失われているため、通常の原子とは性質が大きく変わります。
しかし私たちが慣れ親しんだメンデレーエフの周期表は、元素を原子番号(陽子の数)で分類しています。
そのためこのままでは、電子をほとんど失った高電荷イオンの電子的性質(電子配置やエネルギー準位の構造)をうまく記述できないのです。
実際、原子番号順の従来の表では、高電荷イオンにおけるエネルギーの性質が埋もれてしまい、発見が得られにくくなっていました。
そのため近年になって科学者たちは、「元素の並べ方を変えれば見える世界も変わるのではないか?」と考えるようになりました。
既存の周期表から原子の性質の多くが読み取られるように、新たな周期表が作られれば人類がこれまで知らなかった知識が得られる可能性があります。
そこで生まれたのが、「残り電子数」に着目した新しい周期表です。
発表者の一人であるChunhai Lyu氏らは、電子が軌道に順々に収まっていく過程を基準に元素を並べ直しました。
言い換えれば、陽子の数ではなく電子の数で分類したのです。
これはちょうど、レゴブロックを一つずつ積み上げていくように原子を構築するイメージです。
1個の電子から始まり、2個、3個…と電子を追加してゆくと、電子配置ごとに特徴的な構造が現れます。
このように電子数に従って配置することで、異なる元素であっても等しい電子数を持つイオン同士(イソ電子系列と呼ばれます)が同じ列や行に並びます。
例えば「2個の電子を持つヘリウム」と「2個の電子を持つ炭素」は、ともに2という電子数で括られるといった具合です。
するとこの新しい「電子数を基準にした周期表」を使うと、いままで複雑で分かりにくかった高電荷イオン(電子を大量に失ったイオン)の性質が、意外にわかりやすいパターンとして見えてきました。
たとえるならば、難解な暗号が解けたように、高電荷イオンの「どんなエネルギー状態があるか」がスッキリ整理されるのです。
研究チームは、「この並べ方なら、高電荷イオンのエネルギーのしくみがぐっと単純化され、実験室のプラズマ研究や天体の観測データを読み解くのに役立つ」と話しています。
しかしより大きな発見は別にありました。
新しい周期表がもたらした最大の驚きは、超安定な遷移の大量発見でした。
つまり「原子の中のエネルギーが変わるときに出る振動」が、ものすごく安定した形でたくさん見つかったわけです。
これは原子時計にとって重要な発見です。
そもそも時計とは、何かが一定のリズムで振動するのを“刻み”として利用する仕組みです。昔ながらの振り子時計やゼンマイ式時計では「振り子」や「歯車」がそのリズムを担当し、クォーツ時計では「水晶振動子」が代わりをしています。
ところが「原子時計」では、原子がエネルギー状態を変える瞬間に出す“振動(光)”を使います。
原子があるエネルギー状態から別の状態へ移るとき、その変化は量子力学的にきわめて正確なリズムで起こるからです。ただし、どの原子遷移でもいいわけではなく、特に使いやすいのが「禁制遷移(きんせいせんい)」と呼ばれる、めったに起こりにくい現象です。
イメージで言えば極めてまれにしか動かないぶん、逆にすごく安定した周期を持ってる振り子と言えるでしょう。
このような振り子は短い時間の測定に使うのは不向きですが、長期に渡りブレが少なく非常に正確に時を刻むことができます。
たとえば、現在「世界で最も正確」とされる光格子時計は、ストロンチウムやイッテルビウム原子の禁制遷移を使うことで、数十億年に1秒しか狂わない精度を実現しています。
新・周期表はこの禁制遷移に「大量の新候補」の発見に貢献したのです。
電子数で整理した表を眺めると、ある特定の電子配置に属する高電荷イオンたちが一斉に、時計に使えそうな遷移を示すことが分かりました。
しかもその数が700種類にも及ぶことが判明します。
ある意味で原子時計用の振り子の大量発見とも言えるでしょう。
研究陣は「従来表では見落としていた超安定遷移が、まるで暗号が解けたように浮かび上がった」と表現しています。
まさに原子の秘めたメッセージが解読された瞬間と言えるでしょう。
この発見は、高精度時計の研究者にとって宝の山です。
さらに高電荷イオンは外界からの影響を受けにくい利点もあり、より正確で安定した時計の実現に期待が寄せられています。
今回提示された700超の候補からは、現在のストロンチウム光格子時計を凌ぐ究極の原子時計が誕生するかもしれません。
今回提案された「新・周期表」がもたらす恩恵は、超精密な時間計測分野にとどまりません。
実は、整理された高電荷イオンのエネルギー状態一覧は、プラズマ物理や天体物理といった広い分野にも大きなインパクトを与えそうなのです。
私たちの身近な技術でいえば、核融合炉のような超高温のプラズマ環境があります。そこで扱われるプラズマ(イオンや電子が入り交じった状態)の中には、たくさんの高電荷イオンが存在するものの、そこから出る光やエネルギーの分析は複雑でした。
なぜなら、高電荷イオンは電子を多く失った結果、普通の原子とまったく違う“スペクトル”(出す光の波長)を示すため、どの線がどの元素に対応しているのか判別しにくかったのです。
しかし今回の新しい周期表を指針にすれば、「どの電子数系列に属しているか」を手掛かりに、複雑に見える光の輝線を素早く仕分けできるようになるかもしれません。
例えるならば、大きな倉庫に散らばっていた商品(スペクトル線)を、きちんとジャンルごとに並べ替えてラベリングし、どこに何があるか一目で見つかるようになったイメージです。
この恩恵はプラズマ研究だけにとどまりません。宇宙空間の星雲や銀河も、実は高温プラズマが豊富に存在する場所です。
望遠鏡で観測したときに、謎めいた光の線(スペクトル線)が見つかることがありますが、それがいったいどの元素由来なのか、あるいはどんなイオン状態なのか分からない場合が少なくありませんでした。
今回の研究による新・周期表を照合すれば、「これって実は電子数が○○のイオンなんじゃないか?」と推測しやすくなる可能性があります。
結果として、遠くの星や銀河の性質や進化の謎に迫る手がかりを得られるわけです。研究チームも、「実験室や天体プラズマで不可欠な高電荷イオンの構造を、一気にシンプルに見渡せるようになった」と述べています。
さらに注目すべきは、この新・周期表が私たちの暮らしにも大きな影響を与えうる点です。
冒頭でお話ししたように、高電荷イオンのある種のエネルギー遷移は、きわめて正確な「時計」になり得ます。
これによって、現在の最先端とされる光格子時計の精度をさらに高める道が開かれるかもしれません。
もし将来、その精度が桁違いに向上すれば、私たちが当たり前に使う「秒」という時間の単位自体が、まったく新しい定義に置き換わるかもしれないのです。
「原子核の陽子数」から「電子の数」へという大胆な発想の転換によって、プラズマ研究や天体観測、さらには究極の時間計測までもが大きく進化するかもしれません。
新しい周期表という視点が、これからの科学の歩みをさらに加速させていくでしょう。
元論文
Periodic table for highly charged ions
https://doi.org/10.48550/arXiv.2504.11237
ライター
川勝康弘: ナゾロジー副編集長。
大学で研究生活を送ること10年と少し。
小説家としての活動履歴あり。
専門は生物学ですが、量子力学・社会学・医学・薬学なども担当します。
日々の記事作成は可能な限り、一次資料たる論文を元にするよう心がけています。
夢は最新科学をまとめて小学生用に本にすること。
編集者
ナゾロジー 編集部
Views: 0
本日(2025年4月29日)22:00より,声優の岡本信彦さんと,フリーライターのマフィア梶田さんがパーソナリティを務めるWeb番組「RADIO 4Gamer Tap(仮)」第271回のライブ配信を行います。番組は,文化放送のオリジナル配信プラットフォーム「QloveR」と,YouTubeチャンネル「4GamerSP」の同時配信でお届けします。
今回は,アークシステムワークスの「テクノス ザ・ワールド くにおくん&アーケードコレクション」(PC / Nintendo Switch / PS5)を取り上げます。ゲストは開発ディレクターの佐藤賢治氏です。ぜひご視聴ください。
![]() |
![]() |
![]() |
![]() |
![]() |
なお,番組公式Twitterもひっそり稼働中です。「@radigame」というIDと「#radigame」というハッシュタグで,番組情報などをお知らせしています。こちらも,よろしくお願いします。
Views: 0
Core i5-8250U(4コア/8スレッド)を搭載したNEC製15.6型ノートPC「VersaPro VKT16/X-3」の中古品が、パソコン工房の通販サイトで販売中。販売されているのは3か月保証が付いた中古品で、価格は29,980円となっています。
主な仕様は、ディスプレイ解像度が1,366×768ドット、メモリが8GB、ストレージが512GB SSD、OSがWindows 11 Pro(MAR)。このほか、無線LAN機能やDVD-ROMドライブを搭載しています。興味がある方はチェックしてみてください。
Views: 0
Amazonは電子書籍リーダーの「Kindle Paperwhite (16GB)」と「Kindle Paperwhite シグニチャーエディション (32GB)」を対象に、Kindle本購入にも使える5,000ポイントを追加還元するキャンペーンを実施している。4月28日13時に編集部が確認したところ、27,980円のKindle Paperwhite(16GB)では5,280ポイントが還元される。
Source link
Views: 0
引用元: ・https://nova.5ch.net/test/read.cgi/livegalileo/1745823174/
Views: 0
石破茂 自民党 中国人に生活保護配るよりも 2025.04.27 ヒラターの配信 ショート
こんにちわヒラターです ふわっち ツイキャス youtubeで配信をしています
fx 雑談配信 料理 企画配信 時事ネタ ニュース などの便乗解説
等の多岐にわたる動画を投稿しています
関心のあるyoutubeチャンネルは
関心のある話題は
読売テレビニュース 中田敦彦のYouTube大学 デイリーWiLL 闇鍋ジャーナル あさ8 高橋洋一 ニューソク通信
ニュース 日本 岸田 虎ノ門ニュース 武田邦彦 石丸市長 竹田恒泰 有本香
飯山陽 ひろゆき 政経電論TV 井川意高 ゆっくり 解説 リハック 立花孝志
楽天 三木谷 成田祐輔 岡田斗司夫 メンタリストdaigo 東谷義和 ガーシー 2ch
2ちゃんねる クレアの食速報 闇のクマさん世界のネットニュース リベラルアーツ大学 短期決戦 全一 fxパンダ 瀬戸際fx
青山繁晴 養老孟司 TBS 日テレ FNNプライムオンライン ANNnewsCH ABEMA
大阪NEWS【テレビ大阪】 HTB北海道ニュース テレ東BIZ 関西テレビNEWS
中居正広 9000万 フジテレビ 女子アナ 佐々木恭子 菊間千乃 X子 日枝久 長谷川豊 広末涼子
石破茂 自民党 裏金 議員 不起訴 増税 癒着 政治 献金 経済 不況 日本経済 政治家 商品券 10万円 配布 既得権益 会食 衆議院 参議院
etc話題
#ヒラターの配信 #石破茂 #自民党
source
Views: 0
トランプ氏の関税による所得減税案、実現は不可能か – The Wall Street Journal発
Source link
Views: 0