見出し画像

『Python・プログラミング』PDFの読み取り・加工・判定ツール!(2)【コラボ企画】

以下記事の続きです!

前回はPDFを読み取ってテキストに書き込み、それをダウンロードする処理までを行いました。今回は要望いただいた判定処理を作っていきます。

前回同様、私の記事は「結果に至るまでの思考」を書きます。結果や簡潔にまとめられた情報だけを見たい方は、「はなこ☆さん」の記事を読んだほうがわかりやすいと思います! 記事投稿は後日行われると思うので、投稿されたらその記事のリンクに変更いたします。


画像1

※最後にまとめとして 
 コード公開と 
 手順を記載いたします

画像2

🌸条件1確認

下記、1~16の項目が記載されているかどうか。

1.化学品及び会社情報
2.危険有害性の要約
3.組成及び成分情報
4.応急措置
5.火災時の措置
6.漏出時の措置
7.取扱い及び保管上の注意
8.ばく露防止及び保護措置
9.物理的及び化学的性質
10.安全性及び反応性
11.有害性情報
12.環境影響情報
13.廃棄上の注意
14.輸送上の注意
15.適用法令
16.その他の情報

まずは、この処理について考えていく。


画像3

🌸条件1の処理概要

前回はPDFの情報をテキストに書き込みましたが、「書き込み用の変数」には「1つにまとまったPDFのテキスト情報」が入っています。

書き込み変数


ここに条件1の内容が入っているかを判定すればいいはず。

書き込み変数


画像6

🌸条件1の処理詳細

以下の流れで行う。

条件文字が書かれたテキスト用意
↓  
条件文字格納用配列を用意

テキスト読み込み

1行ずつ分けて配列に入れる

判定結果用の配列用意

判定処理 ループ

あったら  OK
なかったら NG

処理イメージは以下。

書き込み変数3

これを行ってヒットしたら「OK」、ヒットなしなら「NG」という結果を配列に格納する。


画像8

🌸条件1の実行

コード組めたので実行していきます。

まずは条件文字の準備。
条件文字は以下のようにいたしました。記載がない文字が「NG」になるかのテストも行いたいので、PDFに記載がない「ピーナッツバター」と「かわいい猫ちゃん」を入れました。

▼テキストの中身

化学品及び会社情報
危険有害性の要約
組成及び成分情報
ピーナッツバター
応急措置
火災時の措置
かわいい猫ちゃん
漏出時の措置
取扱い及び保管上の注意
ばく露防止及び保護措置
物理的及び化学的性質
安全性及び反応性
有害性情報
環境影響情報
廃棄上の注意
輸送上の注意
適用法令
その他の情報


これでコードを実行してみると……

画像9


ひっかかる可能性がないはずのものが「NG」になってますね。本当にないのか? 見ていきます。いただいたPDFで以下を検索。

安全性及び反応性


ヒットなしですね。PDFの「安全性及び反応性」があるはずの箇所を目で確認します。


画像10


安””定”” という記載がありました。ここで考えられるのは

■1
PDFの記載が間違えている

■2
いただいた条件文字が間違えている


事前にいただいたこちらの資料「化管法SDS 標準的な書式」を確認してみます。

画像11


どうやら「安定」が正しいようです。こういったことはよくあることです。想定外の挙動が起きた場合は、「入力データ」と「プログラム」どちらが間違えているか両方を確認していきます。

今回は入力データの間違いとわかりました。
訂正して再度実行してみます。

画像12

想定どおりになりました。とりあえずこれで良さそうかなと思います。


画像13

🌸条件2確認

条件文字1~16が順番通りに並んでいるかどうか。

これについて考えていく。

画像14

🌸条件2の処理概要

以下のイメージで作ります。

条件文字の行数を調べる

行数でソート(並び替え)

正しい並びになっているか

ここは色んな方法があるので、もっといい方法もあるかも。

画像15

🌸処理詳細・行数分解

PDFのテキスト情報は、現在1つにまとまって入っている。行数を判定するためには、これを1行ごとにわける必要がある。

PDF分ける


画像17

🌸処理詳細・行数取得

