Repository: DoodleBears/split-lang (language: python)

Issue:
Fix: KeyError: 'digit'
当我使用下面这个例子时，提示KeyError: 'digit'

```python
from split_lang import LangSplitter
lang_splitter = LangSplitter()
text = "2.术语和定义 2.Terms and Definitions"
substr = lang_splitter.split_by_lang(
    text=text,
)
for index, item in enumerate(substr):
    print(f"{index}|{item.lang}:{item.text}")
```


```
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
[<ipython-input-8-4b31171db2a1>](https://localhost:8080/#) in <cell line: 3>()
      1 text = "2.术语和定义 2.Terms and Definitions"
      2 lang_splitter = LangSplitter()
----> 3 substr = lang_splitter.split_by_lang(
      4     text=text,
      5 )

1 frames
[/usr/local/lib/python3.10/dist-packages/split_lang/split/splitter.py](https://localhost:8080/#) in split_by_lang(self, text)
     97         for section in sections:
     98             if section.lang_section_type == LangSectionType.ZH_JA:
---> 99                 section.substrings = self._special_merge_for_zh_ja(section.substrings)
    100 
    101         substrings: List[SubString] = []

[/usr/local/lib/python3.10/dist-packages/split_lang/split/splitter.py](https://localhost:8080/#) in _special_merge_for_zh_ja(self, substrings)
    620         for index in range(len(substrings)):
    621             current_block = substrings[index]
--> 622             substring_text_len_by_lang[current_block.lang] += current_block.length
    623             if index == 0:
    624                 if (

KeyError: 'digit'
需要在substring_text_len_by_lang中添加一个属性digit=0吗？
```
Fix: KeyError: 'digit'
当我使用下面这个例子时，提示KeyError: 'digit'

```python
from split_lang import LangSplitter
lang_splitter = LangSplitter()
text = "2.术语和定义 2.Terms and Definitions"
substr = lang_splitter.split_by_lang(
    text=text,
)
for index, item in enumerate(substr):
    print(f"{index}|{item.lang}:{item.text}")
```


```
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
[<ipython-input-8-4b31171db2a1>](https://localhost:8080/#) in <cell line: 3>()
      1 text = "2.术语和定义 2.Terms and Definitions"
      2 lang_splitter = LangSplitter()
----> 3 substr = lang_splitter.split_by_lang(
      4     text=text,
      5 )

1 frames
[/usr/local/lib/python3.10/dist-packages/split_lang/split/splitter.py](https://localhost:8080/#) in split_by_lang(self, text)
     97         for section in sections:
     98             if section.lang_section_type == LangSectionType.ZH_JA:
---> 99                 section.substrings = self._special_merge_for_zh_ja(section.substrings)
    100 
    101         substrings: List[SubString] = []

[/usr/local/lib/python3.10/dist-packages/split_lang/split/splitter.py](https://localhost:8080/#) in _special_merge_for_zh_ja(self, substrings)
    620         for index in range(len(substrings)):
    621             current_block = substrings[index]
--> 622             substring_text_len_by_lang[current_block.lang] += current_block.length
    623             if index == 0:
    624                 if (

KeyError: 'digit'
需要在substring_text_len_by_lang中添加一个属性digit=0吗？
```


Discussion / hints:

