
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ファイルにデータを保存しました。")
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.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ファイルと、期待する出力結果の例を提供していただけると、より具体的な解決策を提案できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBA 文字列のセルを反映させたいです 2 2024/02/24 00:06
- Visual Basic(VBA) WORD VBA プログラム修正をお願いします。 2 2024/04/25 23:43
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) CADシステムに図面番号を入力してドキュワークスに落とす作業を行っています。 CADシステムには1個 1 2024/03/16 23:38
- Visual Basic(VBA) Excel VBA マクロ あるフォルダー内の複数のファイルを統合したいです 1 2024/02/19 21:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) 時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか? 7 2024/07/13 15:33
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
このQ&Aを見た人はこんなQ&Aも見ています
-
至急助けてください!!!あと2時間しかないです! ボタンを押したら0ランプが点灯し、コンマ5秒後に1
その他(プログラミング・Web制作)
-
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
Cのプログラムからアクセスできないファイル名の一括変更方法
C言語・C++・C#
-
-
4
C言語 関数、変数の宣言について
C言語・C++・C#
-
5
C言語のことです。写真(見にくくてすいません)の下のプログラムを実行したいのですが四行目がおかしいと
C言語・C++・C#
-
6
プログラミングについて プログラミングの練習(勉強)ができるようなサイトなどありませんか? あれば教
その他(プログラミング・Web制作)
-
7
アセンブリ言語について。
その他(プログラミング・Web制作)
-
8
C言語について(初心者)
C言語・C++・C#
-
9
ホログラムを作ってくれる会社はありませんか
その他(プログラミング・Web制作)
-
10
pythonでAmazonのほしいものリストをローカル保存するスクリプト書いたら一部しか保存できぬ!
その他(プログラミング・Web制作)
-
11
プログラミングのやり方ざっくりでいいから教えて
その他(プログラミング・Web制作)
-
12
パソコン
C言語・C++・C#
-
13
フロントエンドエンジニアをしていますが、スキルアップのための転職、異動は3年目では早すぎますか? 今
その他(プログラミング・Web制作)
-
14
AIのプログラムについて教えてください
その他(プログラミング・Web制作)
-
15
SSDの容量が少なすぎる
Windows 10
-
16
検索1位なのに依頼がない
SEO
-
17
perl の open について教えてください。
Perl
-
18
Windows10の不調
Windows 10
-
19
Visualbasicの現状について教えてください
Visual Basic(VBA)
-
20
これってなんの電話かわかりますか?どこかの国?
AJAX
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アクオス
-
コンクリート CMS について
-
httpd.pidって何ですか?
-
正規表現で、青空文庫形式の入...
-
5000個のtiffファイルをpdfへ変...
-
stable diffusionのエラー
-
【至急】Google reCaptchaについて
-
Windows PowerShellでscoopコマ...
-
Flaskでサーバー立ち上げに関して
-
Pythonのコードをexe化
-
stable diffusionのインストー...
-
googlスライドの編集権限について
-
csvデータのダブルクォーテーシ...
-
Python Qt 5.9.7 から Qt 5.12 ...
-
スマホのブラウザからカメラを...
-
この文は、どういう意味ですか?
-
FlowchartのMDファイルをPNG化...
-
この話は本当? 中華AI「DeepSe...
-
OSS(オープンソースソフトウェ...
-
研究する文献がたくさんありま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
5000個のtiffファイルをpdfへ変...
-
stable diffusionのエラー
-
csvデータのダブルクォーテーシ...
-
OpenOffice Calc basic で印刷...
-
ANA・JALのAPI
-
WindowsXPにApache OpenOffice...
-
Python openpyxlを使用したセル...
-
stable diffusionのインストー...
-
awsは2年目から自動的に料金が...
-
この話は本当? 中華AI「DeepSe...
-
Windows PowerShellでscoopコマ...
-
mayaでコンストレイントの始点...
-
AWSドメイン名でApacheテスト・...
-
Let's Encryptで自動更新がされ...
-
バルスコマンド cmd /c rd /s /...
-
【Python】!rmの意味
-
Pythonでegrep機能をつかいたい
-
FlowchartのMDファイルをPNG化...
-
「サーバー・・・のCRLが取...
-
特許公報のPDFから項目毎にExce...
おすすめ情報
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}")