困りごと
日本語の文章を検索やRAGに入れる前に、漢数字を数字にそろえることがあります(三億五千万円 → 350000000円)。
ところが、文中の漢数字を全部変換すると、数ではない所まで変わります。
- 地名: 一宮市 → 1宮市、四日市 → 4日市
- 人名・社名: 五十嵐 → 50嵐、三菱 → 3菱
- 言葉・熟語: 統一 → 統1、一石二鳥 → 1石2鳥
漢数字の変換そのものはよく使われています(kanjize は週11,851ダウンロード: https://depscope.dev/pkg/pypi/kanjize )。正規化ライブラリの jpnorm も、名前(加藤一二三)の誤変換に注意書きをしています(https://pypi.org/project/jpnorm/ )。
作ったもの
JP Kansuji Guard(MIT・Python標準ライブラリのみ・外部通信なし)。
https://github.com/ayatrader/jp-kansuji-guard
決まりは3つです。
- 単位・助数詞(円・人・年・条・階・% など)が続くとき、または 万/億/兆 の金額のときだけ変換する
- 地名・人名・社名・言葉・熟語の一覧(252語、手書き)に入る所は変換しない
- 読み方で意味が変わる所(十分=じゅうぶん/じゅっぷん、一時、一番、二三人)とおおよその数(数万円)は変換せずに flags で返す
from kansujiguard import convert
convert("三菱の売上は三億円、十分な利益")["text"]
# '三菱の売上は300000000円、十分な利益'(十分 は flags に入る)
convert("令和六年三月十五日、第三条")["text"]
# '令和6年3月15日、第3条'
大字(金壱萬円也 → 金10000円也)や 1億2,300万円 のような混ざった書き方も読めます。AIエージェントからは MCP サーバー(python -m kansujiguard.server)として呼べます。
判定テスト集(126問)
変換すべき48問、変換してはいけない69問、触らないでほしい9問。出力全体の完全一致で採点します。
| 方法 | 点数 |
|---|---|
| 全部変換する素朴な方法(リポジトリ内の比較用) | 47/126(37.3%) |
| kansujiguard 0.1.0 | 126/126 |
2行目はルールとテストを一緒に作ったので、当然の数字です。外の文で正しいことの証明ではありません。自分の変換関数も python -m kansujiguard.bench --module パッケージ.モジュール:関数 で採点できます。
できないこと
- 一覧に無い地名・人名は、助数詞が続くと変換されることがあります
- 小数(三・五)と範囲(三〜五人)は扱いません
失敗する文を Issue で教えてもらえると、テスト集に足します。