Help us understand the problem. What is going on with this article?

[BOD供養寺] スクレイピングしてきたデータの文字コードがおかしかったので修正した

Code for Japan Summit の人気企画に、「BADオープンデータ供養寺」というコンテンツがあります。

BADオープンデータ供養寺

【セッション概要】
世の中のBADオープンデータが二度とこの世を彷徨わないように、「供養(データクレンジング)」する方法を考える場です。

データの公開に携わる行政職員の方や、データを利活用するエンジニア・データサイエンティスト等の皆さまと、より使いやすく品質の高いオープンデータの公開と加工の仕組みを考えていくために建立されました。

前半はパネリストが、日頃の業務の中で、どのようなBADオープンデータにいかに対処してきたか、実例やクレンジング技術を紹介します。
後半では事前投稿されたBADオープンデータを紹介しながら、オーディエンスの皆さまと一緒に成仏させる方法を考えて行きたいと思います。

ちょうど最近、総務省が公開しているマイナンバーカードの交付状況というPDFからデータを抜き出してCSVデータ化する中で、BADなデータを見つけたので供養の経緯を書いておきます。

埼玉県が2つある?

PDFからテーブルを抜き出してテキスト化できるcamelotを使ってデータを取得してCSVファイルに保存した後、それを Tableau から表示しようとしたところ、いくつかうまくUnionできないデータがあり、なぜか「埼玉県」のデータが2種類できてしまいました。
そこで良く調べてみた所、マイナンバーカード交付状況(平成29年3月8日時点)とそれ以降(例えばマイナンバーカード交付状況(平成29年5月15日時点))では、「玉」という時の文字コードが違っていたのです。

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 ファイルで提供してくれればこんな回りくどいことは必要ないのですけどね。)

hal_sk
Georepublic Japan CEO http://georepublic.co.jp/, Code for Japan 代表理事 http://code4japan.org/, Detailed profile: http://jp.linkedin.com/in/halsk/ お仕事の依頼は info@georepublic.co.jp までお願いします。
http://www.georepublic.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away