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

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

ただいまの
回答率

90.60%

  • Python 3.x

    5894questions

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

漢数字を数字に直す処理

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,259

al_aya_yuka

score 46

概要

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

例)
一丁目 → 1丁目

課題

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

master = {
    "一丁目": "1丁目",
    "二丁目": "2丁目",
...
}

format = master["一丁目"]

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+6

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 13:28

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

    キャンセル

  • 2017/02/23 13:42

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

    キャンセル

  • 2017/02/23 13:56 編集

    なんか質問の趣旨から斜めにそれてしまってすみません。ついでに調べたことをメモしておきます。

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

    キャンセル

  • 2017/02/23 14:32

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

    キャンセル

  • 2017/02/27 17:58

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 13:17

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 13:22

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

    キャンセル

+1

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    atom-runner python実行 エラー (OSX)

    前提・実現したいこと テキストエディタ Atom のアドイン atom-runner で python コードを テストしたいのですが以下のエラーメッセージが出ます。 発

  • 解決済

    atomのremote-ftpの接続について

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが

  • 解決済

    Python3系が実行できない

    前提・実現したいこと pytyhon3.6をコマンドプロンプト上から実行したいです。 発生している問題・エラーメッセージ 実行されず代わりになぜかAtomが立ち上がってしまいま

  • 解決済

    MacでAtomを再インストールの際のエラーで困っています。

    MacでAtomを再インストールしようと下記のコマンドでアンインストールを実行したところ、以下のようなエラーが出てしまい、実行できません。どうしてでしょうか。 rm: /Use

  • 解決済

    atomでpythonが起動できない

    前提・実現したいこと windows10でatomを使用してpythonを実行させたくてatom-runnerをインポートしたのですが、Alt+rで実行するとエラーメッセージが出て

  • 解決済

    ランダムな問題集ファイル作成について

     前提・実現したいこと pythonでランダムな問題集ファイルを作成しており、以下のようにコードを書いたのですが、問題集35のみに問が出るだけで、そのほかの問題集1~34には問がの

  • 解決済

    AtomのRunnerで実行するとエラーになる

     前提・実現したいこと Pythonの勉強中でAtomで書いてRunnerを使用して簡易テストしています。 別のファイルに日本語を入力しておき、それを読み込んで表示するプログラムな

  • 解決済

    atomエディタ スニペット機能について

    いつもお世話になっております。 atomのスニペット機能についての質問です。 スニペットに下記のように記述しました。 scssファイルにborderと入力するborde

同じタグがついた質問を見る

  • Python 3.x

    5894questions

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