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

Issue:
v2.0: cover all split situation including long text and short
# Issue
- current code is so bad that improve some part of splitting logic will leads to long text situation ends up better while the other situation becomes worse

# Method

## Add more test data
- wiki
- article
- novel
- sns post

## logging every splitting step
- pre split
- ...

## Improve based on language set
- usually Chinese and Japanese is hard to be split while Chinese and English, Chinese and Korean can be easily split
	- For these cases, apply specific splitting logic for each language set




Discussion / hints:

Fix patch:
diff --git a/split-lang-demo.ipynb b/split-lang-demo.ipynb
index e72bc49..4b3d899 100644
--- a/split-lang-demo.ipynb
+++ b/split-lang-demo.ipynb
@@ -12,9 +12,18 @@
     },
     {
       "cell_type": "code",
-      "execution_count": null,
+      "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\n",
         "\n",
@@ -23,9 +32,31 @@
     },
     {
       "cell_type": "code",
-      "execution_count": null,
+      "execution_count": 3,
       "metadata": {},
-      "outputs": [],
+      "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-17 07:46:45,873  DEBUG [jieba]: Building prefix dict from c:\\Users\\admin\\.conda\\envs\\melotts\\lib\\site-packages\\wordfreq\\data\\jieba_zh.txt ...\n",
+            "Loading model from cache C:\\Users\\admin\\AppData\\Local\\Temp\\jieba.u4a100f98a875a2927980f42a20318bd7.cache\n",
+            "2024-10-17 07:46:45,874  DEBUG [jieba]: Loading model from cache C:\\Users\\admin\\AppData\\Local\\Temp\\jieba.u4a100f98a875a2927980f42a20318bd7.cache\n",
+            "Loading model cost 0.044 seconds.\n",
+            "2024-10-17 07:46:45,918  DEBUG [jieba]: Loading model cost 0.044 seconds.\n",
+            "Prefix dict has been built successfully.\n",
+            "2024-10-17 07:46:45,919  DEBUG [jieba]: Prefix dict has been built successfully.\n"
+          ]
+        },
+        {
+          "name": "stdout",
+          "output_type": "stream",
+          "text": [
+            "0|zh:你喜欢看アニメ吗\n"
+          ]
+        }
+      ],
       "source": [
         "text = \"你喜欢看アニメ吗\"\n",
         "\n",
@@ -38,9 +69,29 @@
     },
     {
       "cell_type": "code",
-      "execution_count": null,
+      "execution_count": 4,
       "metadata": {},
-      "outputs": [],
+      "outputs": [
+        {
+          "name": "stdout",
+          "output_type": "stream",
+          "text": [
+            "0|zh:你喜欢看アニメ吗？我也喜欢看\n",
+            "----------------------\n",
+            "0|en:Please star this project on GitHub, Thanks you. I love you\n",
+            "1|zh:请加星这个项目，谢谢你。我爱你\n",
+            "2|ja:この項目をスターしてください、ありがとうございます！愛してる\n",
+            "----------------------\n",
+            "0|ja:日本語（にほんご、にっぽんご）は、日本国内や、かつての日本領だった国、そして国外移民や移住者を含む日本人同士の間で使用されている言語。日本は法令によって公用語を規定していないが、法令その他の公用文は全て日本語で記述され、各種法令において日本語を用いることが規定され、学校教育においては「国語」の教科として学習を行うなど、事実上日本国内において唯一の公用語となっている。\n",
+            "----------------------\n",
+            "0|zh:日语是日本通用语及事实上的官方语言。没有精确的日语使用人口的统计，如果计算日本人口以及居住在日本以外的日本人、日侨和日裔，日语使用者应超过一亿三千万人。\n",
+            "----------------------\n",
+            "0|ja:入学早々隣のクラスの絵奈は男子からの人気者。新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます♪」私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます♪」私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…\n",
+            "----------------------\n",
+            "0.0899801254272461\n"
+          ]
+        }
+      ],
       "source": [
         "lang_splitter.merge_across_punctuation = True\n",
         "import time\n",
@@ -66,9 +117,82 @@
     },
     {
       "cell_type": "code",
-      "execution_count": null,
+      "execution_count": 5,
       "metadata": {},
-      "outputs": [],
+      "outputs": [
+        {
+          "name": "stdout",
+          "output_type": "stream",
+          "text": [
+            "0|zh:你喜欢看アニメ吗？我也喜欢看\n",
+            "----------------------\n",
+            "0|en:Please star this project on \n",
+            "1|x:GitHub\n",
+            "2|punctuation:, \n",
+            "3|en:Thanks you. I love you\n",
+            "4|zh:请加星这个项目，谢谢你。我爱你\n",
+            "5|ja:この項目をスターしてください、ありがとうございます！愛してる\n",
+            "----------------------\n",
+            "0|ja:日本語（にほんご、にっぽんご）は、日本国内や、かつての日本領だった国、そして国外移民や移住者を含む日本人同士の間で使用されている言語。日本は法令によって公用語を規定していないが、法令その他の公用文は全て日本語で記述され、各種法令において日本語を用いることが規定され、学校教育においては「国語」の教科として学習を行うなど、事実上日本国内において唯一の公用語となっている\n",
+            "1|punctuation:。\n",
+            "----------------------\n",
+            "0|zh:日语是日本通用语及事实上的官方语言。没有精确的日语使用人口的统计，如果计算日本人口以及居住在日本以外的日本人、日侨和日裔，日语使用者应超过一亿三千万人\n",
+            "1|punctuation:。\n",
+            "----------------------\n",
+            "0|x:入学早々隣のクラスの絵奈は男子からの人気者\n",
+            "1|punctuation:。\n",
+            "2|ja:新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　\n",
+            "3|zh:和樹\n",
+            "4|punctuation:（\n",
+            "5|ja:さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます\n",
+            "6|de:♪\n",
+            "7|punctuation:」\n",
+            "8|ja:私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと\n",
+            "9|punctuation:（\n",
+            "10|de:汗\n",
+            "11|punctuation:）\n",
+            "12|ja:充分間に合うからねってママ言ってるじゃん\n",
+            "13|punctuation:（\n",
+            "14|de:汗\n",
+            "15|punctuation:）\n",
+            "16|ja:んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ\n",
+            "17|punctuation:（\n",
+            "18|de:汗\n",
+            "19|punctuation:）」「\n",
+            "20|ja:は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ\n",
+            "21|punctuation:（\n",
+            "22|de:汗\n",
+            "23|punctuation:）\n",
+            "24|ja:絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ\n",
+            "25|punctuation:（\n",
+            "26|de:汗\n",
+            "27|punctuation:）\n",
+            "28|ja:ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ\n",
+            "29|de:♪\n",
+            "30|punctuation:（\n",
+            "31|ja:笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅紗羅。おーい」って言っているのに気づく。（んおーい」って言っているのに気づく。（ん\n",
+            "32|punctuation:？\n",
+            "33|zh:何\n",
+            "34|punctuation:？\n",
+            "35|ja:教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ\n",
+            "36|punctuation:（\n",
+            "37|de:汗\n",
+            "38|punctuation:）\n",
+            "39|ja:紗羅\n",
+            "40|punctuation:（\n",
+            "41|de:汗\n",
+            "42|punctuation:）」\n",
+            "43|ja:また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その\n",
+            "44|punctuation:、\n",
+            "45|zh:先生\n",
+            "46|punctuation:。\n",
+            "47|ja:絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった\n",
+            "48|punctuation:…\n",
+            "----------------------\n",
+            "0.07841658592224121\n"
+          ]
+        }
+      ],
       "source": [
         "lang_splitter.merge_across_punctuation = False\n",
         "time1 = time.time()\n",
@@ -85,9 +209,17 @@
     },
     {
       "cell_type": "code",
-      "execution_count": null,
+      "execution_count": 6,
       "metadata": {},
-      "outputs": [],
+      "outputs": [
+        {
+          "name": "stdout",
+          "output_type": "stream",
+          "text": [
+            "0|zh:衬衫的价格是9.15便士\n"
+          ]
+        }
+      ],
       "source": [
         "lang_splitter.merge_across_digit = False\n",
         "texts = [\n",
diff --git a/split_lang/config.py b/split_lang/config.py
index cdf312a..181c643 100644
--- a/split_lang/config.py
+++ b/split_lang/config.py
@@ -11,4 +11,19 @@
     "en": "en",
     "hr": "en",
 }
+ZH_JA_LANG_MAP = {
+    "zh": "zh",
+    "yue": "zh",  # 粤语
+    "wuu": "zh",  # 吴语
+    "zh-cn": "zh",
+    "zh-tw": "x",
+    "ja": "ja",
+}
+NO_ZH_JA_LANG_MAP = {
+    "de": "de",
+    "fr": "fr",
+    "en": "en",
+    "hr": "en",
+}
+
 DEFAULT_LANG = "x"
diff --git a/split_lang/detect_lang/detector.py b/split_lang/detect_lang/detector.py
index cc9f850..ce4c237 100644
--- a/split_lang/detect_lang/detector.py
+++ b/split_lang/detect_lang/detector.py
@@ -5,7 +5,7 @@
 from wordfreq import word_frequency
 
 from ..model import LangSectionType
-from ..split.utils import contains_ja
+from ..split.utils import contains_ja_kana
 
 logger = logging.getLogger(__name__)
 
@@ -19,7 +19,7 @@ def fast_lang_detect(text: str) -> str:
 # For example '衬衫' cannot be detected by `langdetect`, and `fast_langdetect` will detect it as 'en'
 def detect_lang_combined(text: str, lang_section_type: LangSectionType) -> str:
     if lang_section_type is LangSectionType.ZH_JA:
-        if contains_ja(text):
+        if contains_ja_kana(text):
             return "ja"
         return fast_lang_detect(text)
     return fast_lang_detect(text)
diff --git a/split_lang/model.py b/split_lang/model.py
index cd474ea..f971db4 100644
--- a/split_lang/model.py
+++ b/split_lang/model.py
@@ -23,10 +23,6 @@ class SubString(BaseModel):
     """index of `text` of original string"""
     length: int
     """length of `text`"""
-    is_punctuation: bool
-    """if `text` is punctuation"""
-    is_digit: bool
-    """if `text` is punctuation"""
 
 
 class SubStringSection(BaseModel):
diff --git a/split_lang/split/__init__.py b/split_lang/split/__init__.py
index 8210e04..696f967 100644
--- a/split_lang/split/__init__.py
+++ b/split_lang/split/__init__.py
@@ -1,2 +1,2 @@
 from .splitter import LangSplitter
-from .utils import PUNCTUATION, contains_hangul, contains_zh_ja, contains_ja
+from .utils import PUNCTUATION, contains_hangul, contains_ja_kana, contains_zh_ja
diff --git a/split_lang/split/splitter.py b/split_lang/split/splitter.py
index 5b204c4..9475dae 100644
--- a/split_lang/split/splitter.py
+++ b/split_lang/split/splitter.py
@@ -6,34 +6,30 @@
 zh_budoux_parser = budoux.load_default_simplified_chinese_parser()
 jp_budoux_parser = budoux.load_default_japanese_parser()
 
-from ..config import DEFAULT_LANG, DEFAULT_LANG_MAP
+from ..config import DEFAULT_LANG, DEFAULT_LANG_MAP, NO_ZH_JA_LANG_MAP, ZH_JA_LANG_MAP
 from ..detect_lang.detector import (
     detect_lang_combined,
     is_word_freq_higher_in_lang_b,
     possible_detection_list,
 )
 from ..model import LangSectionType, SubString, SubStringSection
-from .utils import PUNCTUATION, contains_hangul, contains_ja, contains_zh_ja
+from .utils import PUNCTUATION, contains_hangul, contains_ja_kana, contains_zh_ja
 
-logging.basicConfig(
-    level=logging.WARNING,
-    format="%(asctime)s  %(levelname)s [%(name)s]: %(message)s",
-)
 logger = logging.getLogger(__name__)
 
 
 class LangSplitter:
     def __init__(
         self,
-        lang_map: Dict = None,
+        lang_map: Dict[str, str] = DEFAULT_LANG_MAP,
         default_lang: str = DEFAULT_LANG,
         punctuation: str = PUNCTUATION,
-        not_merge_punctuation: str = "\n",
-        special_merge_for_zh_ja: bool = True,
+        not_merge_punctuation: str = "",
         merge_across_punctuation: bool = True,
-        merge_across_newline: bool = True,
         merge_across_digit: bool = True,
-        debug: bool = False,
+        merge_across_newline: bool = True,
+        debug: bool = True,
+        log_level: int = logging.INFO,
     ) -> None:
         """
         1. pre-split stage will use `punctuation` and `digit` to split text then leave substring that contains language character
@@ -49,15 +45,19 @@ def __init__(
             merge_across_digit (bool, optional): merge substring across number (e.g. `233`, `9.15`) will be concat to near substring. Defaults to True.
             debug (bool, optional): print process for debug. Defaults to False.
         """
-        self.lang_map = lang_map if lang_map is not None else DEFAULT_LANG_MAP
+        self.lang_map = lang_map
         self.default_lang = default_lang
         self.debug = debug
         self.punctuation = punctuation
         self.not_merge_punctuation = not_merge_punctuation
-        self.merge_across_newline = merge_across_newline
-        self.special_merge_for_zh_ja = special_merge_for_zh_ja
         self.merge_across_punctuation = merge_across_punctuation
         self.merge_across_digit = merge_across_digit
+        self.merge_across_newline = merge_across_newline
+        self.log_level = log_level
+        logging.basicConfig(
+            level=self.log_level,
+            format="%(asctime)s  %(levelname)s [%(name)s]: %(message)s",
+        )
 
     # MARK: split_by_lang
     def split_by_lang(
@@ -65,10 +65,6 @@ def split_by_lang(
         text: str,
     ) -> List[SubString]:
         """
-        1. pre-split stage will use `punctuation` and `digit` to split text then leave substring that contains language character
-        2. rule-based and machine learning model will be used for extract words from substring
-        3. if language detection of words are same, concat the words into a new substring
-
         Args:
             text (str): text to split
 
@@ -76,60 +72,116 @@ def split_by_lang(
             List[SubString]: which contains language, text, index, length, is_punctuation and is_digit data of substring text
         """
 
-        sections = self._split(text=text)
-        substrings: List[SubString] = []
-        for section in sections:
-            substrings.extend(section.substrings)
-        substrings = self._merge_digit(substrings=substrings)
+        pre_split_section = self.pre_split(text=text)
 
-        if self.merge_across_newline:
-            substrings = self._merge_substrings_across_newline(
-                substrings=substrings,
+        sections = self._split(pre_split_section=pre_split_section)
+
+        if self.merge_across_punctuation:  # 合并跨标点符号的 SubString
+            sections = self._merge_substrings_across_punctuation_based_on_sections(
+                sections=sections
             )
-        if self.merge_across_digit:
-            substrings = self._merge_substring_across_digit(substrings=substrings)
+            # sections = self._smart_merge_all(pre_split_section=pre_split_section)
 
-        if self.merge_across_punctuation:
-            substrings = self._merge_substrings_across_punctuation(
-                substrings=substrings,
+        if self.merge_across_digit:  # 合并跨数字的 SubString
+            sections = self._merge_substrings_across_digit_based_on_sections(
+                sections=sections
             )
+            # sections = self._smart_merge_all(pre_split_section=pre_split_section)
+
         if self.merge_across_newline:
-            substrings = self._merge_substrings_across_newline(
-                substrings=substrings,
+            sections = self._merge_substrings_across_newline_based_on_sections(
+                sections=sections
             )
+            # sections = self._smart_merge_all(pre_split_section=pre_split_section)
 
-        substrings = self._merge_middle_substr_to_two_side(substrings)
-        substrings = self._merge_substrings(substrings)
-
-        if self.special_merge_for_zh_ja:
-            substrings = self._special_merge_for_zh_ja(substrings=substrings)
-            substrings = self._special_merge_for_zh_ja(substrings=substrings)
+        substrings: List[SubString] = []
+        for section in sections:
+            substrings.extend(section.substrings)
 
         return substrings
 
-    # MARK: _split
-    def _split(
-        self,
-        text: str,
-    ) -> List[SubStringSection]:
-        # MARK: pre split by languages
+    # MARK: pre_split
+    def pre_split(self, text: str) -> List[SubStringSection]:
         # NOTE: since some language share some characters (e.g. Chinese and Japanese)
         # NOTE: while Korean has their own characters,
         # NOTE: For Cyrillic alphabet, Latin alphabet, a lot of languages share the alphabet
-        pre_split_section = self._pre_split(text=text)
+        text = text.strip()
         if self.debug:
-            logger.info("---------pre_split_section:")
-            for section in pre_split_section:
-                logger.info(section)
+            logger.debug("---------before pre_split:")
+            logger.debug(text)
+        sections: List[SubStringSection] = []
+        current_lang: LangSectionType = LangSectionType.OTHERS
+        current_text = []
+
+        def add_substring(lang_section_type: LangSectionType):
+            if current_text:
+                concat_text = "".join(current_text)
+
+                sections.append(
+                    SubStringSection(
+                        lang_section_type=lang_section_type,
+                        text=concat_text,
+                        substrings=[],
+                    )
+                )
+                current_text.clear()
+
+        for index, char in enumerate(text):
+            if contains_zh_ja(char):
+                if current_lang != LangSectionType.ZH_JA:
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.ZH_JA
+            elif contains_hangul(char):
+                if current_lang != LangSectionType.KO:
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.KO
+            elif char.isdigit():
+                if current_lang != LangSectionType.DIGIT:
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.DIGIT
+            elif char in self.punctuation:
+                if char == "'" and index > 0 and text[index - 1].isspace() is False:
+                    # For English, "'" is a part of word
+                    pass
+                # elif current_lang != LangSectionType.PUNCTUATION:
+                else:
+                    # [, ] \n .都会单独作为一个 SubString
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.PUNCTUATION
+            elif char.isspace():
+                # concat space to current text
+                if char == "\n":
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.NEWLINE
+                else:
+                    pass
+            else:
+                if current_lang != LangSectionType.OTHERS:
+                    add_substring(current_lang)
+                    current_lang = LangSectionType.OTHERS
+
+            current_text.append(char)
+
+        add_substring(current_lang)
+        if self.debug:
+            logger.debug("---------after pre_split:")
+            for section in sections:
+                logger.debug(section)
+        return sections
 
+    # MARK: _split
+    def _split(
+        self,
+        pre_split_section: List[SubStringSection],
+    ) -> List[SubStringSection]:
+        # TODO: 针对不同语言 set 进行不同处理
         section_index = 0
         for section in pre_split_section:
             section_len = len(section.text)
             if section.lang_section_type is LangSectionType.PUNCTUATION:
+                # NOTE: 标点符号作为单独的 SubString
                 section.substrings.append(
                     SubString(
-                        is_digit=False,
-                        is_punctuation=True,
                         text=section.text,
                         lang="punctuation",
                         index=section_index,
@@ -137,10 +189,9 @@ def _split(
                     )
                 )
             elif section.lang_section_type is LangSectionType.DIGIT:
+                # NOTE: 数字作为单独的 SubString
                 section.substrings.append(
                     SubString(
-                        is_digit=True,
-                        is_punctuation=False,
                         text=section.text,
                         lang="digit",
                         index=section_index,
@@ -148,10 +199,9 @@ def _split(
                     )
                 )
             elif section.lang_section_type is LangSectionType.NEWLINE:
+                # NOTE: 换行作为单独的 SubString
                 section.substrings.append(
                     SubString(
-                        is_digit=False,
-                        is_punctuation=False,
                         text=section.text,
                         lang="newline",
                         index=section_index,
@@ -159,35 +209,55 @@ def _split(
                     )
                 )
             else:
-                substrings: List[str] = []
-                lang_section_type = LangSectionType.OTHERS
-                if section.lang_section_type is LangSectionType.OTHERS:
-                    substrings = self._parse_without_zh_ja(section.text)
+                substrings_with_lang: List[SubString] = []
+                if section.lang_section_type is LangSectionType.ZH_JA:
+                    temp_substrings = self._parse_zh_ja(section.text)
+                    substrings_with_lang = self._init_substr_lang(
+                        texts=temp_substrings,
+                        lang_map=ZH_JA_LANG_MAP,
+                        lang_section_type=LangSectionType.ZH_JA,
+                    )
+
                 elif section.lang_section_type is LangSectionType.KO:
-                    substrings = [section.text]
-                    lang_section_type = LangSectionType.KO
-                elif section.lang_section_type is LangSectionType.ZH_JA:
-                    substrings = self._parse_zh_ja(section.text)
-                    lang_section_type = LangSectionType.ZH_JA
-
-                substrings_with_lang = self._init_substr_lang(
-                    texts=substrings,
-                    lang_section_type=lang_section_type,
-                )
+                    substrings_with_lang = [
+                        SubString(
+                            text=section.text,
+                            lang="ko",
+                            index=section_index,
+                            length=section_len,
+                        )
+                    ]
+
+                else:
+                    temp_substrings = self._parse_without_zh_ja(section.text)
+                    substrings_with_lang = self._init_substr_lang(
+                        texts=temp_substrings,
+                        lang_section_type=LangSectionType.OTHERS,
+                    )
+                # 更新 index
                 for substr in substrings_with_lang:
                     substr.index += section_index
+                if self.debug:
+                    logger.debug("---------after _init_substr_lang:")
+                    for substr in substrings_with_lang:
+                        logger.debug(substr)
+
                 section.substrings = substrings_with_lang
 
             section_index += section_len
 
+        pre_split_section = self._smart_merge_all(pre_split_section)
         if self.debug:
-            logger.info("---------_init_substr_lang")
+            logger.debug("---------after split:")
             for section in pre_split_section:
-                logger.info(section)
+                logger.debug(section)
+
+        return pre_split_section
 
         # MARK: smart merge substring together
-        wtpsplit_section = pre_split_section
-        for section in wtpsplit_section:
+
+    def _smart_merge_all(self, pre_split_section: List[SubStringSection]):
+        for section in pre_split_section:
             if (
                 section.lang_section_type is LangSectionType.PUNCTUATION
                 or section.lang_section_type is LangSectionType.NEWLINE
@@ -200,11 +270,8 @@ def _split(
             )
             section.substrings.clear()
             section.substrings = smart_concat_result
-        if self.debug:
-            logger.info("---------smart_concat_result")
-            for section in wtpsplit_section:
-                logger.info(section)
-        return wtpsplit_section
+
+        return pre_split_section
 
     # MARK: _parse_without_zh_ja
     def _parse_without_zh_ja(self, text: str):
@@ -230,19 +297,25 @@ def _parse_without_zh_ja(self, text: str):
     def _parse_zh_ja(self, text) -> List[str]:
         splitted_texts_jp = []
         splitted_texts_jp = jp_budoux_parser.parse(text)
+        if self.debug:
+            logger.debug("---------after jp_budoux_parser:")
+            logger.debug(splitted_texts_jp)
 
         splitted_texts_zh_jp = []
         for substring in splitted_texts_jp:
             splitted_texts_zh_jp.extend(zh_budoux_parser.parse(substring))
+        if self.debug:
+            logger.debug("---------after zh_budoux_parser:")
+            logger.debug(splitted_texts_zh_jp)
 
         new_substrings = [splitted_texts_zh_jp[0]]
         for substring in splitted_texts_zh_jp[1:]:
-            is_left_ja = contains_ja(new_substrings[-1])
-            is_cur_ja = contains_ja(substring)
-            is_both_same_lang = is_left_ja == is_cur_ja
-            is_both_ja = is_left_ja is True and is_both_same_lang
-            is_both_zh = is_left_ja is False and is_both_same_lang
-            if is_both_ja:  # both substring is katakana or hiragana, then concat
+            is_left_ja_kana = contains_ja_kana(new_substrings[-1])
+            is_cur_ja_kana = contains_ja_kana(substring)
+            is_both_same_lang = is_left_ja_kana == is_cur_ja_kana
+            is_both_ja_kana = is_left_ja_kana is True and is_both_same_lang
+            is_both_zh = is_left_ja_kana is False and is_both_same_lang
+            if is_both_ja_kana:  # both substring is katakana or hiragana, then concat
                 new_substrings[-1] += substring
             elif is_both_zh and len(substring) == 1:
                 # NOTE: both substring is full Chinese character, and current one is only one character
@@ -257,127 +330,46 @@ def _parse_zh_ja(self, text) -> List[str]:
             new_substrings[1] = new_substrings[0] + new_substrings[1]
             new_substrings = new_substrings[1:]
 
-        return new_substrings
-
-    # MARK: _pre_split
-    def _pre_split(self, text: str) -> List[SubStringSection]:
-        sections = []
-        current_lang: LangSectionType = LangSectionType.OTHERS
-        current_text = []
-
-        def add_substring(lang_section_type: LangSectionType):
-            if current_text:
-                concat_text = "".join(current_text)
-
-                sections.append(
-                    SubStringSection(
-                        lang_section_type=lang_section_type,
-                        text=concat_text,
-                        substrings=[],
-                    )
-                )
-                current_text.clear()
-
-        for index, char in enumerate(text):
-            is_space = char.isspace()
-
-            if is_space is False:  # Exclude newlines from processing
-                if contains_zh_ja(char):
-                    if current_lang != LangSectionType.ZH_JA:
-                        add_substring(current_lang)
-                        current_lang = LangSectionType.ZH_JA
-                elif contains_hangul(char):
-                    if current_lang != LangSectionType.KO:
-                        add_substring(current_lang)
-                        current_lang = LangSectionType.KO
-                elif char.isdigit():
-                    if current_lang != LangSectionType.DIGIT:
-                        add_substring(current_lang)
-                        current_lang = LangSectionType.DIGIT
-                elif char in self.punctuation:
-                    if char == "'" and index > 0 and text[index - 1].isspace() is False:
-                        pass
-                    else:
-                        add_substring(current_lang)
-                        current_lang = LangSectionType.PUNCTUATION
-                else:
-                    if current_lang != LangSectionType.OTHERS:
-                        add_substring(current_lang)
-                        current_lang = LangSectionType.OTHERS
-            else:
-                if current_lang != LangSectionType.NEWLINE:
-                    # print(f"detect newline {char}")
-                    add_substring(current_lang)
-                    current_lang = LangSectionType.NEWLINE
-
-            current_text.append(char)
+        if self.debug:
+            logger.debug("---------after parse_zh_ja:")
+            logger.debug(new_substrings)
 
-        add_substring(current_lang)
-        return sections
+        return new_substrings
 
     # MARK: _smart_merge
     def _smart_merge(
         self,
         substr_list: List[SubString],
         lang_section_type: LangSectionType,
-    ):
-        substr_list = self._smart_concat_logic(
-            substr_list,
+    ) -> List[SubString]:
+        lang_text_list = substr_list
+        lang_text_list = self._merge_substrings(lang_text_list)
+        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
+        lang_text_list = self._merge_substrings(lang_text_list)
+        # NOTE: get_languages 需要根据不同语言进行不同处理
+        lang_text_list = self._get_languages(
+            lang_text_list=lang_text_list,
             lang_section_type=lang_section_type,
+            lang_map=ZH_JA_LANG_MAP
+            if lang_section_type is LangSectionType.ZH_JA
+            else NO_ZH_JA_LANG_MAP,
         )
-        return substr_list
-
-    # MARK: _init_substr_lang
-    def _init_substr_lang(
-        self,
-        texts: List[str],
-        lang_section_type: LangSectionType,
-    ) -> List[SubString]:
-        substrings = []
-
-        substring_index = 0
-        for text in texts:
-            length = len(text)
-            if text in self.punctuation:
-                substrings.append(
-                    SubString(
-                        is_punctuation=True,
-                        is_digit=False,
-                        lang="punctuation",
-                        text=text,
-                        length=length,
-                        index=substring_index,
-                    )
-                )
-            elif text.strip().isdigit():
-                substrings.append(
-                    SubString(
-                        is_punctuation=False,
-                        is_digit=True,
-                        lang="digit",
-                        text=text,
-                        length=length,
-                        index=substring_index,
-                    )
-                )
-            else:
-                cur_lang = detect_lang_combined(
-                    text, lang_section_type=lang_section_type
-                )
-                cur_lang = self.lang_map.get(cur_lang, self.default_lang)
-                substrings.append(
-                    SubString(
-                        is_digit=False,
-                        is_punctuation=False,
-                        lang=cur_lang,
-                        text=text,
-                        length=length,
-                        index=substring_index,
-                    )
-                )
+        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
+        lang_text_list = self._merge_substrings(lang_text_list)
+        lang_text_list = self._fill_unknown_language(lang_text_list)
+        lang_text_list = self._merge_side_substr_to_near(lang_text_list)
+        lang_text_list = self._merge_substrings(lang_text_list)
+        lang_text_list = self._get_languages(
+            lang_text_list=lang_text_list,
+            lang_section_type=lang_section_type,
+            lang_map=ZH_JA_LANG_MAP
+            if lang_section_type is LangSectionType.ZH_JA
+            else NO_ZH_JA_LANG_MAP,
+        )
+        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
+        lang_text_list = self._merge_substrings(lang_text_list)
 
-            substring_index += length
-        return substrings
+        return lang_text_list
 
     def _is_merge_middle_to_two_side(
         self, left: SubString, middle: SubString, right: SubString
@@ -533,7 +525,7 @@ def _get_nearest_lang_with_direction(
                 if (
                     left_i_index >= 0
                     and substrings[left_i_index].lang != "x"
-                    and substrings[left_i_index].is_digit is False
+                    and substrings[left_i_index].lang != "digit"
                 ):
                     return substrings[left_i_index].lang
         else:
@@ -542,7 +534,7 @@ def _get_nearest_lang_with_direction(
                 if (
                     right_i_index < len(substrings)
                     and substrings[right_i_index].lang != "x"
-                    and substrings[right_i_index].is_digit is False
+                    and substrings[right_i_index].lang != "digit"
                 ):
                     return substrings[right_i_index].lang
         return substrings[index].lang
@@ -605,24 +597,6 @@ def _merge_digit(
         new_substrings = self._merge_substrings(substrings=substrings)
         return new_substrings
 
-    def _merge_substrings_across_newline(
-        self,
-        substrings: List[SubString],
-    ) -> List[SubString]:
-        new_substrings: List[SubString] = []
-        last_lang = ""
-        for index in range(len(substrings)):
-            if (
-                last_lang == substrings[index].lang
-                or substrings[index].lang == "newline"
-            ):
-                new_substrings[-1].text += substrings[index].text
-                new_substrings[-1].length += substrings[index].length
-            else:
-                new_substrings.append(substrings[index])
-                last_lang = substrings[index].lang
-        return new_substrings
-
     # MARK: _special_merge_for_zh_ja
 
     def _special_merge_for_zh_ja(
@@ -633,10 +607,16 @@ def _special_merge_for_zh_ja(
 
         if len(substrings) == 1:
             return substrings
-        # TODO: 如果遇到两边的语言相同，即 ABA，且两边的 A 的长度合计加起来大于中间的 B 的长度的10倍，则合并
-
+        # NOTE: 统计每个语言的字符串长度
+        substring_text_len_by_lang = {
+            "zh": 0,
+            "ja": 0,
+            "x": 0,
+            "punctuation": 0,
+        }
         for index in range(len(substrings)):
             current_block = substrings[index]
+            substring_text_len_by_lang[current_block.lang] += current_block.length
             if index == 0:
                 if (
                     substrings[index + 1].lang in ["zh", "ja"]
@@ -689,44 +669,200 @@ def _special_merge_for_zh_ja(
                     index += 1
                 else:
                     new_substrings.append(substrings[index])
+        # NOTE: 如果 substring_count 中 存在 x，则将 x 设置为最多的 lang
+        if substring_text_len_by_lang["x"] > 0:
+            max_lang = max(
+                substring_text_len_by_lang, key=substring_text_len_by_lang.get
+            )
+            for index, substr in enumerate(new_substrings):
+                if substr.lang == "x":
+                    new_substrings[index].lang = max_lang
+        # NOTE: 如果 ja 数量是 zh 数量的 10 倍以上，则该 zh 设置为 ja
+        if substring_text_len_by_lang["ja"] >= substring_text_len_by_lang["zh"] * 10:
+            for index, substr in enumerate(new_substrings):
+                if substr.lang == "zh":
+                    new_substrings[index].lang = "ja"
         new_substrings = self._merge_substrings(substrings=new_substrings)
         return new_substrings
 
-    # MARK: _merge_substring_across_digit
-    def _merge_substring_across_digit(
+    def _merge_substrings_across_newline_based_on_sections(
         self,
-        substrings: List[SubString],
-    ) -> List[SubString]:
-        new_substrings: List[SubString] = []
-        last_lang = ""
-
-        for _, substring in enumerate(substrings):
-            if new_substrings:
-                if substring.is_digit:
-                    if new_substrings[-1].is_digit:
-                        new_substrings[-1].text += substring.text
-                        new_substrings[-1].length += substring.length
+        sections: List[SubStringSection],
+    ) -> List[SubStringSection]:
+        new_sections: List[SubStringSection] = [sections[0]]
+        # NOTE: 将 sections 中的 newline 合并到临近的非 punctuation 的 section
+        for index, _ in enumerate(sections):
+            if index == 0:
+                continue
+            if index >= len(sections):
+                break
+
+            prev_section = new_sections[-1]
+            current_section = sections[index]
+            if (
+                current_section.lang_section_type != LangSectionType.PUNCTUATION
+                and prev_section.lang_section_type == LangSectionType.NEWLINE
+            ):
+                # NOTE: 如果前一个 section 是 newline，则合并
+                prev_section.lang_section_type = current_section.lang_section_type
+                prev_section.text += current_section.text
+                prev_section.substrings.extend(current_section.substrings)
+                for index, substr in enumerate(prev_section.substrings):
+                    if index == 0:
+                        continue
                     else:
-                        new_substrings[-1].text += substring.text
-                        new_substrings[-1].length += substring.length
-                else:
-                    if substring.lang == last_lang or last_lang == "":
-                        new_substrings[-1].text += substring.text
-                        new_substrings[-1].length += substring.length
-                        new_substrings[-1].lang = (
-                            substring.lang
-                            if new_substrings[-1].lang == "digit"
-                            else new_substrings[-1].lang
+                        substr.index = (
+                            new_sections[-1].substrings[index - 1].index
+                            + new_sections[-1].substrings[index - 1].length
                         )
+
+            elif (
+                current_section.lang_section_type == LangSectionType.NEWLINE
+                and prev_section.lang_section_type != LangSectionType.PUNCTUATION
+            ):
+                # NOTE: 如果前一个 section 不是 punctuation，则合并
+                prev_section.text += current_section.text
+                prev_section.substrings.extend(current_section.substrings)
+                prev_section.substrings[-1].index = (
+                    prev_section.substrings[-2].index
+                    + prev_section.substrings[-2].length
+                )
+            else:
+                new_sections.append(current_section)
+        # NOTE: 将相同类型的 section 合并
+        new_sections_merged: List[SubStringSection] = [new_sections[0]]
+        for index, _ in enumerate(new_sections):
+            if index == 0:
+                continue
+            if (
+                new_sections_merged[-1].lang_section_type
+                == new_sections[index].lang_section_type
+            ):
+                new_sections_merged[-1].text += new_sections[index].text
+                new_sections_merged[-1].substrings.extend(
+                    new_sections[index].substrings
+                )
+            else:
+                new_sections_merged.append(new_sections[index])
+        # NOTE: 重新计算 index
+        for section_index, section in enumerate(new_sections_merged):
+            if section_index == 0:
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        continue
                     else:
-                        new_substrings.append(substring)
-                    last_lang = substring.lang
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
             else:
-                new_substrings.append(substring)
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        substr.index = (
+                            new_sections_merged[section_index - 1].substrings[-1].index
+                            + new_sections_merged[section_index - 1]
+                            .substrings[-1]
+                            .length
+                        )
+                    else:
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
+        if self.debug:
+            logger.debug(
+                "---------------------------------after_merge_newline_sections:"
+            )
+            for section in new_sections_merged:
+                logger.debug(section)
+        return new_sections_merged
 
-        return new_substrings
+    # MARK: _merge_substrings_across_digit_based_on_sections
+    def _merge_substrings_across_digit_based_on_sections(
+        self,
+        sections: List[SubStringSection],
+    ) -> List[SubStringSection]:
+        new_sections: List[SubStringSection] = [sections[0]]
+        # NOTE: 将 sections 中的 digit 合并到临近的非 digit 的 section
+        for index, _ in enumerate(sections):
+            if index == 0:
+                continue
+            if index >= len(sections):
+                break
+
+            prev_section = new_sections[-1]
+            current_section = sections[index]
+            # 如果前一个 section 和当前的 section 类型不同，则合并
+            if prev_section.lang_section_type != current_section.lang_section_type:
+                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)
+                    for index, substr in enumerate(prev_section.substrings):
+                        if index == 0:
+                            continue
+                        else:
+                            substr.index = (
+                                new_sections[-1].substrings[index - 1].index
+                                + new_sections[-1].substrings[index - 1].length
+                            )
+                elif current_section.lang_section_type == LangSectionType.DIGIT:
+                    prev_section.text += current_section.text
+                    prev_section.substrings.extend(current_section.substrings)
+                    prev_section.substrings[-1].index = (
+                        prev_section.substrings[-2].index
+                        + prev_section.substrings[-2].length
+                    )
+                else:
+                    new_sections.append(current_section)
+            else:
+                new_sections.append(current_section)
+        # NOTE: 将相同类型的 section 合并
+        new_sections_merged: List[SubStringSection] = [new_sections[0]]
+        for index, _ in enumerate(new_sections):
+            if index == 0:
+                continue
+            if (
+                new_sections_merged[-1].lang_section_type
+                == new_sections[index].lang_section_type
+            ):
+                new_sections_merged[-1].text += new_sections[index].text
+                new_sections_merged[-1].substrings.extend(
+                    new_sections[index].substrings
+                )
+            else:
+                new_sections_merged.append(new_sections[index])
+        # NOTE: 重新计算 index
+        for section_index, section in enumerate(new_sections_merged):
+            if section_index == 0:
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        continue
+                    else:
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
+            else:
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        substr.index = (
+                            new_sections_merged[section_index - 1].substrings[-1].index
+                            + new_sections_merged[section_index - 1]
+                            .substrings[-1]
+                            .length
+                        )
+                    else:
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
+        if self.debug:
+            logger.debug("---------------------------------after_merge_digit_sections:")
+            for section in new_sections_merged:
+                logger.debug(section)
+        return new_sections_merged
 
-    # MARK: _merge_substrings_across_punctuation
     def _merge_substrings_across_punctuation(
         self,
         substrings: List[SubString],
@@ -735,7 +871,7 @@ def _merge_substrings_across_punctuation(
         lang = ""
         for substring in substrings:
             if (
-                substring.is_punctuation
+                substring.lang == "punctuation"
                 and substring.text.strip() not in self.not_merge_punctuation
             ):
                 if new_substrings and new_substrings[-1].lang == lang:
@@ -752,11 +888,158 @@ def _merge_substrings_across_punctuation(
             lang = substring.lang if substring.lang != "punctuation" else lang
         return new_substrings
 
+    # MARK: _merge_substrings_across_punctuation based on sections
+    def _merge_substrings_across_punctuation_based_on_sections(
+        self,
+        sections: List[SubStringSection],
+    ) -> List[SubStringSection]:
+        new_sections: List[SubStringSection] = [sections[0]]
+        # NOTE: 将 sections 中的 punctuation 合并到临近的非 punctuation 的 section
+        for index, _ in enumerate(sections):
+            if index == 0:
+                continue
+            # 检查当前 section 和前一个 section 是否可以合并
+            if index >= len(sections):
+                break
+
+            prev_section = new_sections[-1]
+            current_section = sections[index]
+            # 如果前一个 section 和当前的 section 类型不同，且其中一个是 punctuation，则合并
+            if current_section.lang_section_type != prev_section.lang_section_type:
+                # 如果前一个 section 是 punctuation，且第一个元素不是 not_merge_punctuation，则合并
+                if (
+                    prev_section.lang_section_type == LangSectionType.PUNCTUATION
+                    and prev_section.substrings[0].text
+                    not in self.not_merge_punctuation
+                ):
+                    # 将前一个 punctuation section 和当前的 section 合并
+                    prev_section.text += current_section.text
+                    prev_section.lang_section_type = current_section.lang_section_type
+                    prev_section.substrings.extend(current_section.substrings)
+                    for index, substr in enumerate(prev_section.substrings):
+                        if index == 0:
+                            # 第一个元素是前一个 punctuation section 的最后一个元素，不需要修改
+                            continue
+                        else:
+                            # 其他元素是当前 section 的元素，需要修改 index
+                            substr.index = (
+                                new_sections[-1].substrings[index - 1].index
+                                + new_sections[-1].substrings[index - 1].length
+                            )
+                # 如果当前 section 是 punctuation，且第一个元素不是 not_merge_punctuation，则合并
+                elif (
+                    current_section.lang_section_type == LangSectionType.PUNCTUATION
+                    and current_section.substrings[0].text
+                    not in self.not_merge_punctuation
+                ):
+                    # 将当前的 punctuation section 和前一个 section 合并
+
+                    prev_section.text += current_section.text
+                    prev_section.substrings.extend(current_section.substrings)
+                    prev_section.substrings[-1].index = (
+                        prev_section.substrings[-2].index
+                        + prev_section.substrings[-2].length
+                    )
+                # 如果当前 section 是 punctuation，且第一个元素是 not_merge_punctuation，则不合并
+                else:
+                    new_sections.append(current_section)
+            else:
+                new_sections.append(current_section)
+
+        # NOTE: 将相同类型的 section 合并
+        new_sections_merged: List[SubStringSection] = [new_sections[0]]
+        for index, _ in enumerate(new_sections):
+            if index == 0:
+                continue
+            if (
+                new_sections_merged[-1].lang_section_type
+                == new_sections[index].lang_section_type
+            ):
+                new_sections_merged[-1].text += new_sections[index].text
+                new_sections_merged[-1].substrings.extend(
+                    new_sections[index].substrings
+                )
+            else:
+                new_sections_merged.append(new_sections[index])
+        # NOTE: 重新计算 index
+        for section_index, section in enumerate(new_sections_merged):
+            if section_index == 0:
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        continue
+                    else:
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
+            else:
+                for substr_index, substr in enumerate(section.substrings):
+                    if substr_index == 0:
+                        substr.index = (
+                            new_sections_merged[section_index - 1].substrings[-1].index
+                            + new_sections_merged[section_index - 1]
+                            .substrings[-1]
+                            .length
+                        )
+                    else:
+                        substr.index = (
+                            section.substrings[substr_index - 1].index
+                            + section.substrings[substr_index - 1].length
+                        )
+        # NOTE: 再次合并 sections 中的 substrings 里面的 text
+        for section in new_sections_merged:
+            if section.lang_section_type == LangSectionType.ZH_JA:
+                section.substrings = self._special_merge_for_zh_ja(section.substrings)
+            section.substrings = self._merge_substrings_across_punctuation(
+                section.substrings
+            )
+        if self.debug:
+            logger.debug(
+                "---------------------------------after_merge_punctuation_sections:"
+            )
+            for section in new_sections_merged:
+                logger.debug(section)
+        return new_sections_merged
+
+    # MARK: _init_substr_lang
+    def _init_substr_lang(
+        self,
+        texts: List[str],
+        lang_section_type: LangSectionType,
+        lang_map: Dict[str, str] = None,
+    ) -> List[SubString]:
+        substrings: List[SubString] = []
+        substring_index = 0
+        lang_map = self.lang_map if lang_map is None else lang_map
+        if self.debug:
+            logger.debug("---------lang_map:")
+            logger.debug(lang_map)
+        for text in texts:
+            length = len(text)
+
+            cur_lang = detect_lang_combined(text, lang_section_type=lang_section_type)
+            cur_lang = lang_map.get(cur_lang, self.default_lang)
+            temp_substr = SubString(
+                lang=cur_lang,
+                text=text,
+                length=length,
+                index=substring_index,
+            )
+            if self.debug:
+                logger.debug(
+                    f"---------lang_map: {lang_map}, temp_substr: {temp_substr}"
+                )
+            substrings.append(temp_substr)
+
+            substring_index += length
+        return substrings
+
     # MARK: _get_languages
     def _get_languages(
         self,
         lang_text_list: List[SubString],
         lang_section_type: LangSectionType,
+        lang_map: Dict[str, str] = None,
     ):
         if lang_section_type in [
             LangSectionType.DIGIT,
@@ -765,39 +1048,13 @@ def _get_languages(
         ]:
             return lang_text_list
 
+        if lang_map is None:
+            lang_map = self.lang_map
+
         for _, substr in enumerate(lang_text_list):
             cur_lang = detect_lang_combined(
                 text=substr.text, lang_section_type=lang_section_type
             )
-            cur_lang = self.lang_map.get(cur_lang, self.default_lang)
-
-            if cur_lang != "x":
-                substr.lang = cur_lang
-        return lang_text_list
-
-    # MARK: _smart_concat_logic
-    def _smart_concat_logic(
-        self,
-        lang_text_list: List[SubString],
-        lang_section_type: LangSectionType,
-    ):
-        lang_text_list = self._merge_substrings(lang_text_list)
-        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
-        lang_text_list = self._merge_substrings(lang_text_list)
-        lang_text_list = self._get_languages(
-            lang_text_list=lang_text_list,
-            lang_section_type=lang_section_type,
-        )
-        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
-        lang_text_list = self._merge_substrings(lang_text_list)
-        lang_text_list = self._fill_unknown_language(lang_text_list)
-        lang_text_list = self._merge_side_substr_to_near(lang_text_list)
-        lang_text_list = self._merge_substrings(lang_text_list)
-        lang_text_list = self._get_languages(
-            lang_text_list=lang_text_list,
-            lang_section_type=lang_section_type,
-        )
-        lang_text_list = self._merge_middle_substr_to_two_side(lang_text_list)
-        lang_text_list = self._merge_substrings(lang_text_list)
+            cur_lang = lang_map.get(cur_lang, self.default_lang)
 
         return lang_text_list
diff --git a/split_lang/split/utils.py b/split_lang/split/utils.py
index c322dcb..699c5b9 100644
--- a/split_lang/split/utils.py
+++ b/split_lang/split/utils.py
@@ -1,11 +1,12 @@
 import re
 
-PUNCTUATION = r""",.;:!?，。！？；：、·([{<（【《〈「『“‘)]}>）】》〉」』”’"-_——#$%&……￥'*+<=>?@[\]^_`{|}~"""
+PUNCTUATION = r"""〜~,.;:!?，。！？；：、·([{<（【《〈「『“‘)]}>）】》〉」』”’"-_——#$%&……￥'*+<=>?@[\]^_`{|}~"""
 
 chinese_char_pattern = re.compile(r"[\u4e00-\u9fff]")
 hangul_pattern = re.compile(r"[\uac00-\ud7af]")
-hiragana_katakana_pattern = re.compile(r"[\u3040-\u30ff]")
-zh_ja_pattern = re.compile(r"[\u4e00-\u9fff\u3040-\u30ff]")
+hiragana_katakana_pattern = re.compile(r"[\u3040-\u30ff々]")  # 添加了对“々”符号的判断
+
+zh_ja_pattern = re.compile(r"[\u4e00-\u9fff\u3040-\u30ff々]")
 
 
 def contains_chinese_char(text: str) -> bool:
@@ -16,7 +17,7 @@ def contains_hangul(text: str) -> bool:
     return bool(hangul_pattern.search(text))
 
 
-def contains_ja(text: str) -> bool:
+def contains_ja_kana(text: str) -> bool:
     return bool(hiragana_katakana_pattern.search(text))
 
 


Test patch:
diff --git a/tests/data/correct_split.txt b/tests/data/correct_split.txt
index cdd899e..76f7320 100644
--- a/tests/data/correct_split.txt
+++ b/tests/data/correct_split.txt
@@ -27,4 +27,10 @@ Vielen Dank |merci beaucoup |for your help|.
 Ich bin müde |je suis fatigué |and I need some rest|.
 Ich mag dieses Buch |ce livre est intéressant |and it has a great story|.
 Ich mag dieses Buch|, |ce livre est intéressant|, |and it has a great story|.
-入学早々隣のクラスの絵奈は男子からの人気者。新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。絵奈も私もかずくんと呼んでいる。かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。かずくんとは絵奈より私の方が話が合うことが多かった。小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。迎えた入学式後の初登校日。「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。絵奈には「いってらっしゃい」だけ。（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）「ほら、早く行くよ。ママ、いってきます♪」私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。そそくさと出てしまう絵奈。「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」そう言って、私も絵奈の後を急いで追う。外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。「かずく〜ん！！おはよー！！」私の大声に気づいたかずくんは走ってきた。「よぉ！！絵奈と残念な方の妹！（笑）」（こいつ…面白がってやがるな…）絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。「かずくん、残念な方の妹って何？」絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」（怒りの矛先が私に向き始めたな…）絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。先生が来て、授業が始まる。勉強は嫌いだ…（今日の給食なんだっけかなぁ〜）なんて授業に集中していないと見事に先生に当てられているのに気づかない。隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」先生は不機嫌そうに言う。（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…
\ No newline at end of file
+The shirt is |9.15 |dollars|.
+The shirt is |233 |dollars|.
+lang|-|split
+I have |10|, |€
+日本のメディアでは|「|匿名掲示板|」|であると紹介されることが多いが|、|2003年1月7日から全書き込みについて|IP|アドレスの記録・保存を始めており|、|厳密には匿名掲示板ではなくなっていると|CNET Japan|は報じている
+日本語|（|にほんご|、|にっぽんご|）|は|、|日本国内や|、|かつての日本領だった国|、|そして国外移民や移住者を含む日本人同士の間で使用されている言語|。|日本は法令によって公用語を規定していないが|、|法令その他の公用文は全て日本語で記述され|、|各種法令において日本語を用いることが規定され|、|学校教育においては「国語」の教科として学習を行うなど|、|事実上日本国内において唯一の公用語となっている|。
+日语是日本通用语及事实上的官方语言|。|没有精确的日语使用人口的统计|，|如果计算日本人口以及居住在日本以外的日本人|、|日侨和日裔|，|日语使用者应超过一亿三千万人|。
\ No newline at end of file
diff --git a/tests/data/novel_1.txt b/tests/data/novel_1.txt
new file mode 100644
index 0000000..f103b41
--- /dev/null
+++ b/tests/data/novel_1.txt
@@ -0,0 +1,108 @@
+入学早々隣のクラスの絵奈は男子からの人気者。
+
+新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。
+
+絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。
+
+絵奈も私もかずくんと呼んでいる。
+
+かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。
+
+何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。
+
+かずくんとは絵奈より私の方が話が合うことが多かった。
+
+小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。
+
+迎えた入学式後の初登校日。
+
+「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。
+
+絵奈には「いってらっしゃい」だけ。
+
+（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）
+
+「ほら、早く行くよ。ママ、いってきます♪」
+私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。
+
+そそくさと出てしまう絵奈。
+
+「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」
+
+そう言って、私も絵奈の後を急いで追う。
+
+外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。
+
+「かずく〜ん！！おはよー！！」
+
+私の大声に気づいたかずくんは走ってきた。
+
+「よぉ！！絵奈と残念な方の妹！（笑）」
+
+（こいつ…面白がってやがるな…）
+
+絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…
+
+そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…
+
+うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。
+
+「かずくん、残念な方の妹って何？」
+
+絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。
+
+「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」
+
+「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」
+
+絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…
+
+３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。
+
+「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」
+
+「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」
+
+（怒りの矛先が私に向き始めたな…）
+
+絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。
+
+私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。
+
+怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…
+
+「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」
+
+一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。
+
+「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。
+
+先生が来て、授業が始まる。
+
+勉強は嫌いだ…
+
+（今日の給食なんだっけかなぁ〜）
+
+なんて授業に集中していないと見事に先生に当てられているのに気づかない。
+
+隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。
+
+（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）
+
+机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。
+
+「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…
+
+「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」
+
+先生は不機嫌そうに言う。
+
+（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。
+
+「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」
+
+かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。
+
+（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。
+
+そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…
\ No newline at end of file
diff --git a/tests/data/test_data.py b/tests/data/test_data.py
index f51bb72..a069ec1 100644
--- a/tests/data/test_data.py
+++ b/tests/data/test_data.py
@@ -60,115 +60,4 @@
 123.
 abc
 233""",
-    """入学早々隣のクラスの絵奈は男子からの人気者。
-
-新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。
-
-絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。
-
-絵奈も私もかずくんと呼んでいる。
-
-かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。
-
-何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。
-
-かずくんとは絵奈より私の方が話が合うことが多かった。
-
-小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。
-
-迎えた入学式後の初登校日。
-
-「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。
-
-絵奈には「いってらっしゃい」だけ。
-
-（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）
-
-「ほら、早く行くよ。ママ、いってきます♪」
-私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。
-
-そそくさと出てしまう絵奈。
-
-「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」
-
-そう言って、私も絵奈の後を急いで追う。
-
-外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。
-
-「かずく〜ん！！おはよー！！」
-
-私の大声に気づいたかずくんは走ってきた。
-
-「よぉ！！絵奈と残念な方の妹！（笑）」
-
-（こいつ…面白がってやがるな…）
-
-絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…
-
-そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…
-
-うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。
-
-「かずくん、残念な方の妹って何？」
-
-絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。
-
-「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」
-
-「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」
-
-絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…
-
-３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。
-
-「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」
-
-「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」
-
-（怒りの矛先が私に向き始めたな…）
-
-絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。
-
-私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。
-
-怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…
-
-「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」
-
-一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。
-
-「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。
-
-先生が来て、授業が始まる。
-
-勉強は嫌いだ…
-
-（今日の給食なんだっけかなぁ〜）
-
-なんて授業に集中していないと見事に先生に当てられているのに気づかない。
-
-隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。
-
-（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）
-
-机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。
-
-「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…
-
-「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」
-
-先生は不機嫌そうに言う。
-
-（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。
-
-「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」
-
-かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。
-
-（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。
-
-そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…""",
-    """絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…
-
-３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。""",
 ]
diff --git a/tests/split_acc.py b/tests/split_acc.py
index 5251258..1051f44 100644
--- a/tests/split_acc.py
+++ b/tests/split_acc.py
@@ -3,10 +3,7 @@
 
 from split_lang.config import DEFAULT_LANG
 from split_lang.model import LangSectionType
-from split_lang.split.splitter import (
-    SubString,
-    LangSplitter,
-)
+from split_lang.split.splitter import LangSplitter, SubString
 from split_lang.split.utils import PUNCTUATION
 from tests.test_config import TEST_DATA_FOLDER
 
@@ -60,8 +57,7 @@ def get_corrected_split_result(
 
 
 def simple_test(splitter: LangSplitter, debug: bool = False):
-
-    text_file_name = "correct_split_merge_punc.txt"
+    text_file_name = "correct_split.txt"
     correct_split = get_corrected_split_result(
         splitter=splitter, text_file_path=f"{TEST_DATA_FOLDER}/{text_file_name}"
     )
diff --git a/tests/test_split.py b/tests/test_split.py
index e5543e9..bb3edf7 100644
--- a/tests/test_split.py
+++ b/tests/test_split.py
@@ -1,49 +1,176 @@
-from split_lang import split
-from split_lang.split.model import LangSectionType
-from tests.data.generate_test_json import texts_de_fr_en, texts_zh_jp_ko_en
+import logging
 
+from split_lang import LangSplitter
 
 texts = [
     "你喜欢看アニメ吗？",
     "衬衫的价格是9.15便士",
+    """。3入学早々隣のクラスの絵奈は男子からの人気者。
+
+新入生代表の挨拶も絵奈だったから目立ってしまって余計にあの子誰？ってなった。
+
+絵奈と私には近所に住む幼稚園の頃から仲の良い幼なじみの澤村　和樹（さわむら　かずき）という同じ中学の同級生でもある男子生徒がいる。
+
+絵奈も私もかずくんと呼んでいる。
+
+かずくんは小学１年生の頃からサッカーをやっていて、高学年になる頃には県の選抜に選ばれたりと、丸山台中の新入生では期待の星。
+
+何でユースとかにいかないで、公立の中学校でサッカー部なのかはわからない。
+
+かずくんとは絵奈より私の方が話が合うことが多かった。
+
+小学生の頃もよく３人で遊んだりもしたし、中学生になってからも３人で朝一緒に行こうなんて約束していた。
+
+迎えた入学式後の初登校日。
+
+「忘れ物とかない？気を付けて行くんだよ。急がなくても充分間に合うからね。」私にだけそう言ったママ。
+
+絵奈には「いってらっしゃい」だけ。
+
+（二人とも一緒に行くのに、私だけ落ち着きないみたいに思われてる…？）
+
+「ほら、早く行くよ。ママ、いってきます♪」
+私の横で姉の絵奈が私に向かってそう言うと、ママには笑顔で挨拶をしていた。
+
+そそくさと出てしまう絵奈。
+
+「ちょ、ちょっと（汗）充分間に合うからねってママ言ってるじゃん（汗）んじゃいってきま〜す！」
+
+そう言って、私も絵奈の後を急いで追う。
+
+外に出るとかずくんがちょっと遠くから歩いてきているのが見えたので、私は大声で手を振って呼んだ。
+
+「かずく〜ん！！おはよー！！」
+
+私の大声に気づいたかずくんは走ってきた。
+
+「よぉ！！絵奈と残念な方の妹！（笑）」
+
+（こいつ…面白がってやがるな…）
+
+絵奈が新入生代表で目立ってしまって、私は自分のクラスで残念な方の妹だと、昨日、ふざけた男子に言われたのだ…
+
+そしてかずくんと私は同じクラスなのでそれを面白がって言ってきたのだろう…
+
+うるせぇーよって言ってやろうと思ったら、私より先に絵奈が口を開いた。
+
+「かずくん、残念な方の妹って何？」
+
+絵奈に聞かれるとちょっとバツが悪そうなかずくんが渋々答える。
+
+「いや、その、実は俺達のクラスで、ふざけて紗羅が残念な方の妹って男子にからかわれてたんだよ（汗）」
+
+「は？で、かずくんも面白がって、そんなこと言ってるわけ？くだらないことやめなよ。そういう時は普通、助ける男がカッコいいんでしょ。一緒になって紗羅が気にしてないからって最悪だよ。」
+
+絵奈はどちらかと言うと温厚で優しいタイプなのに少し怒っているように言ったので、かずくんはしょんぼり、私も珍しく絵奈が怒っているので少しびっくりした…
+
+３人でちょっと気まずくなって歩くのに耐えられない私が絵奈に言った。
+
+「まぁまぁ、そんなツンケンしないでさ（汗）絵奈らしくないよ？かずくんも悪気があって言ったわけじゃないんだし、許してあげなよ（笑）」
+
+「私らしいって何？紗羅は悔しくないの？残念な方の妹とか言われて。そもそも紗羅がそんなお気楽な感じだから駄目なんでしょ（怒）私は紗羅が悪口言われてたら自分のことのように面白くないよ（怒）」
+
+（怒りの矛先が私に向き始めたな…）
+
+絵奈は温厚で優しく優等生タイプだけど、怒るとちょっと面倒くさいタイプ…何日も根に持つし、頑固なところもある。
+
+私は対照的でカッとなっても、１日経てばそんなこと忘れてるし、あんまり根に持つこともない。頑固な所は同じかもしれないけど。
+
+怒り出すと絵奈をなだめるのは結構大変…普段あんまり怒らないタイプだから、かもしれないけど…
+
+「そのさ、絵奈は私と違っておとなしめな品のあるタイプなんだから、あんまりカッカしてるとイメージ崩れるよ？なんちゃって（笑）かずくんも少しびっくりしてるでしょ（汗）ほらほら、せっかく入学して登校初日なのに空気悪いのおしまいにして楽しく行こうよ♪（笑）」
+
+一応、私がそう言うとカッカしてた絵奈も機嫌を少し直してくれて、かずくんもごめんって謝って一件落着し、その後は仲良く登校し中学校へ無事に到着。
+
+「んじゃまた帰りね〜♪」そう言って、絵奈とは別々の教室へ。私はかずくんと同じクラスへ入る。
+
+先生が来て、授業が始まる。
+
+勉強は嫌いだ…
+
+（今日の給食なんだっけかなぁ〜）
+
+なんて授業に集中していないと見事に先生に当てられているのに気づかない。
+
+隣の席のかずくんが小さな声で「おーい。紗羅。おーい」って言っているのに気づく。
+
+（ん？何？教科書忘れたのかこいつは本当にサッカーしかできない奴だからなぁ。しょうがないなぁ）
+
+机をくっつけて教科書を見せてやろうとするとかずくんはオドオドする。
+
+「ちげーよ（汗）紗羅（汗）」また小さな声でかずくんが言った後には怒った先生が私の目の前にいた…
+
+「山本、お前何やってんだ？あくびしたり、外をボケーっと見てたり。同じ山本のお前の姉とは大違いだな。」
+
+先生は不機嫌そうに言う。
+
+（すいませんね〜絵奈だったら、ちゃんと授業聞いてるんでしょうね〜私は残念な方の妹なので（笑））なんて怒られているはずなのに思っていると、朝、絵奈から怒られたからか、かずくんが私を庇った。
+
+「その、先生。絵奈は絵奈。紗羅は紗羅ですよ。」
+
+かずくんの言葉に先生もちょっと悪いと思ったのか、ブツブツ言いながら戻っていき、私がボケーっとしていたことは流されて終わった。
+
+（おぉーかずくんが助けてくれた（笑）もしかして、絵奈に朝怒られたから？もしかして、かずくんも昔から絵奈のことが…いや、考えるのはやめよう。私達３人は幼馴染。変に関係がおかしくなるのも嫌だし。）なんてふと思った。
+
+そして、この先、私達３人の関係は壊れていくことにこの時は気づかなかった…""",
 ]
 
+lang_splitter = LangSplitter(log_level=logging.DEBUG)
 
-def test_split():
+
+def test_split_step_by_step():
     for text in texts:
-        substr_sections = split(
+        pre_split_sections = lang_splitter.pre_split(
             text=text,
-            verbose=True,
         )
-        for index, section in enumerate(substr_sections):
-            print(f"{index}:{section.text}")
-            if section.lang_section_type is LangSectionType.PUNCTUATION:
-                print(f"\t|——punctuation:{section.text}")
-                continue
-            for _, substr in enumerate(section.substrings):
-                print(f"\t|——{substr.lang}:{substr.text}")
-        print("----------------------")
-
-    # for text in texts_de_fr_en:
-    #     substr_sections = split(
-    #         text=text,
-    #         verbose=True,
-    #         # lang_map=new_lang_map,
-    #         threshold=4.9e-4,
-    #         default_lang="en",
-    #     )
-    #     for index, section in enumerate(substr_sections):
-    #         print(f"{index}:{section.text}")
-    #         if section.is_punctuation:
-    #             print(f"\t|——punctuation:{section.text}")
-    #             continue
-    #         for _, substr in enumerate(section.substrings):
-    #             print(f"\t|——{substr.lang}:{substr.text}")
-    #     print("----------------------")
+        # for section in pre_split_sections:
+        #     print(section)
+
+        split_sections = lang_splitter._split(
+            pre_split_section=pre_split_sections,
+        )
+
+        # for section in split_sections:
+        #     print(section)
+
+        after_merge_punctuation_sections = (
+            lang_splitter._merge_substrings_across_punctuation_based_on_sections(
+                sections=split_sections,
+            )
+        )
+        # for section in after_merge_punctuation_sections:
+        #     print(section)
+        after_merge_digit_sections = (
+            lang_splitter._merge_substrings_across_digit_based_on_sections(
+                sections=after_merge_punctuation_sections,
+            )
+        )
+
+        # for section in after_merge_digit_sections:
+        #     print(section)
+
+        after_merge_newline_sections = (
+            lang_splitter._merge_substrings_across_newline_based_on_sections(
+                sections=after_merge_digit_sections,
+            )
+        )
+        # for section in after_merge_newline_sections:
+        #     print(section)
+
+
+def test_split():
+    print("===========test_split===========")
+    lang_splitter.merge_across_punctuation = True
+    lang_splitter.not_merge_punctuation = ["。"]
+    for text in texts:
+        substrings = lang_splitter.split_by_lang(text=text)
+        for substr in substrings:
+            print(substr)
 
 
 def main():
-    test_split()
+    test_split_step_by_step()
+    # test_split()
     pass