見出し画像

247 ①PDFがデジタルテキストの場合でPyPDF2を用いた文字抽出 #AIエンジニアを目指して勉強 #MENTA

MENTAで教わった情報をシェアします。

①PDFがデジタルテキストの場合でPyPDF2を用いた文字抽出方法をシェアします!

▼メリット

  • 環境構築に時間をかけず日本語抽出可能

  • レイアウトを保持が比較的できる


レッスンコード

import PyPDF2
import pandas as pd
import re

# PDFファイルを読み込む
file_path = '/content/nenpyo.pdf'  # ここを対象のPDFファイルのパスに変更してください
with open(file_path, 'rb') as file:
    reader = PyPDF2.PdfReader(file)

    # 全ページのテキストを格納するリスト
    text_data = []

    # 各ページのテキストを抽出
    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]
        text = page.extract_text()
        if text:
            text_data.append(text)

# # 各ページからテキストを抽出
# text_data = []
# for page in reader.pages:
#     text_data.append(page.extract_text())

# テキストを結合して保存
with open('output_text.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(text_data))

text_data
# DataFrameに変換
# df = pd.DataFrame(text_data, columns=['Year', 'Event'])

# # DataFrameの表示
# df

実際に私がテストしたもの



インプット画像:pdf形式でパスを指定
アウトプット画像:メモでパスを指定

import PyPDF2
import pandas as pd
import re
import os
#12/1outputファイルのパスを指定する。レイアウト保持して文字抽出できた。
# PDFファイルのパスを絶対パスで指定
file_path = "C://purinpdf.pdf"  # PDFファイルのフルパスを指定

# 出力先フォルダのパス
output_folder = "C://1201OUTPUT"

# 出力先ファイルのパス(テキストファイル)
output_file_path = os.path.join(output_folder, "output_text.txt")

# フォルダが存在しない場合は作成
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# PDFファイルを読み込む
with open(file_path, "rb") as file:
    reader = PyPDF2.PdfReader(file)

    # 全ページのテキストを格納するリスト
    text_data = []

    # 各ページのテキストを抽出
    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]
        text = page.extract_text()
        if text:  # テキストが抽出できた場合
            text_data.append(text)

# テキストを結合して保存
with open(output_file_path, "w", encoding="utf-8") as f:
    f.write("\n".join(text_data))

# 結果を表示
print(f"テキストファイルが保存されました: {output_file_path}")

解説

閲覧用コラボ

OCR_pdfread.ipynb のcopy 12/01

PDFファイル(デジタルテキストが含まれている場合)からテキストを抽出し、保存する流れをシェアします!


1. PDFファイルを扱う準備

import PyPDF2
import pandas as pd
import re


  • PyPDF2: PythonでPDFを操作するためのライブラリ。ここではPDFからテキストを抽出するために使います。

  • pandas: データ分析用のライブラリ。今回は使っていませんが、抽出したテキストを整理・表示する準備としてインポートされています。

  • re: 正規表現を扱うライブラリ。今回は使われていませんが、データ整形が必要な場合に便利です。




2. PDFファイルを読み込む

file_path = '/content/nenpyo.pdf'  # PDFファイルのパスを指定
with open(file_path, 'rb') as file:  # 'rb'はバイナリ読み込みモード
    reader = PyPDF2.PdfReader(file)  # PyPDF2でPDFを読み込み


  • file_path: PDFファイルの場所を指定します。ここではサンプルとしてnenpyo.pdfを指定していますが、対象ファイルに置き換えてください。

  • with open: ファイルを開き、fileという変数に格納します。処理が終わると自動で閉じられるので安心です。

  • PyPDF2.PdfReader(file): PDFファイルを読み込み、操作可能なオブジェクトreaderを生成します。




3. 全ページのテキストを抽出

text_data = []  # 抽出したテキストを保存するリスト

for page_num in range(len(reader.pages)):  # 各ページをループ
    page = reader.pages[page_num]  # ページごとの情報を取得
    text = page.extract_text()  # ページからテキストを抽出
    if text:  # 抽出したテキストが空でなければ
        text_data.append(text)  # リストに追加


  • reader.pages: PDFの全ページがリストのように扱えます。

  • page.extract_text(): ページからテキストを抽出するメソッド。

  • text_data.append(text): 各ページから抽出したテキストをリストに追加。




4. テキストをファイルに保存

with open('output_text.txt', 'w', encoding='utf-8') as f:  # テキストファイルを作成
    f.write('\n'.join(text_data))  # 抽出したテキストを結合して書き込み


  • 'output_text.txt': 抽出したテキストを保存するファイル名。

  • '\n'.join(text_data): 各ページのテキストを改行で結合します。

  • encoding='utf-8': 文字コードをUTF-8に設定。日本語対応のために重要です。




5. text_dataの内容確認

text_data


  • PDFから抽出したテキストのリスト(ページごとのテキスト)が表示されます。




コメントアウト部分の説明

# DataFrameに変換
# df = pd.DataFrame(text_data, columns=['Year', 'Event'])

# # DataFrameの表示
# df


  • この部分は、テキストを整理するための追加処理です。例えば、PDFの内容が「年」と「イベント」ごとに構造化されている場合、pandasのDataFrame(表形式)に変換することで、データ分析や操作が容易になります。




改善点や注意点

  1. PDFがスキャン画像の場合
    このコードはデジタルテキストがあるPDF用です。スキャンされたPDF(画像データのみ)ではテキストを抽出できません。その場合、OCRライブラリ(例:PyTesseract)が必要です。

  2. 抽出結果の確認
    一部のPDFではテキスト抽出がうまくいかない場合があります。原因としてPDFのフォーマットや文字コードが挙げられるので、その場合は異なるライブラリ(例:pdfplumber)を試すと良いです。

おわり

いいなと思ったら応援しよう!