判例PDFをパースする際にハマること

# 概要

最近は行政データをオープンに公開することで、広く官民に使ってもらおうと言う動きが活発だ。裁判所も過去の判例データを公開している。こちらの[サイト](https://www.courts.go.jp/app/hanrei_jp/search1)で、過去の判例データを検索して、判決文や判決に至る根拠を書いたPDFをダウンロードできる。
しかし、そのPDFは人間が読むことを想定しており、PDFの内容を機械が読み取ってデータとして利用することは想定していないように見られる。
今回は、判例PDFをダウンロードして、機械的に読み取り、テキスト化する際にどのような不便があるかを共有する。

# アドベントカレンダーへの参加

こちらの記事は、[CivicTechテック好き Advent Calendar 2020](https://qiita.com/advent-calendar/2020/civictech_tech) 12/15に参加しています。


# 使用ツール

PDFから機械的にテキストを抜き出すツールは[色々ある](https://gammasoft.jp/blog/python-parse-pdf-contents/) が、今回は、[pdfminer](https://pypi.org/project/pdfminer/) を利用して判例PDFからテキストファイルを抜き出す。`pdfminer` には`py2txt.py` というコマンドラインで、pdfからtextを抜き出してくれる機能があり、こちらを使って抜き出してみる。


# 実際のテキスト抜き出し例

使用した判例は、昭和38年に争われた[不当利得金返還請求事件](https://www.courts.go.jp/app/hanrei_jp/detail2?id=022531) 。

![スクリーンショット 2020-08-22 16.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26986/bafb31a9-ea7f-573a-0f12-e990f3c76ab2.png)

テキストで抽出すると次のようになる。

```
　　　　　　　　　主　　　　文
　　　　　本件控訴を棄却する。
　　　　　控訴費用は控訴人の負担とする。
　　　　　　　　　事　　　　実
　控訴代理人は、「原判決を取消す。被控訴人は控訴人に対し金一二万五〇〇〇円
及びこれに対する昭和三六年八月二六日から完済にいたるまで年五分の割合による
金員を支払え。訴訟費用は第一、二審共被控訴人の負担とする。」との判決を求
め、被控訴代理人は主文同旨の判決を求めた。
　当事者双方の事実上の陳述、証拠関係は
　控訴代理人において、原判決事実摘示請求原因第二項第三項を次のとおり訂正す
る。
　「二、控訴人は生活の本拠である本件不動産を失つては困るので、訴外Ａ弁護士
に依頼して競落許可決定に対する抗告や債権者との交渉に当らせていたところ、当
時たまたま被控訴人と右Ａ弁護士とが懇意の間柄であつたところから、同弁護士は
昭和三四年四月一六日頃控訴人に対し「被控訴人に頼んで本件不動産を競落しても
らつた。ついては至急一五万円程度の金が必要だから持参せよ。」との電話があつ
たので、控訴人は急拠右金員を調達し、即日同弁護士に届け、同弁護士から「被控
訴人に頼んで競落してもらい第三者への競落を防止した。そしてその間に債権者と
の間に示談解決しよう。右示談ができなくとも被控訴人に競落してもらつているか
ら、その代金を控訴人が被控訴人に支払つて買戻しの形式をとればよい。ついては
被控訴人にその点についての協力の謝礼として右の内金二万五〇〇〇円を渡しても
らいたい。また被控訴人は競落の保証金として一二万五〇〇〇円を納付しなければ
ならぬが、この金は本来控訴人のために被控訴人が競落された行為についての金で
あるから控訴人が支払われたい。控訴人の出金による右一二万五〇〇〇円を被控訴
人名義で保証金として納付してもらい事件解決後、右一二万五〇〇〇円は控訴人に
返還する。」旨確約したので、控訴人は同日同弁護士に右金一五万円を交付し、同
弁護士は控訴人の代理人として翌一七日被控訴人に対し右趣旨で右金員を支払い、
被控訴人は右趣旨でこれを受領し、右の内金一二万五〇〇〇円は保証金として被控
訴人名義で執行吏役場に納付し、同月二二日控訴人に対し右納付金領収証（甲第三
号証）を交付し控訴人に対する右保証金返還の証とした。
```
上記をパースして以下のことがわかる。

* 主文や理由、事実の間にスペースが入り込んでいる。 主　 文　や　理   由 、事　　実というテキストとして書かれている。
* 文中で改行を入っており、文章を意味あるものにするには、文末以外の改行を削除しなければならない。
* 主文や、事実、理由など、本来は構造化された文章のはずであるが、構造は、一段下げスペースなどで表されており、人間が読むことを前提として作られている。
* 文章の最後に -1- などページ番号が唐突に入る。

上の例は、比較的素直に抜き出せた例で、うまく行かない例[ 参議院議員選挙無効](https://www.courts.go.jp/app/hanrei_jp/detail2?id=076154)だと次のようになる。PDF上では下のイメージのように表示される。

![スクリーンショット 2020-08-22 16.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26986/94863f57-7a4e-2ecd-ae2c-1b760d5cd53a.png)

しかし、textとして抜き出すと、

```
右当事者間の参議院議員選挙無効事件について原告は当裁判所に訴を提起したが

裁判官全員一致の意見で本訴は管轄裁判所である仙台高等裁判所に移送すべきもの

と認めたので左のように決定する。

本件を仙台高等裁判所に移送する。

昭和二十二年九月十五日

最高裁判所第一小法廷

裁判長裁判官

裁判官

裁判官

裁判官

裁判官

澤

眞

齋

岩

河

田

野

藤

松

村

竹 治 郎

毅

輔

郎

介

悠

三

又

- 1 -

```
と抜き出される。判決文には裁判官名などが右揃えで書かれており、それが正常に抜き出せない。

とはいえ、すべての裁判名がうまく取れないかというとそうでもなく、この[判決文](https://www.courts.go.jp/app/hanrei_jp/detail2?id=011056)は綺麗に取れている。


```
平成１３年（行ケ）第５１２号　審決取消請求事件（平成１４年５月２８日口頭弁
論終結）
　　　　　　　　　　判　　　　　　　　決
　　　　　　　原　　　　告　　　　　富士写真フイルム株式会社
　　　　　　　訴訟代理人弁護士　　　宮　寺　利　幸
　　　　　　　同　　　　弁理士　　　千　葉　剛　宏
　　　　　　　被　　　　告　　　　　特許庁長官　太田信一郎
　　　　　　　指定代理人　　　　　　藤　内　光　武
　　　　　　　同　　　　　　　　　　菅　原　道　晴
　　　　　　　同　　　　　　　　　　小　林　信　雄
　　　　　　　同　　　　　　　　　　高　橋　泰　史
　　　　　　　同　　　　　　　　　　宮　川　久　成
              同　　　　　　　　　　伊　藤　三　男
　　　　　　　　　　主　　　　　　　　文
　　　　　　原告の請求を棄却する。
　　　　　　訴訟費用は原告の負担とする。
　　　　　　　　　　事実及び理由
第１　請求
```

# Google Vision API を利用する

テキストとして抜き出すのが難しいなら画像として抜き出したらどうかを考えた。幸いなことに Google Vision APIはOCRとしても使える。

https://cloud.google.com/vision/docs/ocr?hl=ja

やってみよう。ドキュメントの段落と、文章の範囲を、VisonAPIで推定した。2018年の5月に実験しているため、現在はもっと精度が高いかも知れない。

![009000_hanrei-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26986/fc743d07-1a3a-12a1-f079-d00f0fb99f31.png)

赤線で囲まれたブロックや青線で囲まれたブロックはGoogle Vision APIが「文の塊」と認識した個所。
Google Vision APIを使ってパースするとあまりきれいに判別出来ないようだ。

# pdfplumber を使う。

pdfがうまくパースできないと愚痴っていたら、 `pdfplumber` というライブラリを教えてもらった。

https://github.com/jsvine/pdfplumber

こちらで、パースしてみます。

ライブラリの使い方としては、

```
        with pdfplumber.open('foobar.pdf') as pdff:
            first_page = pdff.pages[0]
            text=first_page.extract_text()
```
でテキストを抜き出せるようだ。

事件は[こちら](https://www.courts.go.jp/app/hanrei_jp/detail7?id=10056)。抜き出した結果がこれ。

```
平成１５年（行ケ）第２２７号審決取消請求事件
口頭弁論終結日　平成１６年９月２１日
                    判決
 原　　　　　　　告　　　株式会社豊田自動織機
 同訴訟代理人弁護士      永島孝明
 同                      伊藤晴國
 同                      山本光太郎
 同訴訟代理人弁理士      恩田博宣
 同                      恩田誠
 被　　　　　　　告　　　株式会社ゼクセルヴァレオクライメートコントロール
 同訴訟代理人弁護士      森田政明
 同訴訟代理人弁理士      森正澄
                    主文
　　　　　１　原告の請求を棄却する。
          ２　訴訟費用は原告の負担とする。
                    事実及び理由
第１　請求
  　特許庁が無効２００２―３５４９２号事件について平成１５年４月１６日にし
た審決を取り消す。
第２　前提となる事実
  １　特許庁における手続の経緯（当事者間に争いがない。）
    　原告は，発明の名称を「可変容量圧縮機」とする特許第２５６７９４７号
（平成元年６月１６日出願，平成８年１０月３日設定登録，以下「本件特許」とい
う。）の特許権者である。
    　被告は，本件特許について，無効審判請求をした（無効２００２―３５４９
２号事件）ところ，原告は，平成１５年２月４日，誤記の訂正を目的として，本件
特許の願書に添付した明細書の訂正を請求した。特許庁は，同年４月１６日，上記
訂正請求を認容した上，「特許第２５６７９４７号の請求項１，３に記載された発
明についての特許を無効とする。」との審決（以下「本件審決」という。）を行
い，その謄本は，同年５月５日，原告に送達された。
  ２　本件特許の請求項１，３に係る発明の要旨
    　上記訂正後の明細書（甲１ないし３。以下「本件明細書」という。）の「特
許請求の範囲」の請求項１，３に記載された次のとおりのものである（以下，請求
項１，３に記載された発明をそれぞれ「本件発明１」，「本件発明３」とい
う。）。
    【請求項１】　吸入室と吐出室及びクランク室とを備え，クランク室圧力と吸
入圧力との差圧に応じてピストンのストロークが変更され揺動傾斜板の傾斜角が変
化して，圧縮容量を制御するようにした角度可変揺動傾斜板型の可変容量圧縮機に
おいて，吐出室とクランク室とを連通する給気通路と，前記クランク室と吸入室と
を連通する抽気通路とを設け，前記給気通路には該給気通路の開度を調整する調整
弁を設け，該調整弁には吸入圧力，クランク室圧力又は吐出圧力などの内部圧力を
検知して該調整弁を制御する感圧手段を設け，さらに前記感圧手段に結合して外部
入力により該感圧手段に可変荷重を与えて該感圧手段の圧力制御点を可変する外部
制御手段を設け，さらに前記外部制御手段は感圧手段とは無関係に前記調整弁を制
御して前記給気通路を開放することにより吐出室とクランク室との間を直接的に連
通する状態にして容量を強制的に減少させる通路開放手段を備えている可変容量圧
縮機。
    【請求項３】　請求項１記載の発明において，前記給気通路に設けた調整弁の
弁体は弁支持ロッド及びべローズなどの感圧部材により支持され，該感圧部材の外
側には，吸入圧力を感知する感圧室を設けた可変容量圧縮機。
  ３　本件審決の理由の要旨（甲１）
    　本件審決は，次のとおり，本件発明１，３は，特開昭６２－２８２１８２号
公報（甲４。以下「引用例１」という。）及び特開昭６３－９３６１４号公報（甲
５。以下「引用例２」という。）に記載された各発明（以下，順に「引用発明１，
２」という。）並びに周知技術に基づいて当業者が容易に発明をすることができた
ものであるから，特許法２９条２項の規定に違反して特許されたものであるとし
た。
    (1)　本件発明１について
```
見た限り、裁判官などの情報は綺麗に取れているようだ。

## pdfplumberの惜しい点

上の[事件](https://www.courts.go.jp/app/hanrei_jp/detail7?id=10056)のPDFをパースしたが、

- 紙面の終わりを改行とするのは惜しいと思う。できれば文章の最後できて欲しい。
- 列挙要素 1,2,3 a,b,c などがもう少しきれいに取れると嬉しい。


## 残念なPDF

上記 pdfplumerで分析している際に、

```
text=first_page.extract_text()
```
しても `None` が返ってくる例が見つかった。東京高裁のこの[事件](https://www.courts.go.jp/app/hanrei_jp/detail4?id=87257)だ。
PDFを見て理由が分かった。

テキストじゃなくて、これ、**画像** として貼り付けている。そりゃ、テキストとして取れないはずだ。

裁判所の中の人は、人が読むことを想定しているので、PDFの中身がテキストでも画像でも良いと考えている。しかし、プログラマーはテキストとして抜き出したいので、画像として入れられると困る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26986/4f14cf29-90ab-88d8-fa72-7e6e82392899.png)


# PDFで出すのと並行してマークダウンなり、htmlで出した欲しい。

今回は、裁判所の出している判例PDFをパースしてみた。情報は公開されることにも意味を持つが、活用されることで更に意味を持つ。上で見たように、プログラマが後で改行の操作をしたり、主文か理由かなど文章の構造を推定することは無駄が多い。

判決を作る時点で、文章の構造は明らかになっているので、主文、理由、など主要な文章構造でをhtmlなどやxmlで構造化した上で公開してもらえると嬉しい。PDFは紙としてのフォーマットが強すぎて、再利用することが難しい。

上記提案を、デジタル革命IdeaBoxに[投稿](https://ideabox.cio.go.jp/ja/idea/04730/)させていただきました。ご賛同いただけると幸いです。

また、私と同じ様に行政の出したオープンデータに苦しむ方たちの供養寺[BADオープンデータ供養寺](https://bad-data.rip/) へも奉納させていただきました。