【JKI】015_Extracting_a_Table_from_a_PDF
【JKI_015】課題を確認
Just KNIME It! (JKI)
今回の挑戦はこちら
問題文をGoogle翻訳し少し加筆して以下に
【入力データの入手と確認】
PDFファイルへのリンクは
https://www.mountwashington.org/uploads/forms/2021/10.pdf
です。
PDFの中の表から緑色の四角で囲った7つの列についてだけデータを抽出してデータテーブルを作成するという課題です。
【初めてのLevel: Hard】
Just KNIME It!の15回目の出題にして初めての難易度Hardなのですが、PDFからのデータ取り出しに加えて下記の条件が玄人さんにも面白い課題になっていると思います。
JKI_013の感想戦でも紹介したのですが、玄人さんはコーディングに抵抗感がないので、例えばPythonノードが一つあったらすべて処理出来ちゃったりするのでしょうが、KNIMEの標準ノード+αでどこまでできるかが今回の条件なのかと思います。
そして、今回の出題の原典と考えられる下記の記事に今回の課題の難易度に関わるコメントがありました。
Google翻訳して引用します。
今回の課題は上記の記事の内容に比べたらまだ難易度は落としてくださってはいるようです。
【Tika Parser】
ちなみにTikaってなんだろと思いましたが
とのことでした。早速、実装してみます。
設定:
結果:Contentカラムに必要な情報が入っています。
【必要なデータの切出し】
欲しい情報は上図の1つのセルに文字列データとして入っています。今回は不要なデータとどのように切り分けていくかが工夫のしどころです。
上記の4ノードでは区切り文字で文字列を切り分け、欲しい列7つだけに絞り込むところまでを実装しています。
① ひとまず改行の区切り文字”\n”でセルを分割
② 横ならびになっている分割結果を縦に並べ替え
③ 半角スペース” ”でデータが区切られているセルをさらに分割
④ PDFの表と照らし合わせて欲しいカラム7つだけに絞り込み
を実施しました。以下に設定と結果を示します。
設定①:
結果①:
設定②:
結果②:
設定③:青色表示しているところには「半角スペース」が入力されています
結果③:
設定➃:
結果➃:
【DAYデータで行を絞り込み】
上図のとおり、セルを区切り文字で切り分けるなどしてデータテーブル形式にはできるのですが、不要なデータの入った行が多数残っています。
これをいかに効率よく絞り込めるかが悩ましいところです。
今回のデータ内容でのみ使える手法として、以下の方法を採用しました。
一番左の列のDAYカラムは日付を表すので、1から31までの整数値が入ります。
これならば正規表現など利用しないでデータ内容での絞り込み条件が設定できます。
ヒントは最強KNinjaと私が思っているEmilianoさんから頂きました。
設定:
結果:
これで必要なデータはすべて抽出できました。
【データテーブル仕上げ】
カラム名やRowIDが作業時に自動発生したあまりに分かりにくい名前なので下記の通りわかりやすい表現に直して出来上がりです。
設定:
結果:
KNIME Hubに解答は上げてあります。
感想戦はこちら
おまけ:
【JKI_014感想戦: 痛恨の読解ミス】
前回のJKIは公式解答を見てびっくり!
私は問題文を読み違えていたようです。
残念ながら今更解きなおす時間もないので、今回はここまでに。算数が苦手な子は実は問題文の読解力に課題があったりするのを想い出しています。
あー、耳が痛いです。一方で、個人的にはJKI_014はあれこれ愉しませてもらったのでここまでにします。
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。