重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Pythonを使って特許公報PDFの一部分をExcelシートに落とすプログラムを作っていますが、どうしても正規表現の一致で必要部分(【項目】~次の【まで)を抜き出すことが出来ません。
修正方法がお分かりの方にお教えを請えれば幸いです。

A列、B列、C列、D列、E列、F列、G列、H列、I列、J列、H列
文献番号、発明の名称、出願人/権利者、要約、特許請求の範囲、発明の詳細な説明、発明の効果、実施例、公開番号、出願番号、出願日

 テキスト全体を抜き出す所までは動くのですが、項目別に抜き出そうとすると空白になってしまいます。公報は特許情報プラットホーム(J-PlatPat)でダウンロードしたものです。宜しくお願い致します。

Pythonコード(暫定)

import pdfplumber
import re
import openpyxl

# PDFファイルを開く
with pdfplumber.open("example.pdf") as pdf:
extracted_text = ""
for page in pdf.pages:
extracted_text += page.extract_text()

# 改行を統一
normalized_text = extracted_text.replace("\n", " ")

# 正規表現パターン
pattern = r"【\s*(文献番号|発明の名称|出願人/権利者|要約|特許請求の範囲|発明の詳細な説明|発明の効果|実施例|公開番号|出願番号|出願日)\s*】([\s\S]*?)(?=【|$)"

# 正規表現でマッチ
matches = re.findall(pattern, normalized_text)

# 抽出データをデバッグ出力
print(f"マッチ数: {len(matches)}")
for i, match in enumerate(matches, 1):
title, content = match
print(f"マッチ {i}: 項目 = {title}, 内容 = {content[:100]}") # 内容の冒頭100文字を表示

# Excelに書き込み
wb = openpyxl.Workbook()
ws = wb.active

# ヘッダー行(項目名)をB列から順に追加
columns = ["文献番号", "発明の名称", "出願人/権利者", "要約", "特許請求の範囲", "発明の詳細な説明", "発明の効果", "実施例", "公開番号", "出願番号", "出願日"]
ws.append(["項目"] + columns) # ヘッダー行をA列から挿入

# 各項目に該当するデータをExcelに保存
row_data = ["内容"] # A列のラベル
for column_name in columns:
# 該当するデータを検索
content = ""
for match in matches:
if match[0] == column_name:
content = match[1].strip() # 内容を取得
break
row_data.append(content) # データを追加
ws.append(row_data)

# 保存
wb.save("extracted_data_by_columns.xlsx")
print("Excelファイルにデータを保存しました。")

質問者からの補足コメント

  • fadklsj様

    早速ですが、実行しました結果、出力されたExcelデータをお知らせさせて頂きます。
    項目 文献番号 発明の名称 出願人/権利者 要約 特許請求の範囲 …
    内容 (空白)

    J-PlatPatも全文出力しますと問題無い様にみられ、改行や余白を無くす事も試しておりました。良い方策がありましたらご教示をお願い致します。
    cleaned_matches = []
    for match in matches:
    title, content = match
    cleaned_content = re.sub(r"\s+", " ", content.strip())
    cleaned_matches.append((title, cleaned_content))
    print(f"項目: {title}, 内容: {cleaned_content}")

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/11/27 15:44

A 回答 (1件)

コードの問題点は、正規表現のパターンと、その後のデータ抽出処理にあります。

J-PlatPatのPDFは、レイアウトが複雑で、単純な正規表現ではうまくいかないことが多いです。特に、【項目】~次の【まで という曖昧な範囲指定は、正規表現では正確に捉えにくい可能性が高いです。

以下、修正版のコードと、その理由を解説します。

修正版コード:

import pdfplumber
import re
import openpyxl

# PDFファイルを開く
with pdfplumber.open("example.pdf") as pdf:
extracted_text = ""
for page in pdf.pages:
extracted_text += page.extract_text()

# 改行を統一(スペース2つ以上を1つに)
normalized_text = re.sub(r'\s+', ' ', extracted_text)

# 項目名と対応する正規表現を辞書で管理
patterns = {
"文献番号": r"【文献番号】(.*?)(?=【|$)",
"発明の名称": r"【発明の名称】(.*?)(?=【|$)",
"出願人/権利者": r"【出願人/権利者】(.*?)(?=【|$)", # 半角/全角の両方に対応
"要約": r"【要約】(.*?)(?=【|$)",
"特許請求の範囲": r"【特許請求の範囲】(.*?)(?=【|$)",
"発明の詳細な説明": r"【発明の詳細な説明】(.*?)(?=【|$)",
"発明の効果": r"【発明の効果】(.*?)(?=【|$)",
"実施例": r"【実施例】(.*?)(?=【|$)",
"公開番号": r"【公開番号】(.*?)(?=【|$)",
"出願番号": r"【出願番号】(.*?)(?=【|$)",
"出願日": r"【出願日】(.*?)(?=【|$)",
}

# Excelに書き込み
wb = openpyxl.Workbook()
ws = wb.active

# ヘッダー行
ws.append(["項目"] + list(patterns.keys()))

# 各項目のデータ抽出と書き込み
row_data = ["内容"]
for item, pattern in patterns.items():
match = re.search(pattern, normalized_text, re.DOTALL) # re.DOTALLで改行を含む
content = match.group(1).strip() if match else "" # マッチしなかった場合は空文字列
row_data.append(content)

ws.append(row_data)

# 保存
wb.save("extracted_data_by_columns.xlsx")
print("Excelファイルにデータを保存しました。")
content_copy
Use code with caution.
Python

変更点と理由:

正規表現の改善: 元の正規表現は、[\s\S]*? を使って非貪欲マッチを試みていましたが、複雑なレイアウトのPDFではうまく機能しない場合があります。 そこで、各項目ごとに専用の正規表現を作成し、re.DOTALL フラグを使用して改行文字を含むマッチを可能にしました。 また、出願人/権利者 のスラッシュを半角と全角の両方に対応させました。

辞書による管理: 項目名と正規表現のパターンを辞書で管理することで、コードの可読性が向上し、メンテナンスが容易になります。

re.search の使用: re.findall の代わりに re.search を使用しました。各項目は1回しか出現しないことを想定しているため、re.searchの方が効率的です。

エラー処理: re.search がマッチしなかった場合にエラーが発生しないように、条件分岐を追加しました。

改行処理の改善: \n を単純にスペースに置き換えるのではなく、re.sub(r'\s+', ' ', extracted_text) を使用して、複数のスペースを1つのスペースに統一しました。これにより、不要なスペースによる正規表現のマッチミスを防ぎます。

この修正版でもうまくいかない場合は、以下の点を考慮してください。

PDFの構造: J-PlatPatのPDFは、テキスト抽出が難しい場合があります。 pdfplumber の代わりに、より高度なPDF解析ライブラリ(例: camelot)を使う必要があるかもしれません。

OCR: PDFがスキャン画像から作成された場合は、OCR(光学的文字認識)が必要になります。 tesseract-ocr などを利用できます。

レイアウトの複雑さ: テーブル形式になっている場合など、正規表現だけでは対応できない可能性があります。 その場合は、PDFの構造を解析し、座標などを元にテキストを抽出する必要があります。

これらの改善でも問題が解決しない場合は、具体的なPDFファイルと、期待する出力結果の例を提供していただけると、より具体的な解決策を提案できます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A