単純に条件文字でテキスト内を1行目からラストまで検索して、何行目にヒットするかを調べるだけでもいいですが、それだと「条件文字が見つかった後の処理」が無駄になります。

PDF分ける2

PDFのページ数が多いと、見つかった後の検索はめっちゃ無駄になります。なので、ヒットしたらその文字の検索ループ処理を終了させることが必要です。


画像19

🌸処理詳細・順番判定

「順番判定結果」を「ヒットした行数」でソート(並び替え)して、「PDFに記載がある順番」と「本来想定している順番」を比較して判定します。

画像20


画像21

🌸実行・行数取得のみ

PDFは引き続き以下を使用しております。

https://www.asahi-ghs.com/content/files/sample-sds/201909/Ammonia_Gas_J-1.pdf

このPDFは「条件文字の順番」が正しくなっているものです。まずは「行数取得」のプログラムだけを組んだので実行してみると……

行数

おかしい……正しい順番で並んでいるPDFをテストデータとして使ったのに、行数が前の文字よりも先にヒットしている。


画像23

🌸原因調査・行数取得

テストに使用した以下PDFで該当文字を検索する。

https://www.asahi-ghs.com/content/files/sample-sds/201909/Ammonia_Gas_J-1.pdf

応急措置

検索を行うと……

画像24


ヒット件数が3件あり、最初のここにヒットしていました。本来であれば……

画像25


ここが存在するかの判定なので、別の箇所でヒットしていることがわかりました。「有害性情報」についても同様です。

ということは、最初に作った「条件文字が存在しているかの処理」も間違えていたことになります。別のところにヒットして「OK」を出力していた。


画像26

🌸修正

確実に目的の文字""のみ""にヒットする必要があります。まずは簡単に解決するため「検索条件文字には統一された記載ルールがあるのか」を「はなこ☆さん」に確認いたしました。

回答は「定義はない」ということでした。以下のようにバラバラになる可能性があるようだ。

11.有害性情報
11.有害性情報
11.有害性情報
1 1 . 有害性情報

プログラム的には嬉しくない表記方法ですね。まずは今回のPDFに対応した処理を完成させて、その後に別形式に対応した処理を考えることにします。

ということで、今回の表示形式はPDFを確認するとこのようになっています。

1.化学品及び会社情報

半角数字 + . + 半角スペース + 文字

これを使うため、テストに使うテキストを以下のように変更いたします。

1. 化学品及び会社情報
2. 危険有害性の要約
3. 組成及び成分情報
ピーナッツバター
4. 応急措置
5. 火災時の措置
かわいい猫ちゃん
6. 漏出時の措置
7. 取扱い及び保管上の注意
8. ばく露防止及び保護措置
9. 物理的及び化学的性質
10. 安定性及び反応性
11. 有害性情報
12. 環境影響情報
13. 廃棄上の注意
14. 輸送上の注意
15. 適用法令
16. その他の情報


画像27

🌸再テスト・条件文字有無

テストデータが変わったので再度テストを行います。実行してみると

画像28

問題なさそうですね。


画像29

🌸実行・行数取得のみ

先程つまづいた箇所を実行してみます。

画像30

正しい順番で並んでいるPDFをテストデータとしているので、この結果で問題ないことがわかります。


画像31

🌸実行・順番判定

正しい順番で並んでいるPDFでは「NG」がわからないため、順番を変更したデータを使います。

8. ばく露防止及び保護措置を
4. 応急措置の上に移動

画像32

6. 漏出時の措置を
5. 火災時の措置の上に移動

画像33


これで判定結果処理を実行すると……

画像34

間違っていたら、「本来あるべき項目のところに違う項目があるよ」とわかるようになりました。良さそうかな。

現状、出力は結果画面にしておりますが、結果をどう使うか相談して出力形式決めていこうと思います。

あとは、「条件項目の記述形式」がバラバラな問題も次回移行解決していきたいなと思います。まだ考えてないので可能かは不明。


画像35

🌸ここから有料

でもほとんど書いてしまったので、コード公開くらいになります。ロジック見てわかる人は買ってもあまり意味ないと思います。

画像36


ここから先は

2,782字 / 2画像

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?