HN 日本語サマリー

← 一覧へ戻る
プログラミング

悪名高い日本の郵便番号CSVの解析

Parsing the Infamous Japanese Postal CSV (dampfkraft.com)

23 pointsby birdculture1 コメント

要約

この記事は、日本の郵便番号データ(ken_all.csv)の解析の難しさについて論じています。公式データは、括弧書きの注釈や長すぎるフィールドの改行など、解析を困難にする多くの奇妙なフォーマット上の問題を含んでいます。著者は、これらの問題を解決するために作成したPythonパッケージ「posuto」を紹介し、より洗練された代替手段についても言及しています。

全文翻訳

悪名高い日本の郵便番号CSVの解析 この記事は、コードとコンピュータ、プロジェクト、および日本語技術に関するコレクションの一部です。 昨年末、私は日本の郵便局が公開したデータに基づいた、使いやすい形式で日本の郵便番号データを提供するパッケージ「posuto」をリリースしました。このデータは広く使われているものの、解析が非常に難しいことで悪名高いです。Irasutoyaのこの愛らしいキャラクターは可愛いですが、生の郵便番号CSVデータはそうではありません。 私が郵便番号データに初めて気づいたのは、オンラインフォームに郵便番号を入力した際に、「XXX-区(ただし以下を除く)」と自動補完された時でした。その括弧書きが何を指しているのか全く分からなかったので、郵便番号データの一般的なソースを探し、CSVを見つけ、問題を発見しました。 そのCSVファイルには、CSVファイルを読んでいる人への括弧書きの注釈が含まれており、行の順序を参照していることが判明しました。これは問題を引き起こします。データは主に1行ずつ使用されるため、括弧書きは無意味です。CSVはフィールド区切り形式なので、括弧書きの必要はありません。注釈フィールドを追加するだけで済むはずです。 これはken_all.csvの多くの問題の1つに過ぎません。Twitterで人々が定期的に不満を漏らしているのを見かけますし、それについてウェブ上の投稿を集めたブログさえ一時的に存在しました。特に面白いツイートは、人間がコンピュータを意のままに動かすことを期待する人々が、地獄で永遠にken_all.csvを解析させられることで罰せられると描写しています。 ファイルのREADMEには、フィールドが長すぎる行は複数の行に分割されると説明されています。具体的には、町名が38文字を超える場合、または半角カタカナの発音が76文字を超える場合、行は2行に分割されます。長すぎる町名フィールドは継続され、他のすべてのフィールドは複製されます。それがどのようなものかの簡単な例を以下に示します。 12345,東京都,港区,この地名は本当に 12345,東京都,港区,長すぎて1行に収まらなかったため 12345,東京都,港区,分割する必要がありました この動機は説明されていません。おそらく30年前にどこかで固定長のバッファがあったのでしょう。私は以前の職場で数百もの異なるプロバイダーからのCSVやその他のファイルを処理していましたが、この特定の設定は他では見たことがありません。 また、長さの制限は記載されている通りですが、長い行で改行が挿入される場所はランダムに見え、文字数制限でも単語の区切りでもありません。 CSVのすべての問題が本質的に技術的なものではないことに注意する価値があります。郵便番号は常に複雑です。CSV内で最も多くの行(驚くべき66行)を持つ郵便番号は〒452-0961で、これは愛知県清須市の春日地域を指します。各町に個別の行があるため、これほど多くの行があります。(この特定のケースは、春日町が2006年から2009年まで日本で最も面積の小さい町だったことと関連している可能性があります。その後、清須市に編入されました。) 対照的に、上記の改行ルールを使用した最も長く継続された行は、〒602-8368または〒602-8374のエントリで、どちらも8行です。これらはどちらも、交差点ベースのアドレス指定というユニークで奇妙なシステムを使用している京都のいくつかの地域のうちの1つにあります。エントリは少しこのようになります。 12345,京都府,京都市,"北(西から南下、東から西下、西から旧寺町上ル)" 12345,京都府,京都市,"西から南下、東から西下、西から旧寺町上ル)" 12345,京都府,京都市,"東から西下、西から旧寺町上ル)" 12345,京都府,京都市,"西から旧寺町上ル)" ここでは引用符付きフィールドを使用しましたが、実際のCSVはフィールドを引用せず、代わりに異なる種類のカンマを使用しています。 他にも問題があります。多くの地域には「以下を除く」という町名を持つ包括的な郵便番号があり、それを見つけて除外するしかありません。同様の文字列が多数あり、すべてを確実に捉えたかどうかは不明です。 別のコメントの例として「一円」があります。通常これは「1円」を意味しますが、「〜の周辺地域」も意味し、CSVでは町名から削除されるべき注釈ですが、それが実際に名前である滋賀県の1つの町(〒522-0317)を除いてはそうです。 JP Postは別のローマ字ファイルも提供しています。これはメインファイルよりも更新頻度が低く、しばしば同期が取れておらず、提供されるローマ字は非常に低品質です。 現時点では、一貫性のためにposutoでデータを提供し続けていますが、正直なところ、cutletを使用すべきです。悪いローマ字の例を挙げましょう。 大手町 JAビル OTEMACHI JIEIEIBIRU ここで何が起こっているかというと、「JA」が日本語の音読み「ジェイエイ」に変換されています。次に、「大字」と「小字」で書かれる「ジェ」が、「小字」を「大字」のように扱って「jie」に変換され、他の文字はそのまま翻訳されて、すでにラテン文字で書かれているものがアルファベットスープに変わっています。 対照的に、cutletは「JAビル」を「JA building」に変換するのに問題はありません(ケース処理にはまだ改善の余地があることは認めます)。同様の問題で、「六本木ヒルズ」が「Roppongihiruzu」に、「スウェーデンヒルズ」が「Suedenhiruzu」になっています。 とにかく、このファイルに対処することは、1つの場所にどれだけの複雑さを詰め込めるかという謙虚な教訓となりました。多くの詳細は省略しましたが、posutoのREADMEでカバーされています。 posutoをライブラリとして使用するか、Pythonを使用していない場合は、事前に処理されたJSONをダウンロードして利用してください。もし良い用途を見つけたら、ぜひ教えてください。 ああ、そしてWin3.1またはDOSプログラムでデータをIBM Hフロッピーディスクにコピーする必要がある場合は、JP Postのページの最下部を確認してください。対応しています。 Ψ 2020-11-07T20:11:58+09:00