【Python3系対応】 PDFMiner3kでPDFファイルからデータ抽出して分析しよう!(後編) | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

【Python3系対応】 PDFMiner3kでPDFファイルからデータ抽出して分析しよう!(後編)

さて、前回オープンデータの PDF からテキスト形式のデータを抽出いたしました。

しかし、もともと表形式だった PDF が、すべてのデータが一列に並んだ、とても悲惨な形式になってしまいました。これをどうにか計算できる形に持っていきたいのですが、じつは、ライブラリをつかってちょっといじればどうにかなる。というものではありません。

前回述べたように PDF は文書の「構造」に関するデータを持たないため、たとえ表のように見えていたとしても、全部単なる文字の並びです。表のようなデータとして扱うためには
それぞれの「文字」が「表」においてどういう意味を持つのか、こちらが指定してあげる必要があります。

いろいろな調整を行いながら、下記のようなソースを書きました。

from pprint import pprint
import re
import numpy as np

def birth_list(converted_pdf_file):
    birth_data=[]
    birth_row =[]
    for line in open(converted_pdf_file, 'r'):
        #改行のみの行が存在したら、別の項目と認識する
        if line == "n":
            if len(birth_row) > 3:
                birth_data.append(birth_row)
            birth_row=[]
        #年は文字列のまま。最初だけ年号が書かれている場合があるので取り除く必要がある
        elif re.match(".+年$", line):
            if not re.match("^[0-9]+年$", line):
                birth_row.append((line.split())[0])
        elif re.match("^[1|2][0-9]{3}n$", line):
            line = line.rstrip('n')
            birth_row.append(line)
        #数字は intまたは float 形式に変換
        else:
            line = line.replace(',', '')
            try:
                birth_row.append(int(line))
            except ValueError:
                try:
                    birth_row.append(float(line))
                except ValueError:
                    pass
    return birth_data


birth_data = birth_list('converted_data.txt')
birth_data = np.array(birth_data)
#出力
print(np.transpose(birth_data))

まず、完全に崩れてしまった項目名の部分をテキストから抜き出すのは、すっぱりあきらめます。

抽出されたテキストデータをみているとデータ列とデータ列の間は、規則的に1行1行空いているのでそれを目印に項目1列ずつ配列に入れていきます。

年は文字列、他の値は数字として、型変換していきます。そうやって、項目ごとにできた配列を、更に別の空配列に入れていき、表のような2重配列を作ります。

ただこのままでは、データの「タテ」と「ヨコ」が逆なので、2重配列を数値計算ライブラリ、Numpy の Array 形式に変換し、transposeメソッドで「回転」させ、「タテ」と「ヨコ」をいれかえます。

そうやってできたデータは下記のようになります。

出力


