JP Kansuji Guard
Turn kanji numerals in Japanese text into digits (三億五千万円 → 350000000円) without breaking names, places and idioms (一宮市, 五十嵐, 三菱, 一石二鳥 stay as they are).
A numeral normalizer that converts every kanji numeral also converts the ones inside proper nouns and words: 一宮市 becomes 1宮市, 統一 becomes 統1. Search indexes, RAG chunks and extracted fields then carry the damage. One normalizer's own documentation warns that a name like 加藤一二三 can be misconverted (jpnorm).
This package converts a numeral only where the text says it is a number:
- it is followed by a unit or counter (
円,人,年,条,階,%, …), or it is a万/億/兆amount - it is not part of a known name, place, company, word or idiom (252 entries, hand-written)
- if the meaning depends on the reading (
十分= "enough" or "10 minutes",一時,一番,二三人= "2 or 3 people") or the amount is approximate (数万円), the text is kept and the span is returned inflags
It also reads formal numerals (金壱萬円也 → 金10000円也) and mixed forms (1億2,300万円 → 123000000円).
Python standard library only. No network. MIT.
Bench
data/kansuji_guard_bench_v1.jsonl has 126 cases: 48 to convert, 69 to keep (places, names, companies, words, idioms) and 9 ambiguous spans to leave alone. Scoring is exact match of the whole output.
| Converter | Score | Convert | Keep | Ambiguous |
|---|---|---|---|---|
| naive baseline in this repo (convert every numeral) | 47/126 (37.3%) | 44/48 | 2/69 | 1/9 |
| kansujiguard 0.1.0 | 126/126 (100%) | 48/48 | 69/69 | 9/9 |
Read the second row with care: the rules and the cases were written together, so 100% here says the rules match this bench, not that they are complete. New failing cases are the most useful contribution (open an issue with the sentence and the output you expected).
Score your own converter (a function str -> str):
python -m kansujiguard.bench --module yourpkg.yourmodule:convert
Use
python -m kansujiguard notes.txt # converted text to stdout, flags to stderr
python -m kansujiguard notes.txt --json # {"text", "changes", "kept", "flags"}
from kansujiguard import convert, parse_number
convert("三菱の売上は三億円、十分な利益")["text"]
# '三菱の売上は300000000円、十分な利益' (十分 is flagged, not converted)
parse_number("1億2,300万")
# 123000000
As an MCP server (for AI agents)
{"mcpServers": {"jp-kansuji-guard": {"command": "python", "args": ["-m", "kansujiguard.server"], "cwd": "/path/to/jp-kansuji-guard"}}}
| Tool | Input | Returns |
|---|---|---|
jp_kansuji_convert |
text |
text, changes (start/end/before/after/value/reason), kept, flags |
jp_kansuji_parse |
numeral |
value (int) or null with error |
Both tools are read-only.
Limits
- The word list is hand-written. Names and places not on it can still be converted when a counter follows them
- Decimals (
三・五,三点五) and ranges (三〜五人) are not converted - Output digits have no thousands separators
- Tests:
python -m unittest discover -s tests(13 tests)
日本語
文中の漢数字を数字に直します。ただし、単位・助数詞が続くときや 万/億/兆 の金額など、数だと分かる所だけ。地名・人名・社名・熟語(一宮市・五十嵐・三菱・統一・一石二鳥)は直しません。読み方で意味が変わるもの(十分・一時・一番・二三人)やおおよその数(数万円)は直さずに flags で知らせます。
- 大字(壱・弐・参・拾・萬)、全角数字、
1億2,300万のような混ざった書き方にも対応 - 判定テスト集126問つき。自分の変換関数も採点できます
- 外部通信なし・Python標準ライブラリのみ・MIT。AIエージェントからは MCP サーバー(
python -m kansujiguard.server)で使えます
Metadata
Release files for jp-kansuji-guard 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| jp_kansuji_guard-0.1.0.tar.gz | 16.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jp_kansuji_guard-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.9 kB
Release files / jp_kansuji_guard-0.1.0.tar.gz
| Download URL | jp_kansuji_guard-0.1.0.tar.gz |
|---|---|
| Size | 16.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a28a2ae568640a882d8d6cf68f0e626dd3b8fc823e849037250dd5f6e3ad695f
|
|
BLAKE2b-256 checksum How to use checksums |
003f1f926730e32ec2d6f5227e940860e4ed214af1fa59e277689ea60f3d48b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / jp_kansuji_guard-0.1.0-py3-none-any.whl
| Download URL | jp_kansuji_guard-0.1.0-py3-none-any.whl |
|---|---|
| Size | 17.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8e2f8d44ab11c54712743fd2042341cef77613f6eca7a7070f95a8236cfeca34
|
|
BLAKE2b-256 checksum How to use checksums |
88ed9ad9db75e96b8aad97571fbfad0064c66565c24e2c767970a7beb70dc137
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Security for jp-kansuji-guard 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.