Code for Japan Summit の人気企画に、「BADオープンデータ供養寺」というコンテンツがあります。
【セッション概要】
世の中のBADオープンデータが二度とこの世を彷徨わないように、「供養(データクレンジング)」する方法を考える場です。データの公開に携わる行政職員の方や、データを利活用するエンジニア・データサイエンティスト等の皆さまと、より使いやすく品質の高いオープンデータの公開と加工の仕組みを考えていくために建立されました。
前半はパネリストが、日頃の業務の中で、どのようなBADオープンデータにいかに対処してきたか、実例やクレンジング技術を紹介します。
後半では事前投稿されたBADオープンデータを紹介しながら、オーディエンスの皆さまと一緒に成仏させる方法を考えて行きたいと思います。
ちょうど最近、総務省が公開しているマイナンバーカードの交付状況というPDFからデータを抜き出してCSVデータ化する中で、BADなデータを見つけたので供養の経緯を書いておきます。
埼玉県が2つある?
PDFからテーブルを抜き出してテキスト化できるcamelotを使ってデータを取得してCSVファイルに保存した後、それを Tableau から表示しようとしたところ、いくつかうまくUnionできないデータがあり、なぜか「埼玉県」のデータが2種類できてしまいました。
そこで良く調べてみた所、マイナンバーカード交付状況(平成29年3月8日時点)とそれ以降(例えばマイナンバーカード交付状況(平成29年5月15日時点))では、「玉」という時の文字コードが違っていたのです。
総務省のマイナンバーカード交付状況をデータ化していて、データの結合がうまくいかないなーと思ったら、なんと、同じ埼玉でも文字コードが違うという落とし穴が・・
— Hal Seki (@hal_sk) July 11, 2020
3月8日では \u2f5f が使われていて、それ以降では\u7389…https://t.co/AOkV3iojaz pic.twitter.com/jU4P583Ad5
unicodedata.normalize で正規化
色々調べてみた結果、「山」や「大」、「手」などといった文字でも平成29年3月8日時点のみ、2f から始まるコードが使われていました。2fシリーズは、部首作成用のコードらしいのですが、どうやって入力したのだろう・・・
>>> '⽟'.encode('utf-8')
b'\xe2\xbd\x9f'
>>> '玉'.encode('utf-8')
b'\xe7\x8e\x89'
※PDFからコピペしてそうなったのでは?という推理がありました。確かに、PDFからコピーしたときに、濁点とかが2文字に別れちゃったりもしますよね。
unicodedata.normalize
で正規化をすることで、一般的な玉(u7389
)にすることができました。
>>> import unicodedata
>>> unicodedata.normalize('NFKC', '⽟').encode('utf-8') #こちらは 2f から始まる玉
b'\xe7\x8e\x89'
>>> unicodedata.normalize('NFKC', '玉').encode('utf-8')
b'\xe7\x8e\x89'
余計な変換までしないように、対象を限定
ただし、安易に normalize
してしまうと、意図しない文字まで変換してしまう可能性があるというご指摘をいただきました。
そのため、テキストが Kangxi Radicalsにある範囲のみに絞って文字を normalize
することにします。
if (c >= b'\xe2\xbc\x80'.decode('utf-8') and
c <= b'\xe2\xbf\x95'.decode('utf-8')): # '⼀'から'⿕' の範囲
return unicodedata.normalize('NFKC', c)
else:
return c
全体のフローはこちら にあります。
というわけで、無事BADオープンデータを修正し、お焚き上げすることができました。南〜無〜。
ちなみに、マイナンバーカードの普及率を一覧で見れ、生データもダウンロードできるというサイトを作り中です。
サイト:https://mynumbercard.code4japan.org/
GitHub:https://github.com/codeforjapan/mynumbercard_statistics/
仲間を募集中なので、もしご協力いただける方がいたら、ぜひご連絡ください。
Code for Japan の Slack に入り、Hal Seki(@hal_sk)
にお声がけいただいても大丈です。
(そもそも、元々のオープンデータをPDFではなく、自治体カードつきの csv ファイルで提供してくれればこんな回りくどいことは必要ないのですけどね。)