📮

郵便番号辞書 Mozc形式作成手順

2024/03/30に公開
3

Mozc向け郵便番号辞書の生成スクリプト

MOZCのユーザー辞書形式で出力する手順とスクリプトです。
スクリプトはMITライセンスです。
phoepsilonix/japanese-zip-code-dictionary

wget -nc https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
wget -nc https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip
unzip -o ken_all.zip
unzip -o jigyosyo.zip
uconv -x '::[ [:^Katakana:] & [:^Hiragana:] & [:^Han:] & [^ー・「」、,()]]  Fullwidth-Halfwidth; ::[\p{Nl}] Latin-ASCII;' -f cp932 -t UTF-8 KEN_ALL.CSV > KEN_ALL_UTF8.CSV
uconv -x '::[ [:^Katakana:] & [:^Hiragana:] & [:^Han:] & [^ー・「」、,()]]  Fullwidth-Halfwidth; ::[\p{Nl}] Latin-ASCII;' -f cp932 -t UTF-8 JIGYOSYO.CSV > JIGYOSYO_UTF8.CSV 
ken_all-convert-mozc-dictionary.awk
BEGIN{
    FS=","
    f=0
}
{
    gsub( "\"", "", $0 );
    gsub(/以下に掲載がない場合|.*くる場合|.*村一円/,"",$9);
    if (f==$3) {
        next;
    } else
    {
        f=0
    }
    if (($9 ~ /(.+、/ || $9 ~ /(.*・/) && f==0) f = $3;
    $9 = gensub(/([^(]*)(.*/, "\\1", "G", $9)
    c[0] = gensub(/第?([0-90-9]+)地割(.*)/, "\\3", "G" ,$9)
}
{
    if (!a[$3,$7,$8,c[0]]++) {
        if(c[0] ~ /、/) {
            if (c[0] ~ /町/) {
                split(c[0], chou, "町")
                split(chou[2], array, "、")
                chou[1] = chou[1] "町"
            } else {
            split(c[0], array, "、")
            chou[1] = ""
        }
        for (x in array) {
            print substr($3, 1, 3) "-" substr($3,4,4) "\t" $7 $8 chou[1] array[x] "\t" "地名" "\t"
        }
        } else {
            print substr($3, 1, 3) "-" substr($3,4,4) "\t" $7 $8 c[0] "\t" "地名" "\t"
        }
    }
}
jigyosyo-convert-mozc-dictionary.awk
BEGIN{
    FS=","
    f=0
}
{
    gsub( "\"", "", $0 );
    gsub(/以下に掲載がない場合|.*くる場合|.*村一円/,"",$9);
    if (f==$8) {
        next;
    } else
    {
        f=0
    }
    if (($7 ~ /(.+、/ || $7 ~ /(.*・/) && f==0) f = $8;
}
{
    gsub(",",",",$3)
    gsub("(","(",$3)
    gsub(")",")",$3)
    gsub("㈱","(株)",$3)
    if (!a[$8,$4,$5,$6,$3]++) {
        print substr($8, 1, 3) "-" substr($8,4,4) "\t" $4 $5 $6 " " $3 "\t" "組織" "\t"
    }
}
awk -f ken_all-convert-mozc-dictionary.awk KEN_ALL_UTF8.CSV > KEN_ALL.txt
awk -f jigyosyo-convert-mozc-dictionary.awk JIGYOSYO_UTF8.CSV > JIGYOSYO.txt

Mozc本家のPythonスクリプトを使う場合

必要なファイルの準備

mkdir -p dictionary
cd dictionary
wget https://github.com/google/mozc/raw/refs/heads/master/src/dictionary/gen_zip_code_seed.py
wget https://github.com/google/mozc/raw/refs/heads/master/src/dictionary/zip_code_util.py
cd ..
wget -nc https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
wget -nc https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip
unzip -o ken_all.zip
unzip -o jigyosyo.zip

スクリプトの実行

PYTHONPATH="$PYTHONPATH:$PWD" python dictionary/gen_zip_code_seed.py --zip_code=KEN_ALL.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "地名" "\t"}'|sort -u > KEN_ALL.tsv
PYTHONPATH="$PYTHONPATH:$PWD" python dictionary/gen_zip_code_seed.py --jigyosyo=JIGYOSYO.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "組織" "\t"}'|sort -u > JIGYOSYO.tsv 

スクリプトの実行 その2

PYTHONPATHを指定せず、利用する場合。
シェルで実行する場合には、from dictionary を取り除いても、問題ありません。gen_zip_code_seed.pyと同じフォルダにあるものが、優先されて探されるからです。
一つ前のやり方は、bazelから呼び出している場合に、sandbox内の同じ場所にzip_code_util.pyがないための処置だと思われます。(bazelの設定ファイルにimport = ["."],を追加することで、回避できる問題のようです。ただし、ポリシー的に一貫性を保つために、採用されていないそうです。)

sed -e 's/^from dictionary //' -i dictionary/gen_zip_code_seed.py
python dictionary/gen_zip_code_seed.py --zip_code=KEN_ALL.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "地名" "\t"}'|sort -u > KEN_ALL.tsv
python dictionary/gen_zip_code_seed.py --jigyosyo=JIGYOSYO.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "組織" "\t"}'|sort -u > JIGYOSYO.tsv 

番外編

bazelコマンドで生成する

Mozcソース下での操作になります。
ただし、この場合は都道府県と事業所が1つのファイルになってしまいます。

cd mozc/src
bazel build dictionary:zip_code_data --config oss_linux
ls -l bazel-bin/dictionary/zip_code.tsv
cat bazel-bin/dictionary/zip_code.tsv | awk '{FS="\t"}{print $1 "\t" $5 "\t" "地名" "\t"}'|sort -u > ZIP_CODE.TSV

bazelコマンドで生成したスクリプトで作成する

PRした際に、教えてもらった方法です。
ただし実行するには、./bazel-bin/dictionary/の下に生成される複数のファイルが必要になります。

bazel build dictionary:gen_zip_code_seed --config oss_linux
./bazel-bin/dictionary/gen_zip_code_seed --help
./bazel-bin/dictionary/gen_zip_code_seed --zip_code=KEN_ALL.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "地名" "\t"}'|sort -u > KEN_ALL.tsv
./bazel-bin/dictionary/gen_zip_code_seed --jigyosyo=JIGYOSYO.CSV | awk '{FS="\t"}{print $1 "\t" $5 "\t" "組織" "\t"}'|sort -u > JIGYOSYO.tsv 

その他、Mozc関連記事

Mozc を応援するいくつかの方法

大概のLinuxで使えそうな日本語入力(Flatpak版Fcitx5-Mozc)
UbuntuでMozcの新しいバージョンをビルドするには
Mozcをオフラインでビルドするには?

DockerでビルドしたMozcをUbuntu 22.04 LTSにインストールする
Ubuntu 20.04 LTS/20.10でFcitx5を使用する

Discussion

JWJW

郵便番号辞書データ生成スクリプトの作成、ありがとうございます。
Slackware/plamolinux で利用させていただきます。
https://nothin-but-slackware.blog.jp/archives/29525278.html

epsilon phoenixepsilon phoenix

こんにちは。
拙いスクリプトですが、ご活用くださり、ありがとうございます。

最新のMozcは、bazelでビルドされる際に、最新の郵便番号辞書を取り込むようになっているかと思います。
それでも古いMozcを利用していたり、その都度、自分の手元に最新の郵便番号辞書を用意したい場合などには、それなりに活用できるかと思います。
ただ元データのフォーマット、一部の地域の区分の仕方、表記が変更されるなどの場合には、スクリプトの修正が必要になるかもしれません。
その点、ご留意の上、ご活用いただければと存じます。

またMozcソースに含まれているPythonスクリプトでも、同様のことはできるかと思います。そちらは、おそらく元データの形式が変わった場合などにも、将来的にも追随してくださることが期待できるかとは思います。Mozcの最新版は、郵便番号辞書を標準で組み込む形式で、配布されていますから。