Fix patch:
diff --git a/split-lang-demo.ipynb b/split-lang-demo.ipynb
index 487d4d4..a5e3c64 100644
--- a/split-lang-demo.ipynb
+++ b/split-lang-demo.ipynb
@@ -2,7 +2,7 @@
   "cells": [
     {
       "cell_type": "code",
-      "execution_count": 7,
+      "execution_count": 1,
       "metadata": {},
       "outputs": [],
       "source": [
@@ -12,18 +12,41 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 8,
+      "execution_count": 2,
       "metadata": {},
-      "outputs": [],
+      "outputs": [
+        {
+          "name": "stderr",
+          "output_type": "stream",
+          "text": [
+            "c:\\Users\\admin\\.conda\\envs\\melotts\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+            "  from .autonotebook import tqdm as notebook_tqdm\n"
+          ]
+        }
+      ],
       "source": [
         "from split_lang import LangSplitter"
       ]
     },
     {
       "cell_type": "code",
-      "execution_count": 9,
+      "execution_count": 3,
       "metadata": {},
       "outputs": [
+        {
+          "name": "stderr",
+          "output_type": "stream",
+          "text": [
+            "Building prefix dict from c:\\Users\\admin\\.conda\\envs\\melotts\\lib\\site-packages\\wordfreq\\data\\jieba_zh.txt ...\n",
+            "2024-10-30 22:28:50,548  DEBUG [jieba]: Building prefix dict from c:\\Users\\admin\\.conda\\envs\\melotts\\lib\\site-packages\\wordfreq\\data\\jieba_zh.txt ...\n",
+            "Dumping model to file cache C:\\Users\\admin\\AppData\\Local\\Temp\\jieba.u4a100f98a875a2927980f42a20318bd7.cache\n",
+            "2024-10-30 22:28:50,626  DEBUG [jieba]: Dumping model to file cache C:\\Users\\admin\\AppData\\Local\\Temp\\jieba.u4a100f98a875a2927980f42a20318bd7.cache\n",
+            "Loading model cost 0.082 seconds.\n",
+            "2024-10-30 22:28:50,632  DEBUG [jieba]: Loading model cost 0.082 seconds.\n",
+            "Prefix dict has been built successfully.\n",
+            "2024-10-30 22:28:50,634  DEBUG [jieba]: Prefix dict has been built successfully.\n"
+          ]
+        },
         {
           "name": "stdout",
           "output_type": "stream",
@@ -46,7 +69,7 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 10,
+      "execution_count": 8,
       "metadata": {},
       "outputs": [
         {
@@ -72,8 +95,20 @@
             "4|ja:笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜\n",
             "5|de:♪」\n",
             "6|ja:そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…\n",
-            "----------------------\n",
-            "0.09549117088317871\n"
+            "----------------------\n"
+          ]
+        },
+        {
+          "ename": "KeyError",
+          "evalue": "'digit'",
+          "output_type": "error",
+          "traceback": [
+            "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+            "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
+            "Cell \u001b[1;32mIn[8], line 15\u001b[0m\n\u001b[0;32m     13\u001b[0m time1 \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m     14\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m text \u001b[38;5;129;01min\u001b[39;00m texts:\n\u001b[1;32m---> 15\u001b[0m     substr \u001b[38;5;241m=\u001b[39m \u001b[43mlang_splitter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit_by_lang\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m     16\u001b[0m \u001b[43m        \u001b[49m\u001b[43mtext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtext\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m     17\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m     18\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m index, item \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(substr):\n\u001b[0;32m     19\u001b[0m         \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mindex\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m|\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitem\u001b[38;5;241m.\u001b[39mlang\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mitem\u001b[38;5;241m.\u001b[39mtext\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n",
+            "File \u001b[1;32md:\\code\\open_source\\split-lang\\split_lang\\split\\splitter.py:99\u001b[0m, in \u001b[0;36mLangSplitter.split_by_lang\u001b[1;34m(self, text)\u001b[0m\n\u001b[0;32m     97\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m section \u001b[38;5;129;01min\u001b[39;00m sections:\n\u001b[0;32m     98\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m section\u001b[38;5;241m.\u001b[39mlang_section_type \u001b[38;5;241m==\u001b[39m LangSectionType\u001b[38;5;241m.\u001b[39mZH_JA:\n\u001b[1;32m---> 99\u001b[0m         section\u001b[38;5;241m.\u001b[39msubstrings \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_special_merge_for_zh_ja\u001b[49m\u001b[43m(\u001b[49m\u001b[43msection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubstrings\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m    101\u001b[0m substrings: List[SubString] \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m    102\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m section \u001b[38;5;129;01min\u001b[39;00m sections:\n",
+            "File \u001b[1;32md:\\code\\open_source\\split-lang\\split_lang\\split\\splitter.py:622\u001b[0m, in \u001b[0;36mLangSplitter._special_merge_for_zh_ja\u001b[1;34m(self, substrings)\u001b[0m\n\u001b[0;32m    620\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m index \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mlen\u001b[39m(substrings)):\n\u001b[0;32m    621\u001b[0m     current_block \u001b[38;5;241m=\u001b[39m substrings[index]\n\u001b[1;32m--> 622\u001b[0m     substring_text_len_by_lang[current_block\u001b[38;5;241m.\u001b[39mlang] \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m current_block\u001b[38;5;241m.\u001b[39mlength\n\u001b[0;32m    623\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m index \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m    624\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m    625\u001b[0m             substrings[index \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39mlang \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mzh\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mja\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m    626\u001b[0m             \u001b[38;5;129;01mand\u001b[39;00m substrings[index]\u001b[38;5;241m.\u001b[39mlang \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mzh\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mja\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m    627\u001b[0m             \u001b[38;5;129;01mand\u001b[39;00m substrings[index]\u001b[38;5;241m.\u001b[39mlength \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m10\u001b[39m \u001b[38;5;241m<\u001b[39m substrings[index \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39mlength\n\u001b[0;32m    628\u001b[0m         ):\n",
+            "\u001b[1;31mKeyError\u001b[0m: 'digit'"
           ]
         }
       ],
@@ -88,6 +123,7 @@
         "    \"日本語（にほんご、にっぽんご）は、日本国内や、かつての日本領だった国、そして国外移民や移住者を含む日本人同士の間で使用されている言語。日本は法令によって公用語を規定していないが、法令その他の公用文は全て日本語で記述され、各種法令において日本語を用いることが規定され、学校教育においては「国語」の教科として学習を行うなど、事実上日本国内において唯一の公用語となっている。\",\n",
         "    \"日语是日本通用语及事实上的官方语言。没有精确的日语使用人口的统计，如果计算日本人口以及居住在日本以外的日本人、日侨和日裔，日语使用者应超过一亿三千万人。\",\n",
         "    \"入学早々隣のクラスの絵奈は男子からの人気者。新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます♪」私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…\",\n",
+        "    \"2.术语和定义 2.Terms and Definitions\",\n",
         "]\n",
         "time1 = time.time()\n",
         "for text in texts:\n",
@@ -103,7 +139,7 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 11,
+      "execution_count": 5,
       "metadata": {},
       "outputs": [
         {
@@ -535,7 +571,7 @@
             "360|ja:私達３人の関係は壊れていくことにこの時は気づかなかった\n",
             "361|punctuation:…\n",
             "----------------------\n",
-            "0.08150911331176758\n"
+            "0.11106729507446289\n"
           ]
         }
       ],
@@ -555,7 +591,7 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 12,
+      "execution_count": 6,
       "metadata": {},
       "outputs": [
         {
@@ -585,7 +621,7 @@
     },
     {
       "cell_type": "code",
-      "execution_count": 14,
+      "execution_count": 7,
       "metadata": {},
       "outputs": [
         {
@@ -607,7 +643,7 @@
         "        text=text,\n",
         "    )\n",
         "    for index, item in enumerate(substr):\n",
-        "        print(f\"{index}|{item.lang}:{item.text}\")\n"
+        "        print(f\"{index}|{item.lang}:{item.text}\")"
       ]
     }
   ],
diff --git a/split_lang/split/splitter.py b/split_lang/split/splitter.py
index 7c2d0ef..1b2b8c8 100644
--- a/split_lang/split/splitter.py
+++ b/split_lang/split/splitter.py
@@ -615,6 +615,7 @@ def _special_merge_for_zh_ja(
             "zh": 0,
             "ja": 0,
             "x": 0,
+            "digit": 0,
             "punctuation": 0,
         }
         for index in range(len(substrings)):
@@ -854,6 +855,8 @@ def _merge_substrings_across_digit_based_on_sections(
             if index >= len(sections):
                 break
 
+            print(f"测试：{sections[index].lang_section_type}")
+
             prev_section = new_sections[-1]
             current_section = sections[index]
             # 如果前一个 section 和当前的 section 类型不同，则合并
@@ -861,7 +864,16 @@ def _merge_substrings_across_digit_based_on_sections(
                 if prev_section.lang_section_type == LangSectionType.DIGIT:
                     prev_section.lang_section_type = current_section.lang_section_type
                     prev_section.text += current_section.text
-                    prev_section.substrings.extend(current_section.substrings)
+                    prev_section.substrings[-1].text += current_section.substrings[
+                        0
+                    ].text
+                    prev_section.substrings[-1].length += current_section.substrings[
+                        0
+                    ].length
+                    prev_section.substrings[-1].lang = current_section.substrings[
+                        0
+                    ].lang
+                    prev_section.substrings.extend(current_section.substrings[1:])
                     for index, substr in enumerate(prev_section.substrings):
                         if index == 0:
                             continue


Test patch:
diff --git a/tests/test_split.py b/tests/test_split.py
index 53ce5ba..d9ad7bf 100644
--- a/tests/test_split.py
+++ b/tests/test_split.py
@@ -116,6 +116,7 @@
     "入学早々隣のクラスの絵奈は男子からの人気者。新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます♪」私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…",
     "衬衫的价格是9.15便士",
     "I have 10 €",
+    "2.术语和定义 2.Terms and Definitions",
 ]
 
 lang_splitter = LangSplitter(log_level=logging.DEBUG)
@@ -163,7 +164,7 @@ def test_split_step_by_step():
 
 def test_split():
     print("===========test_split===========")
-    lang_splitter.merge_across_digit = False
+    lang_splitter.merge_across_digit = True
     # lang_splitter.not_merge_punctuation = ["。"]
     for text in texts:
         substrings = lang_splitter.split_by_lang(text=text)