[['1960' '51632' '17.1' '95012' '17.3' '1606041' '17.2'] ['1961' '53351' '17.3' '101318' '17.7' '1589372' '16.9'] ['1962' '57682' '18.3' '114469' '19.2' '1618616' '17.0'] ['1963' '58000' '18.1' '121396' '19.6' '1659521' '17.3'] ['1964' '59035' '18.4' '131994' '20.6' '1716761' '17.7'] ['1965' '62003' '19.6' '147249' '22.1' '1823697' '18.6'] ['1966' '44869' '14.3' '111099' '16.3' '1360974' '13.7'] ['1967' '59298' '19.6' '158482' '23.2' '1935647' '19.4'] ['1968' '56758' '19.1' '159740' '22.7' '1871839' '18.6'] ['1969' '54525' '18.5' '163995' '22.7' '1889815' '18.5'] ['1970' '53165' '17.8' '169880' '22.8' '1934239' '18.8'] ['1971' '52003' '17.7' '175049' '23.0' '2000973' '19.2'] ['1972' '50068' '17.3' '176094' '22.6' '2038682' '19.3'] ['1973' '47647' '16.8' '174330' '22.1' '2091983' '19.4'] ['1974' '43839' '15.6' '165560' '20.7' '2029989' '18.6'] ['1975' '39197' '14.1' '150653' '18.6' '1901440' '17.1'] ['1976' '35951' '13.1' '140032' '17.1' '1832617' '16.3'] ['1977' '33946' '12.5' '132172' '16.1' '1755100' '15.5'] ['1978' '31775' '11.8' '124711' '15.1' '1708643' '14.9'] ['1979' '30192' '11.3' '115990' '13.9' '1642580' '14.2'] ['1980' '28919' '11.0' '111956' '13.5' '1576889' '13.6'] ['1981' '28415' '10.8' '106456' '12.8' '1529455' '13.0'] ['1982' '28406' '10.8' '106098' '12.7' '1515392' '12.8'] ['1983' '28564' '10.9' '105432' '12.5' '1508687' '12.7'] ['1984' '28607' '10.9' '103595' '12.2' '1489780' '12.5'] ['1985' '28369' '10.7' '100328' '11.8' '1431577' '11.9'] ['1986' '28125' '10.6' '97693' '11.4' '1382946' '11.4'] ['1987' '27600' '10.4' '94828' '11.1' '1346658' '11.1'] ['1988' '27446' '10.4' '93315' '10.9' '1314006' '10.8'] ['1989' '26077' '9.9' '88468' '10.3' '1246802' '10.2'] ['1990' '25065' '9.6' '86840' '10.1' '1221585' '10.0'] ['1991' '25297' '9.7' '86795' '10.1' '1223245' '9.9'] ['1992' '24810' '9.5' '86658' '10.1' '1208989' '9.8'] ['1993' '24008' '9.3' '84151' '9.8' '1188282' '9.6'] ['1994' '24124' '9.8' '88419' '10.4' '1238328' '10.0'] ['1995' '24467' '9.8' '86076' '10.0' '1187064' '9.6'] ['1996' '24862' '9.6' '89291' '10.3' '1206555' '9.7'] ['1997' '24994' '10.1' '89043' '10.3' '1191665' '9.5'] ['1998' '24898' '9.6' '90324' '10.5' '1203147' '9.6'] ['1999' '24203' '9.3' '88385' '10.2' '1177669' '9.4'] ['2000' '24136' '9.6' '88163' '10.2' '1190547' '9.5'] ['2001' '24132' '9.2' '86000' '9.9' '1170662' '9.3'] ['2002' '23635' '9.0' '83883' '9.7' '1153855' '9.2'] ['2003' '23228' '8.8' '81001' '9.4' '1123610' '8.9'] ['2004' '22794' '8.7' '79719' '9.2' '1110721' '8.8'] ['2005' '21913' '8.3' '76111' '8.8' '1062530' '8.4'] ['2006' '22949' '8.7' '77641' '9.0' '1092674' '8.7'] ['2007' '22892' '8.7' '76914' '8.9' '1089818' '8.6'] ['2008' '23290' '8.8' '77400' '9.0' '1091156' '8.7'] ['2009' '22738' '8.5' '75248' '8.7' '1070035' '8.5'] ['2010' '23061' '8.7' '75080' '8.6' '1071304' '8.5'] ['2011' '22992' '8.6' '73919' '8.5' '1050806' '8.3'] ['2012' '22763' '8.5' '73012' '8.4' '1037231' '8.2'] ['2013' '22626' '8.4' '72054' '8.3' '1029816' '8.2'] ['2014' '21940' '8.2' '69968' '8.1' '1003539' '8.0'] ['2015' '22351' '8.6' '70596' '8.1' '1005677' '8.0']]

もう少しスマートにできなかったのかと反省しますが、PDF の内容はバラエティに富みすぎており、「機械判読に適した」形にするには様々なパターンを網羅する必要があり、かなり手間がかかります。

オープンデータの公開に関わるかたには、PDF や EXCEL と変わらない手間で公開でき、CSV 形式での是非検討していただきたいところではあります。それでは。

今すぐお気軽に
ご相談ください。

0120-315-465

(平日 10:00~19:00)

今すぐお気軽に
ご相談ください。

0120-315-465

(平日 10:00~19:00)

グラッドキューブは
「ISMS認証」を取得しています。

認証範囲:
インターネットマーケティング支援事業、インターネットASPサービスの提供、コンテンツメディア事業

「ISMS認証」とは、財団法人・日本情報処理開発協会が定めた企業の情報情報セキュリティマネジメントシステムの評価制度です。

いますぐ無料で
お試しください。

SiTest の革新的な機能を
お試しいただけます。
利用規約

お名前【必須】
メールアドレス【必須】
電話番号【必須】