新型コロナウイルス感染症の感染拡大を踏まえたオンライン診療のPDFデータを利用してみた

#はじめに
新型コロナウイルス感染症の感染拡大を踏まえたオンライン診療の対応機関一覧リストが以下に公開されています。

https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/rinsyo/index_00014.html

これを用いて、近所のオンライン診療の対応機関がどんな感じになっているか取り出す処理を作成してみます。
これにより政府の提供するPDFのデータを使用することができるかも合わせて検討してみます。

##成果物
https://needtec.sakura.ne.jp/yakusyopdf/
https://github.com/mima3/yakusyopdf

経度と緯度を入力して検索すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/970df336-1857-af64-d4de-0e0079ea8d52.png)

近くの病院の一覧が表示されるので、行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/f6724640-36db-88ad-5016-37b8ff609e94.png)

すると地図に詳細情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/abc2a60c-8533-81bc-24b0-e1c63fea63cc.png)



# 説明
## 処理の流れ
(1)新型コロナウイルス感染症の感染拡大を踏まえたオンライン診療の対応機関一覧リストのホームページからPDFを取得します。

(2)PDFからテーブル情報を抜き出してJSONに変換します。
この辺の処理については下記のページを参照してください。
・[厚生労働省のPDFをCSVやJSONに変換する](https://needtec.sakura.ne.jp/wod07672/2020/04/29/%e5%8e%9a%e7%94%9f%e5%8a%b4%e5%83%8d%e7%9c%81%e3%81%aepdf%e3%82%92csv%e3%82%84json%e3%81%ab%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b/)

(3)各都道府県のJSONを1つのJSONに結合します。

(4)JSON中の住所からYahoo!ジオコーダAPIで経度緯度を求めて記録します。

(5)データベースに格納しておき、その情報をもとに、画面に表示します。

## PDFからテーブルを抽出する際の問題点。
じつはPDFからテーブル中のデータを抽出するというのは結構面倒です。
[tabula](https://tabula.technology/)や[camelot](https://camelot-py.readthedocs.io/en/master/index.html)というライブラリがありますが、それだけで旨くいくものではありません。
ここではcamelotを使用して発生した問題について記述します。

### 長い文字を含むデータの分割がうまく行かない。
たとえば以下のようにセルの内容をはみ出すようなデータがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/17da7032-210e-d2ff-f096-3bd34e64b3e8.png)

この場合、電話番号とURLが一つのまとまりとして検出されます。
今回、この問題に対応する方法としては、必須項目がなかった場合、左右のセルをみて結合されているかどうかを確認しています。
ただし、郵便番号や電話番号などの書式が決まっていないデータ列が対象となった場合、復元はできません。

### メモリの使用量の問題
camelotはメモリをかなり消費するため、1ページづつの処理をしたほうが良いです。
この辺が参考になると思います。
https://github.com/camelot-dev/camelot/issues/28

また、今回扱うデータの用紙サイズの問題で、1ページづつでも32ビットプロセスだとメモリ不足になったため64bitプロセスで動作させた方がいいでしょう。

### 点線が検知できない。
以下のIssueであがっていますが、camelotは点線で表をつくると旨く認識しません。

**Detect dotted line #370**
https://github.com/atlanhq/camelot/issues/370

この問題を解決する方法は以下のようになります。
[camelotで点線を実線として処理する](https://needtec.sakura.ne.jp/wod07672/2020/05/03/camelot%e3%81%a7%e7%82%b9%e7%b7%9a%e3%82%92%e5%ae%9f%e7%b7%9a%e3%81%a8%e3%81%97%e3%81%a6%e5%87%a6%e7%90%86%e3%81%99%e3%82%8b/)

## 対応機関一覧リストのPDFの問題点
これが極めてやっかいで、完全自動でPDFの解析処理は無理だと思います。

### 用紙サイズ
用紙のサイズが一辺1mとかのものがあったりするため、処理に時間がかかります。
また、よくあるPDFをWORDに変換してからの処理は、サイズが大きすぎるため不可能です。

### 対応医療機関リストのPDFは日々更新され、そのURLも変わる
対応医療機関リストのPDFは日々更新されますが、そのURLは更新のたびに変更されるようです。
例えば東京都のURLは以下のようになります。

2020/04/28時点
https://www.mhlw.go.jp/content/000625693.pdf

2020/04/29時点
https://www.mhlw.go.jp/content/000626106.pdf

このため、PDFのURLは新型コロナウイルス感染症の感染拡大を踏まえたオンライン診療についてのリンクから取得する必要があります。


### 凡例の有無
データの１行目に凡例が入っている場合とない場合があります。
東京都の場合は凡例がありますが、北海道の場合はありません。

つまり県ごとに1ページ目のデータ行の取得位置を調整する必要があります。

### 各県ごとにページヘッダの取り扱いが異なる。
たとえば、東京都と茨城県のPDFを比較してみてください。
東京都は2ページ目以降にヘッダが含まれていますが、茨城県には含まれません。

つまり県ごとに２ページ目以降のデータ行の取得位置を調整する必要があります。
さらに同じ県であっても常にそうとは限りません。

実際、北海道は4月までは２ページ目以降にヘッダ行がありました。
おそらく、これはファイル出力時の指定が時々によってぶれるためと推測できます。

### 各県ごとに項目の取り扱いが異なる。
たとえば、北海道と愛知県と山梨県を比較してみてください。

**北海道**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/abf2d8e3-e9de-870d-16dd-a1af97902c44.png)

**愛知県**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/8574ff80-4224-6ce1-e21c-2c5ba9711891.png)

