LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

漢数字を含むテキストの漢数字部分を半角数字に変換するPythonスクリプト

Posted at

世の中には数字を漢数字で出力してくるサービスがまあまあ有りまして、(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ヶ月後です

やりました。テキストをまるっと投げ込むことができました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0