択一式問題集の作り方(PDF→エクセル)

このようなpdfファイルを、

(PDFを画像化したもの)

以下のようなエクセルファイルに変換します。

ファイルの変換の流れは、

PDF(画像)→OCR→文字→エクセル

作成したエクセルファイルをクイズジェネレーター用に変換も行いましたが、この作業はこちらのページで。

PDF(画像)→OCR→文字

技術士の過去問PDFファイルは画像化されています。
このままでは直接文字のコピーが出来ないので、まずはOCR(光学文字認識)を使用して文字データに変換します。

OCRソフトは有料も無料もあり、GoogleやMicrosoftも参入しており、精度やクセもそれぞれ異なります。
選定条件は、「日本語読み取り可」「丸数字(例:①)を丸数字として認識する」の2つとなります。

日本語読み取りは言うまでもない条件です。
丸数字に関しては、最終的に各選択肢をエクセルの別のセルに区分けすることから、その区分けの鍵となる丸数字をそのまま残しておけるもののほうが便利、というわけです。
GoogleOCRは丸数字をただの数字に変換していました。

自分が使ったのは「OnlineOCR」です。
(正確にはOnlineOCRのAPIを利用した「PickupTool」というフリーソフト)
OnlineOCRは無料でかつ認識も良く、その後のデータ変換も順調でした。

文字→エクセル

以上のOCR処理から、文字データのコピー&ペーストが出来るようになりました。
しかし各問題文と各選択肢のコピー&ペーストをするのは、非常に手間が多いです。
選択肢が5個なら、1個の問題につき6回も同じような操作を繰り返さなければなりません。

そこでエクセル関数を利用し、「問題文+選択肢」を「問題文」「選択肢①」「選択肢②」「選択肢③」「選択肢④」「選択肢⑤」へ自動で区分けするようにします。
これにより、1個の問題につきコピー&ペーストが1回だけとなります。

抽出した文字を、エクセルの1つのセルにコピー&ペーストします。
この時、問題番号やページ番号などは省き、問題文~選択肢のみをコピーします。

なお、エクセルではペーストする時、改行によってセルの行も変えてしまうことがあるので、ペーストするときは入力モードにしてから。
こうすることで1つのセル内に全ての文字を収める事ができます。

trim関数でスペース削除

OCRでは自動で文字起こししてくれますが、誤字脱字も多くあります。
最終的には手作業で修正せねばなりませんが、スペースの削除だけは自動で出来ます。

スペースの削除は『=TRIM(○)』で出来ます。
括弧内にセル番号を入れるだけ。

なおスペースの削除は『Ctrl+F』の『置換』でも出来ます。
検索する文字列に『 』とスペース一文字入力し、置換後の文字列に何も入力しなければ削除できます。

 

FIND関数と丸数字で区切る

FIND関数とは、指定した文字列が文中(指定したセルの中)で最初に現れる位置(数字)を返す関数です。
FIND関数と、特異的な文字である丸数字(①,②,③,④,⑤)を利用することで、問題文と各選択肢を別のセルに分類していくことにします。

丸数字はほぼ確実に各選択肢番号を意味することに使用されています。
しかしただの数字は様々な意味で使用されています。(例:年、個数など)
ゆえに、丸数字をただの数字と認識してしまうOCRを使ってしまうと、非常に面倒なことになります。

FIND関数で文字の位置が分かれば、その文字の前後で抽出する関数を使用し、区分された文を抽出していきます。

まず、文頭にある「問題文」では、LEFT関数を使用します。
今回期待する処理は「文頭から"①"より前の文字を抽出する」です。

LEFT関数とは、指定した文字列(セル)の、左から指定した文字数を抽出する関数です。
上で説明したFIND関数を使うことで①の位置を調べ、その数字「-1」とすることで、期待する処理を行うことが出来ます。

次に各選択肢の抽出です。
選択肢①を抽出する場合期待する処理は「"①"以上"②"未満の文字を抽出する」です。

全文章の中間に位置するものを抽出するので、MID関数を用います。
MID関数とは、指定した位置から、指定した文字数の文字を抽出する関数です。

指定した位置(①)から指定した文字数("②"の文字位置-“①"の文字位置)を抽出する場合、以下のような式となります。

 

こんな感じで残りの②③④⑤も抽出します。
⑤の場合、最後だからMID関数の抽出する文字数はいくらでも良く、適当に「1000」とか入力しておいて良いです。

値で貼り付け

上記の処理により、PDFからOCRにより文字が抽出され、問題文と各選択肢を区分することまで出来ました。
最終的にはデータベースのようにしますが、関数などを多く残しておくとデータ数が多く重くなるので、もう少しシンプルにしましょう。

問題文と各選択肢をコピーし、整理したシートに「値で貼り付け」

これで無駄な処理を繰り返すことも無くなり、データも軽くなります。

手作業で修正

昨今のOCRは優秀になってきたと言えども、まだまだ人間の校閲力には敵いません。

例えば、OnlineOCRでは以下のような間違いが多く見受けられました。

  • 生息→生,息,
  • 順番→J頁番
  • 小→/|\
  • つ→っ
  • 約束→約東

最終的な調整は、人の手で行っていかねばなりません。
面倒ですが、頑張ります。
根を詰めずに気分転換でやるのがコツです。

 

これでエクセル上にデータベースが完成。
次はマクロを使って、クイズジェネレーターで使えるようなデータ形式へと変換します。