見出し画像

【JKI】015_Extracting_a_Table_from_a_PDF

【JKI_015】課題を確認

Just KNIME It! (JKI)

今回の挑戦はこちら

問題文をGoogle翻訳し少し加筆して以下に

課題15:PDFからテーブルを抽出する
レベル:難しい
 
説明:テーブル付きのテキストベースのPDFドキュメントがある場合、さらに分析するためにテーブルをKNIMEデータテーブルに部分的に抽出できますか?
この課題では、このPDFドキュメントからテーブルを抽出し、 KNIME内で部分的に再構築を試みます。
対応するKNIMEテーブルには、Day、Max、Min、Norm、Depart、Heat、およびCoolの列が含まれている必要があります。
 
注1: 最終的な出力は、関連するすべてのデータを含む単一の行ではなく、テーブルである必要があります。
注2:Tika Parserノードは、PDF Parserノードよりもこのタスクに適しています。このタスクは、コンポーネント、正規表現、またはコードスニペットノードなしで完了しました。実際、私たちのソリューションには合計10個のノードがありますが、列にラベルを付けるには少し手作業が必要でした。

【入力データの入手と確認】

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翻訳して引用します。

解析されたPDFからデータを準備することは、絶対的な悪夢になる可能性があります。解析する必要のあるPDFの構造に応じて、このタスクは非常に単純なものからほぼ不可能なものまでさまざまです。

今回の課題は上記の記事の内容に比べたらまだ難易度は落としてくださってはいるようです。

【Tika Parser】

ありがたいことに、KNIMEはTikaParserと呼ばれるノードを提供しています。KNIMEが説明しているように、このノードは「Tikaでサポートされているあらゆる種類のドキュメントの解析を可能にします」。Tikaパーサーノードの構成は途方もなく簡単です。ダウンロードしたPDFを格納するディレクトリを選択し、リストからファイルタイプを選択してから、出力するメタデータアイテムを選択するだけです。この場合、ファイルパスとメインコンテンツを選択しました。結果のコンテンツ出力は、各PDFからの長いテキスト文字列です。

ちなみにTikaってなんだろと思いましたが

Apache Tikaは、主にドキュメントタイプを検出し、さまざまなファイル形式からテキストコンテンツとメタデータを抽出するために使用されるライブラリです。(Google翻訳して引用)

とのことでした。早速、実装してみます。

設定:

結果:Contentカラムに必要な情報が入っています。

【必要なデータの切出し】

欲しい情報は上図の1つのセルに文字列データとして入っています。今回は不要なデータとどのように切り分けていくかが工夫のしどころです。
上記の4ノードでは区切り文字で文字列を切り分け、欲しい列7つだけに絞り込むところまでを実装しています。

①    ひとまず改行の区切り文字”\n”でセルを分割
②    横ならびになっている分割結果を縦に並べ替え
③    半角スペース” ”でデータが区切られているセルをさらに分割
④    PDFの表と照らし合わせて欲しいカラム7つだけに絞り込み

を実施しました。以下に設定と結果を示します。
設定①:

結果①:

設定②:

結果②:

設定③:青色表示しているところには「半角スペース」が入力されています

結果③:

設定➃:

結果➃:

【DAYデータで行を絞り込み】

上図のとおり、セルを区切り文字で切り分けるなどしてデータテーブル形式にはできるのですが、不要なデータの入った行が多数残っています。
これをいかに効率よく絞り込めるかが悩ましいところです。
今回のデータ内容でのみ使える手法として、以下の方法を採用しました。
一番左の列のDAYカラムは日付を表すので、1から31までの整数値が入ります。

これならば正規表現など利用しないでデータ内容での絞り込み条件が設定できます。
ヒントは最強KNinjaと私が思っているEmilianoさんから頂きました。

設定:

結果:

これで必要なデータはすべて抽出できました。

【データテーブル仕上げ】

カラム名やRowIDが作業時に自動発生したあまりに分かりにくい名前なので下記の通りわかりやすい表現に直して出来上がりです。

設定:

結果:

KNIME Hubに解答は上げてあります。


感想戦はこちら


おまけ:

【JKI_014感想戦: 痛恨の読解ミス】

前回のJKIは公式解答を見てびっくり!

私は問題文を読み違えていたようです。

残念ながら今更解きなおす時間もないので、今回はここまでに。算数が苦手な子は実は問題文の読解力に課題があったりするのを想い出しています。

うちの娘は、算数の文章題が苦手です。どうも、問題文をよく理解しないまま計算を始めてしまって、まちがえているようです。

あー、耳が痛いです。一方で、個人的にはJKI_014はあれこれ愉しませてもらったのでここまでにします。

記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。