質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

5回答

11235閲覧

漢数字を数字に直す処理

al_aya_yuka

総合スコア98

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/02/22 11:16

###概要
Python3.5で住所を正規化するシステムを作っています。
そこで漢数字の○○丁目を数字の丁目に直す処理を入れています。

例)
一丁目 → 1丁目

###課題
この「丁目」をkey-valueの辞書で保持しています。

pytyon

1master = { 2 "一丁目": "1丁目", 3 "二丁目": "2丁目", 4... 5} 6 7format = master["一丁目"]

ナンセンス感が漂うのですが、どうにか「Python」らしく
すっきりとかけないものでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

CodeLabさんのご回答で解法については尽くされていると思うのですが、やや斜め前の回答。

地名で「二丁目」「十二丁目」「万丁目」などが存在するそうです (ウィキペディア「丁目」を参照)。あと数字を含むだけなら「四万十」「一番町」などもあります。「丁目」を識別するためにはこういったものを除外する必要があるかもしれません。

また、自治体の中では一部や全部で住居表示を施行していない地域もあって、「丁目」や「番」が慣用的に振られている場合もあります。たとえば京都市は「下京区材木町XXX番地」のように慣用的な地番があります[1]が、一部には「東山区本町二丁目XXX番」のようなのもあります[2]。この場合、「○丁目」は漢数字のほうが正確だという解釈もありえると思います。


[1] ちなみに「下京区材木町」は3箇所あります (「2箇所」と誤記していたのを訂正しました)。
[2] ちなみに「二十二丁目」まであります。

投稿2017/02/22 15:53

編集2017/02/23 06:55
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

al_aya_yuka

2017/02/23 04:28

奥が深いですねxx 処理の手前までは市区町村マスタにより都道府県、市区町村は除去された状態になります。 その中から漢数字+丁目の正規表現で抽出されたdataが対象になります。 ですので、誤変換は少なそうですが、区域わけの丁目ではなく、町域名にそもそも丁目を使われてしまうとつらいですね・・・ 勉強になりました!
CodeLab

2017/02/23 04:42

そういえば以前PHPで同じようなことをやったのを思い出しました。確かにikedasさんのおっしゃる通りで正規表現だけでは単純に変換できず、最終的にはkey-value形式で実装していました。 また、表記変更、市町村合併などで変わることがあるので、結構苦労します。予算が許せば、そういったデータを提供している会社があるので検討してみるのもよいかと思います。
ikedas

2017/02/23 06:02 編集

なんか質問の趣旨から斜めにそれてしまってすみません。ついでに調べたことをメモしておきます。 新潟市西蒲区も住居表示が施行されていませんが、旧市街では「XXX番地」や「○丁目XX番」がある一方、新しく開けた地区には地番で区別できないので「○○団地XX号棟XXX号」などを使っていたりもするようです。 また、主に大分市とその周辺ですが、「丁目・番」ではなく「3組」「1-3組」のような表示が見られます (これらは数字を欧数字にできるようです)。一方、他県には「四組」といった地名もあります。
tacsheaven

2017/02/23 05:32

京都の住所はとってもカオスです。亀屋町にいたっては、上京区に5か所、中京区も5か所、下京区で2ヵ所あります。3か所ならまだマシ(w しかも慣用的な住所表記だと「どの通りとどの通りを経由した面(四辺のうちの一辺)」を記すからさらにカオス。
al_aya_yuka

2017/02/27 08:58

ご回答くださった皆様のおかげで質問以前にまだまだ課題があることを認識しました。 いったんクローズいたしますが、また新たな対応が必要になったときはまたお力添えくださいまし。
guest

0

一丁目から九丁目ならこんな感じでできるのではないかと。

python

1dic = str.maketrans('一二三四五六七八九', '123456789') 2s = '一丁目' 3print(s.translate(dic))

投稿2017/02/22 13:16

Hironsan

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

al_aya_yuka

2017/02/23 04:17

ご回答ありがとうございます。 10丁目以上が存在するので、それだけだと実現できませんでした。
guest

0

本来実施したいことは、住所の正規化かと思います。

品質はわかりませんが、次のようなサービスもあるので利用を検討してみては如何でしょうか。

住所変換サービス(無料)
http://www.ncm-git.co.jp/service/addressconvert.html

投稿2017/02/23 04:45

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

変換前の住所が「人が書いたもの」なら「十丁目」「壱〇丁目」(いないか・・・)「10丁目」「10丁目」があったりと、わりと変則的な予感がするので、自分なら切り出しや置換は「個別論理で」やるような気がします。また住所には極端な場合でも万以上の漢数字はなさそうに思える(本当かどうかは分かりませんが)のであまりに汎用的に作りこむと「やりすぎになる」恐れがあると思います。

「仕様がきっちり決まっている」ならば「その仕様を満たすすっきりした方法を考えればよい」ですが、住所の正規化とだけ聞くと「あれ!こんなパターンもあるの?」とか「このパターンは正しいとはいえないが許容したい」という「必ずしも自明ではない変則的な例外」があるような気がしました。そういうものはすっきりしない方式を取らざるを得ないのではないでしょうか。

ご質問を拝見して過去に考えたことのある問題を思い出しました。住所に出現するローマ数字をアラビア数字にかえる処理を書いたのです。そのときは迷ったあげくあまり美しいとはいえない制御論理を書きました。ⅤI(前者はローマ数字、後者は全角のアルファベットのアイ)を5Iに変換するのは危険といった配慮をしたためです。またCDMなどは変換できなくはないですがそうするのはナンセンスと考え、単にエラー扱いにして人間が判断するといった逃げ方も検討しました。

ご質問の意図から外れてしまっていたならスミマセン

投稿2017/02/22 14:11

編集2017/02/22 16:13
KSwordOfHaste

総合スコア18400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単純に変換すると十一丁目とかがあった場合に問題が起きそうです。

こちらを参考にされてはいかがでしょうか?
http://qiita.com/dosec/items/c6aef40fae6977fd89ab

投稿2017/02/22 13:39

CodeLab

総合スコア1939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

al_aya_yuka

2017/02/23 04:22

かなり使えそうです^^ 実装してみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問