**山梨県**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/4daecc2e-ea88-b695-5b3a-29414cb6827c.png)


列の項目が県ごとに異なる可能性があり、仮に共通の項目だったとしても位置を調整する必要があります。
さらに同じ県であっても項目が常に同じとは限りません。実際、山梨県は4月まで、電話による診察とオンラインによる診察という列の分け方はしていませんでした。

### 表記のブレ
「初診の電話等を用いた診療の実施の有無」という項目がありますが、多くの場合、〇か×（あるいは空欄）を書きますが表記にブレがあります。
たとえば以下のように注釈がかかれることがあります。

```
○
※今後行う予定
```

では最初の1文字だけを取ればいいかというものでもなく、その表現も多岐にわたります。
すくなくとも現時点で以下のような表記のブレが存在しています。

**「初診の電話等を用いた診療の実施の有無」の有りを現わす表現**

|文字|コード|
|:--|:----|
|〇|E38087|
|○|E2978B|
|◯|E297AF|
|△|E296B3|
|可|E58FAF|
|●|E2978F|
|▲|E296B2|

**「初診の電話等を用いた診療の実施の有無」のなしを現わす表現**

|文字|コード|
|:--|:----|
|空欄||
|×|C397  |
|ｘ|EFBD98|
|☓|E29893|
|✕|E29C95|
|X|58|
|-|2D|
|－|EFBC8D|
|Ｘ|EFBCB8|
|✖|E29C96|
|否|E590A6|



### その他問題
実際のPDFの変換結果は以下のようになります。解析プログラムの問題もありますが、そもそもPDFの誤記もあったりします。

https://github.com/mima3/yakusyopdf/blob/master/20200503

# まとめ
今回は厚生労働省の公開するPDFをコンピュータ処理しやすいように変換して、それを利用したWebアプリケーションの作成を行ってみました。

ある一定のところまでは自動でデータを変換できますが、PDFを用いる以上、完全自動化は不可能になっています。また、手で直すとしても更新頻度が高いので、厳しいところがあります。

**すくなくとも正確なデータが必要でかつ、更新頻度が高い場合は、今回のようにPDFからデータを抽出するのは避けた方が無難です。**

また、もし、データを公開する立場の方がいらしたら以下の点を検討していただければ幸いです。

 - PDF以外で公開できないか？
    - データを利用する場合はExcelとかのほうがマシです。PDFは見た目は同じでもはるかに難易度が厳しくなります。
 - 更新が発生する可能性があるデータに関しては最終更新日は入れるようにする
 - 都道府県ごとに書式を変えるようなことは避ける。
    - おそらく善意で見やすいようにやっていると思いますが、機械が処理する上では辛くなっていきます。
 - 表現はなるべく統一する。

以上です。