世の中には数字を漢数字で出力してくるサービスがまあまあ有りまして、(Amaz○n Transcribeっていうんですけど)
例えば「1972年」などは、「千九百七十二年」などと出力してきます。
また別のシステムでは「一九七二年」などと表示してきます。
見栄えが悪いので、一律半角数字にしたいです。
調べたところ、kanjizeというライブラリが有りました!
とてもよいライブラリですが、
テキストをまるっと投げると、当然ながらエラーになってしまいます。
>>> kanji2number('千九百七十二')
1972
>>> kanji2number('千九百七十二年')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 166, in kanji2number
result = _kanji2number(given, kanjis)[0]
File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 196, in _kanji2number
fraction = parse_short(kanjis)
File "/home/eievui/anaconda3/lib/python3.7/site-packages/kanjize/kanjize.py", line 220, in parse_short
raise ValueError(f"Kanji `{kanji}` seems to be invalid.")
ValueError: Kanji `千九百七十二年` seems to be invalid.
結局のところ、今回の用途「漢数字を含むテキストの漢数字部分だけをまるっと半角数字にしたい」を達成するためには、
自分でどこからどこまでが漢数字であるかを見つける必要がありました。
そんな経緯で、ゴリッとスクリプト実装した次第です。
import kanjize
kanji_nums = '〇一二三四五六七八九' # 零はTranscribe結果で出てきた気がするけど一旦除外する
kanji_units1 = '千百十' # 前に1〜9がなくても数字に変換する単位
kanji_units2 = '京兆億万' # 数字に変換する際、必ず前に1〜9がある
def myk2i(text):
conv_text = ""
kanji_num_list = [c in kanji_nums for c in text]
kanji_unit1_list = [c in kanji_units1 for c in text]
kanji_unit2_list = [c in kanji_units2 for c in text]
begin_index = -1
end_index = -1
for i in range(len(text)):
if (begin_index < 0):
# 漢数字beginサーチ
if (kanji_num_list[i] or kanji_unit1_list[i]):
begin_index = i
else:
# 漢数字endサーチ
if (not(kanji_num_list[i]) and
not(kanji_unit1_list[i]) and
not(kanji_unit2_list[i])):
end_index = i
# 特殊対応。サーチ中に末尾に到達したケース
is_text_end = (i == (len(text)-1))
if (begin_index >= 0) and is_text_end:
end_index = i + 1
# コピー
if (begin_index >= 0):
if (end_index >= begin_index):
# 漢数字を数字に変換してコピー
conv_text += str(kanjize.kanji2number(text[begin_index:end_index]))
if (not(is_text_end)):
# 判定で見つかった漢数字ではない部分もコピーする
# テキスト末尾が数字の場合は変換してコピー済みだからこの箇所は遠さない。
conv_text += text[i]
# サーチリセット
begin_index = -1
end_index = -1
else:
# サーチ中なのでコピーしない
pass
else:
# 今の文字をそのままコピーする
conv_text += text[i]
return conv_text
動かしてみる
>>> print(myk2i("千九百七十二年一一月九日はジャコビニ彗星の一ヶ月後です"))
1972年11月9日はジャコビニ彗星の1ヶ月後です
やりました。テキストをまるっと投げ込むことができました!